diff --git a/cypress/e2e/files/FilesUtils.ts b/cypress/e2e/files/FilesUtils.ts index 0bad38693ae..0b664434e39 100644 --- a/cypress/e2e/files/FilesUtils.ts +++ b/cypress/e2e/files/FilesUtils.ts @@ -30,3 +30,85 @@ export const triggerActionForFile = (filename: string, actionId: string) => { getActionButtonForFile(filename).click() cy.get(`[data-cy-files-list-row-action="${CSS.escape(actionId)}"] > button`).should('exist').click() } + +export const moveFile = (fileName: string, dirPath: string) => { + getRowForFile(fileName).should('be.visible') + triggerActionForFile(fileName, 'move-copy') + + cy.get('.file-picker').within(() => { + // intercept the copy so we can wait for it + cy.intercept('MOVE', /\/remote.php\/dav\/files\//).as('moveFile') + + if (dirPath === '/') { + // select home folder + cy.get('button[title="Home"]').should('be.visible').click() + // click move + cy.contains('button', 'Move').should('be.visible').click() + } else if (dirPath === '.') { + // click move + cy.contains('button', 'Copy').should('be.visible').click() + } else { + const directories = dirPath.split('/') + directories.forEach((directory) => { + // select the folder + cy.get(`[data-filename="${directory}"]`).should('be.visible').click() + }) + + // click move + cy.contains('button', `Move to ${directories.at(-1)}`).should('be.visible').click() + } + + cy.wait('@moveFile') + }) +} + +export const copyFile = (fileName: string, dirPath: string) => { + getRowForFile(fileName).should('be.visible') + triggerActionForFile(fileName, 'move-copy') + + cy.get('.file-picker').within(() => { + // intercept the copy so we can wait for it + cy.intercept('COPY', /\/remote.php\/dav\/files\//).as('copyFile') + + if (dirPath === '/') { + // select home folder + cy.get('button[title="Home"]').should('be.visible').click() + // click copy + cy.contains('button', 'Copy').should('be.visible').click() + } else if (dirPath === '.') { + // click copy + cy.contains('button', 'Copy').should('be.visible').click() + } else { + const directories = dirPath.split('/') + directories.forEach((directory) => { + // select the folder + cy.get(`[data-filename="${CSS.escape(directory)}"]`).should('be.visible').click() + }) + + // click copy + cy.contains('button', `Copy to ${directories.at(-1)}`).should('be.visible').click() + } + + cy.wait('@copyFile') + }) +} + +export const renameFile = (fileName: string, newFileName: string) => { + getRowForFile(fileName) + triggerActionForFile(fileName, 'rename') + + // intercept the move so we can wait for it + cy.intercept('MOVE', /\/remote.php\/dav\/files\//).as('moveFile') + + getRowForFile(fileName).find('[data-cy-files-list-row-name] input').clear() + getRowForFile(fileName).find('[data-cy-files-list-row-name] input').type(`${newFileName}{enter}`) + + cy.wait('@moveFile') +} + +export const navigateToFolder = (dirPath: string) => { + const directories = dirPath.split('/') + directories.forEach((directory) => { + getRowForFile(directory).should('be.visible').find('[data-cy-files-list-row-name-link]').click() + }) +} diff --git a/cypress/e2e/files/files_copy-move.cy.ts b/cypress/e2e/files/files_copy-move.cy.ts index 6c37807aa73..22f8f765662 100644 --- a/cypress/e2e/files/files_copy-move.cy.ts +++ b/cypress/e2e/files/files_copy-move.cy.ts @@ -20,7 +20,7 @@ * */ -import { getRowForFile, triggerActionForFile } from './FilesUtils.ts' +import { copyFile, getRowForFile, navigateToFolder, triggerActionForFile } from './FilesUtils.ts' describe('Files: Move or copy files', { testIsolation: true }, () => { let currentUser @@ -35,7 +35,6 @@ describe('Files: Move or copy files', { testIsolation: true }, () => { cy.deleteUser(currentUser) }) - it('Can copy a file to new folder', () => { cy.uploadContent(currentUser, new Blob(), 'text/plain', '/original.txt') .mkdir(currentUser, '/new-folder') @@ -163,16 +162,8 @@ describe('Files: Move or copy files', { testIsolation: true }, () => { cy.login(currentUser) cy.visit('/apps/files') - // intercept the copy so we can wait for it - cy.intercept('COPY', /\/remote.php\/dav\/files\//).as('copyFile') + copyFile('original.txt', '.') - getRowForFile('original.txt').should('be.visible') - triggerActionForFile('original.txt', 'move-copy') - - // click copy - cy.get('.file-picker').contains('button', 'Copy').should('be.visible').click() - - cy.wait('@copyFile') getRowForFile('original.txt').should('be.visible') getRowForFile('original (copy).txt').should('be.visible') }) @@ -183,22 +174,14 @@ describe('Files: Move or copy files', { testIsolation: true }, () => { cy.login(currentUser) cy.visit('/apps/files') - // intercept the copy so we can wait for it - cy.intercept('COPY', /\/remote.php\/dav\/files\//).as('copyFile') + copyFile('original.txt', '.') - getRowForFile('original.txt').should('be.visible') - triggerActionForFile('original.txt', 'move-copy') - - // click copy - cy.get('.file-picker').contains('button', 'Copy').should('be.visible').click() - - cy.wait('@copyFile') getRowForFile('original.txt').should('be.visible') getRowForFile('original (copy 2).txt').should('be.visible') }) /** Test for https://github.com/nextcloud/server/issues/43329 */ - context.only('escaping file and folder names', () => { + context('escaping file and folder names', () => { it('Can handle files with special characters', () => { cy.uploadContent(currentUser, new Blob(), 'text/plain', '/original.txt') .mkdir(currentUser, '/can\'t say')