From 99c7c084a291c0311bb6acd4025cc1d644360b6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Mon, 4 Dec 2023 12:19:28 +0100 Subject: [PATCH] Add more cypress tests, as skipped for now because failing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- cypress/e2e/groupfolders.cy.ts | 208 ++++++++++++++++++++++--------- cypress/e2e/groupfoldersUtils.ts | 38 ++++++ 2 files changed, 189 insertions(+), 57 deletions(-) diff --git a/cypress/e2e/groupfolders.cy.ts b/cypress/e2e/groupfolders.cy.ts index c6c62cc5f..1fed11450 100644 --- a/cypress/e2e/groupfolders.cy.ts +++ b/cypress/e2e/groupfolders.cy.ts @@ -25,7 +25,15 @@ import { createGroup, createGroupFolder, deleteGroupFolder, + deleteFile, enableACLPermissions, + enterFolder, + enterFolderInTrashbin, + fileOrFolderExists, + fileOrFolderDoesNotExist, + fileOrFolderExistsInTrashbin, + fileOrFolderDoesNotExistInTrashbin, + restoreFile, setACLPermissions, PERMISSION_DELETE, PERMISSION_READ, @@ -44,7 +52,10 @@ describe('Groupfolders ACLs and trashbin behavior', () => { let groupName: string let groupFolderName: string - before(() => { + beforeEach(() => { + if (groupFolderId) { + deleteGroupFolder(groupFolderId) + } groupName = `test_group_${randHash()}` groupFolderName = `test_group_folder_${randHash()}` @@ -68,102 +79,185 @@ describe('Groupfolders ACLs and trashbin behavior', () => { createGroupFolder(groupFolderName, groupName, [PERMISSION_READ, PERMISSION_WRITE, PERMISSION_DELETE]) .then(_groupFolderId => { groupFolderId = _groupFolderId + enableACLPermissions(groupFolderId) + addACLManagerUser(groupFolderId,managerUser.userId) }) }) }) }) - after(() => { - if (groupFolderId) { - deleteGroupFolder(groupFolderId) - } - }) + it('ACL, delete and restore', () => { + // Create two subfolders and two files as manager + cy.login(managerUser) + cy.mkdir(managerUser, `/${groupFolderName}/subfolder1`) + cy.mkdir(managerUser, `/${groupFolderName}/subfolder1/subfolder2`) + cy.uploadContent(managerUser, new Blob(['Content of the file']), 'text/plain', `/${groupFolderName}/subfolder1/file1.txt`) + cy.uploadContent(managerUser, new Blob(['Content of the file']), 'text/plain', `/${groupFolderName}/subfolder1/subfolder2/file2.txt`) - it('Configure ACL manager', () => { - enableACLPermissions(groupFolderId) - addACLManagerUser(groupFolderId,managerUser.userId) - }) + // Set ACL permissions + setACLPermissions(groupFolderId, '/subfolder1', [`+${PERMISSION_READ}`,`-${PERMISSION_WRITE}`], undefined, user1.userId) + setACLPermissions(groupFolderId, '/subfolder1', [`-${PERMISSION_READ}`], undefined, user2.userId) - it('Visit the group folder as user1', () => { + // User1 has access cy.login(user1) cy.visit('/apps/files') - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${groupFolderName}"]`).should('be.visible') - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${groupFolderName}"]`).click() - }) + enterFolder(groupFolderName) + enterFolder('subfolder1') + fileOrFolderExists('file1.txt') + enterFolder('subfolder2') + fileOrFolderExists('file2.txt') + + // User2 has no access + cy.login(user2) + cy.visit('/apps/files') + enterFolder(groupFolderName) + fileOrFolderDoesNotExist('subfolder1') - it('Create two subfolders and a file as manager', () => { + // Delete files cy.login(managerUser) - cy.mkdir(managerUser, `/${groupFolderName}/subfolder1`) - cy.mkdir(managerUser, `/${groupFolderName}/subfolder1/subfolder2`) - cy.uploadContent(managerUser, new Blob(['Content of the file']), 'text/plain', `/${groupFolderName}/subfolder1/subfolder2/file.txt`) - }) + cy.visit('/apps/files') + enterFolder(groupFolderName) + enterFolder('subfolder1') + deleteFile('file1.txt') + deleteFile('subfolder2') - it('Set ACL permissions', () => { - setACLPermissions(groupFolderId, '/subfolder1', [`+${PERMISSION_READ}`,`-${PERMISSION_WRITE}`], undefined, user1.userId) - setACLPermissions(groupFolderId, '/subfolder1', [`-${PERMISSION_READ}`], undefined, user2.userId) - }) + // User1 sees it in trash + cy.login(user1) + cy.visit('/apps/files/trashbin') + fileOrFolderExistsInTrashbin('file1.txt') + enterFolderInTrashbin('subfolder2') + fileOrFolderExists('file2.txt') + + // User2 does not + cy.login(user2) + cy.visit('/apps/files/trashbin') + fileOrFolderDoesNotExistInTrashbin('file1.txt') + fileOrFolderDoesNotExistInTrashbin('subfolder2') - it('User1 has access', () => { + // Restore files + cy.login(managerUser) + cy.visit('/apps/files/trashbin') + fileOrFolderExistsInTrashbin('file1.txt') + fileOrFolderExistsInTrashbin('subfolder2') + restoreFile('file1.txt') + restoreFile('subfolder2') + + // User1 has access cy.login(user1) cy.visit('/apps/files') - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${groupFolderName}"]`).click() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder1"]`).should('be.visible') - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder1"]`).click() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder2"]`).click() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="file.txt"]`).should('be.visible') - }) + enterFolder(groupFolderName) + fileOrFolderExists('subfolder1') + enterFolder('subfolder1') + fileOrFolderExists('file1.txt') + enterFolder('subfolder2') + fileOrFolderExists('file2.txt') - it('User2 has no access', () => { + // User2 has no access cy.login(user2) cy.visit('/apps/files') - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${groupFolderName}"]`).click() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder1"]`).should('not.exist') + enterFolder(groupFolderName) + fileOrFolderDoesNotExist('subfolder1') }) - it('Delete file.txt', () => { + it.skip('ACL directly on deleted folder', () => { + // Create a subfolders and a file as manager + cy.login(managerUser) + cy.mkdir(managerUser, `/${groupFolderName}/subfolder1`) + cy.uploadContent(managerUser, new Blob(['Content of the file']), 'text/plain', `/${groupFolderName}/subfolder1/file1.txt`) + + // Set ACL permissions on subfolder + setACLPermissions(groupFolderId, '/subfolder1', [`+${PERMISSION_READ}`,`-${PERMISSION_WRITE}`], undefined, user1.userId) + setACLPermissions(groupFolderId, '/subfolder1', [`-${PERMISSION_READ}`], undefined, user2.userId) + + // Delete subfolder cy.login(managerUser) cy.visit('/apps/files') - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${groupFolderName}"]`).click() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder1"]`).click() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder2"]`).click() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="file.txt"] [data-cy-files-list-row-actions]`).click() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-action="delete"]`).scrollIntoView() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-action="delete"]`).click() - }) + enterFolder(groupFolderName) + deleteFile('subfolder1') - it('User1 sees it in trash', () => { + // User1 sees it in trash cy.login(user1) cy.visit('/apps/files/trashbin') - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name^="file.txt.d"]`).should('be.visible') - }) + fileOrFolderExistsInTrashbin('subfolder1') + enterFolderInTrashbin('subfolder1') + fileOrFolderExists('file1.txt') - it('User2 does not', () => { + // User2 does not cy.login(user2) cy.visit('/apps/files/trashbin') - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name^="file.txt.d"]`).should('not.exist') + fileOrFolderDoesNotExistInTrashbin('subfolder1') }) - it('Rename subfolder2', () => { + it.skip('Delete, rename parent and restore', () => { + // Create a subfolders and a file as manager cy.login(managerUser) + cy.mkdir(managerUser, `/${groupFolderName}/subfolder1`) + cy.uploadContent(managerUser, new Blob(['Content of the file']), 'text/plain', `/${groupFolderName}/subfolder1/file1.txt`) + + // Delete file + cy.login(managerUser) + cy.visit('/apps/files') + enterFolder(groupFolderName) + enterFolder('subfolder1') + deleteFile('file1.txt') + + // Rename subfolder1 cy.visit('/apps/files') - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${groupFolderName}"]`).click() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder1"]`).click() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder2"] [data-cy-files-list-row-actions]`).click() + enterFolder(groupFolderName) + cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder1"] [data-cy-files-list-row-actions]`).click() cy.get(`[data-cy-files-list] [data-cy-files-list-row-action="rename"]`).scrollIntoView() cy.get(`[data-cy-files-list] [data-cy-files-list-row-action="rename"]`).click() - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder2"] [class="files-list__row-rename"] [class="input-field__input"]`).type('subfolder2renamed{enter}') - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder2renamed"]`).should('be.visible') + cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder1"] [class="files-list__row-rename"] [class="input-field__input"]`).type('subfolder1renamed{enter}') + fileOrFolderExists('subfolder1renamed') + + // Restore from trash + cy.visit('/apps/files/trashbin') + restoreFile('file1.txt') + + // File should be restored in renamed folder + cy.login(managerUser) + cy.visit('/apps/files') + enterFolder(groupFolderName) + fileOrFolderExists('subfolder1renamed') + fileOrFolderDoesNotExist('file1.txt') + enterFolder('subfolder1renamed') + fileOrFolderExists('file1.txt') }) - it('User1 still sees it in trash', () => { + it.skip('Delete, rename parent and check ACL', () => { + // Create a subfolders and a file as manager + cy.login(managerUser) + cy.mkdir(managerUser, `/${groupFolderName}/subfolder1`) + cy.uploadContent(managerUser, new Blob(['Content of the file']), 'text/plain', `/${groupFolderName}/subfolder1/file1.txt`) + + // Set ACL permissions + setACLPermissions(groupFolderId, '/subfolder1', [`+${PERMISSION_READ}`,`-${PERMISSION_WRITE}`], undefined, user1.userId) + setACLPermissions(groupFolderId, '/subfolder1', [`-${PERMISSION_READ}`], undefined, user2.userId) + + // Delete file + cy.login(managerUser) + cy.visit('/apps/files') + enterFolder(groupFolderName) + enterFolder('subfolder1') + deleteFile('file1.txt') + + // Rename subfolder1 + cy.visit('/apps/files') + enterFolder(groupFolderName) + cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder1"] [data-cy-files-list-row-actions]`).click() + cy.get(`[data-cy-files-list] [data-cy-files-list-row-action="rename"]`).scrollIntoView() + cy.get(`[data-cy-files-list] [data-cy-files-list-row-action="rename"]`).click() + cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="subfolder1"] [class="files-list__row-rename"] [class="input-field__input"]`).type('subfolder1renamed{enter}') + fileOrFolderExists('subfolder1renamed') + + // User1 sees it in trash cy.login(user1) cy.visit('/apps/files/trashbin') - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name^="file.txt.d"]`).should('be.visible') - }) + fileOrFolderExistsInTrashbin('file1.txt') - it('User2 still does not', () => { + // User2 does not cy.login(user2) cy.visit('/apps/files/trashbin') - cy.get(`[data-cy-files-list] [data-cy-files-list-row-name^="file.txt.d"]`).should('not.exist') + fileOrFolderDoesNotExistInTrashbin('file1.txt') }) }) diff --git a/cypress/e2e/groupfoldersUtils.ts b/cypress/e2e/groupfoldersUtils.ts index 4319b1951..42cf61295 100644 --- a/cypress/e2e/groupfoldersUtils.ts +++ b/cypress/e2e/groupfoldersUtils.ts @@ -73,3 +73,41 @@ export function setACLPermissions( export function deleteGroupFolder(groupFolderId: string) { return cy.runOccCommand(`groupfolders:delete ${groupFolderId}`) } + +export function fileOrFolderExists(name: string) { + cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${name}"]`).should('be.visible') +} + +export function fileOrFolderDoesNotExist(name: string) { + // Make sure file list is loaded first + cy.get(`[data-cy-files-list-tfoot],[data-cy-files-content-empty]`).should('be.visible') + cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${name}"]`).should('not.exist') +} + +export function fileOrFolderExistsInTrashbin(name: string) { + cy.get(`[data-cy-files-list] [data-cy-files-list-row-name^="${name}.d"]`).should('be.visible') +} + +export function fileOrFolderDoesNotExistInTrashbin(name: string) { + // Make sure file list is loaded first + cy.get(`[data-cy-files-list-tfoot],[data-cy-files-content-empty]`).should('be.visible') + cy.get(`[data-cy-files-list] [data-cy-files-list-row-name^="${name}.d"]`).should('not.exist') +} + +export function enterFolder(name: string) { + cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${name}"]`).click() +} + +export function enterFolderInTrashbin(name: string) { + cy.get(`[data-cy-files-list] [data-cy-files-list-row-name^="${name}.d"]`).click() +} + +export function deleteFile(name: string) { + cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${name}"] [data-cy-files-list-row-actions]`).click() + cy.get(`[data-cy-files-list] [data-cy-files-list-row-action="delete"]`).scrollIntoView() + cy.get(`[data-cy-files-list] [data-cy-files-list-row-action="delete"]`).click() +} + +export function restoreFile(name: string) { + cy.get(`[data-cy-files-list] [data-cy-files-list-row-name^="${name}.d"] [data-cy-files-list-row-action="restore"]`).click() +}