From 819798f02edc2e5c3fbb5dca7623766038255829 Mon Sep 17 00:00:00 2001 From: Peter Ringelmann Date: Mon, 11 May 2026 13:15:18 +0200 Subject: [PATCH] chore(ci): Make row action helpers atomic to avoid mid-render detachment -e Signed-off-by: Peter Ringelmann --- cypress/e2e/files/FilesUtils.ts | 12 ++++++------ .../e2e/files_sharing/share-status-action.cy.ts | 14 ++++++-------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/cypress/e2e/files/FilesUtils.ts b/cypress/e2e/files/FilesUtils.ts index 9ae1ee31f35..2d7a28ac6d6 100644 --- a/cypress/e2e/files/FilesUtils.ts +++ b/cypress/e2e/files/FilesUtils.ts @@ -10,8 +10,10 @@ const ACTION_COPY_MOVE = 'move-copy' export const getRowForFileId = (fileid: string | number) => cy.get(`[data-cy-files-list-row-fileid="${fileid}"]`) export const getRowForFile = (filename: string) => cy.get(`[data-cy-files-list-row-name="${CSS.escape(filename)}"]`) -export const getActionsForFileId = (fileid: number) => getRowForFileId(fileid).find('[data-cy-files-list-row-actions]') -export const getActionsForFile = (filename: string) => getRowForFile(filename).find('[data-cy-files-list-row-actions]') +// Atomic query so the lookup is retried as a whole when rows re-render +// (chained .find() can fail with "subject no longer attached" mid-render). +export const getActionsForFileId = (fileid: number) => cy.get(`[data-cy-files-list-row-fileid="${fileid}"] [data-cy-files-list-row-actions]`) +export const getActionsForFile = (filename: string) => cy.get(`[data-cy-files-list-row-name="${CSS.escape(filename)}"] [data-cy-files-list-row-actions]`) export const getActionButtonForFileId = (fileid: number) => getActionsForFileId(fileid).findByRole('button', { name: 'Actions' }) export const getActionButtonForFile = (filename: string) => getActionsForFile(filename).findByRole('button', { name: 'Actions' }) @@ -48,8 +50,7 @@ export function getActionEntryForFile(file: string, actionId: string) { * @param actionId */ export function getInlineActionEntryForFileId(fileid: number, actionId: string) { - return getActionsForFileId(fileid) - .find(`[data-cy-files-list-row-action="${CSS.escape(actionId)}"]`) + return cy.get(`[data-cy-files-list-row-fileid="${fileid}"] [data-cy-files-list-row-action="${CSS.escape(actionId)}"]`) } /** @@ -58,8 +59,7 @@ export function getInlineActionEntryForFileId(fileid: number, actionId: string) * @param actionId */ export function getInlineActionEntryForFile(file: string, actionId: string) { - return getActionsForFile(file) - .find(`[data-cy-files-list-row-action="${CSS.escape(actionId)}"]`) + return cy.get(`[data-cy-files-list-row-name="${CSS.escape(file)}"] [data-cy-files-list-row-action="${CSS.escape(actionId)}"]`) } /** diff --git a/cypress/e2e/files_sharing/share-status-action.cy.ts b/cypress/e2e/files_sharing/share-status-action.cy.ts index cfbbc29664b..30a76334b09 100644 --- a/cypress/e2e/files_sharing/share-status-action.cy.ts +++ b/cypress/e2e/files_sharing/share-status-action.cy.ts @@ -4,7 +4,7 @@ */ import type { User } from '@nextcloud/e2e-test-server/cypress' -import { closeSidebar, enableGridMode, getActionButtonForFile, getInlineActionEntryForFile, getRowForFile } from '../files/FilesUtils.ts' +import { closeSidebar, enableGridMode, getActionButtonForFile, getActionsForFile, getInlineActionEntryForFile, getRowForFile } from '../files/FilesUtils.ts' import { createShare } from './FilesSharingUtils.ts' describe('files_sharing: Sharing status action', { testIsolation: true }, () => { @@ -23,9 +23,8 @@ describe('files_sharing: Sharing status action', { testIsolation: true }, () => cy.visit('/apps/files') - getRowForFile('folder') - .should('be.visible') - .find('[data-cy-files-list-row-actions]') + getRowForFile('folder').should('be.visible') + getActionsForFile('folder') .findByRole('button', { name: 'Shared' }) .should('not.exist') }) @@ -38,12 +37,11 @@ describe('files_sharing: Sharing status action', { testIsolation: true }, () => cy.visit('/apps/files') }) - getRowForFile('folder') - .should('be.visible') - .find('[data-cy-files-list-row-actions]') + getRowForFile('folder').should('be.visible') + getActionsForFile('folder') .findByRole('button', { name: /Sharing options/ }) .should('be.visible') - .click() + .click({ force: true }) // check the click opened the sidebar cy.get('[data-cy-sidebar]')