diff --git a/tests/e2e-playwright/specs/navigation/breadcrumb.spec.ts b/tests/e2e-playwright/specs/navigation/breadcrumb.spec.ts new file mode 100644 index 00000000000..42fda2f62df --- /dev/null +++ b/tests/e2e-playwright/specs/navigation/breadcrumb.spec.ts @@ -0,0 +1,103 @@ +import { test } from '@playwright/test' +import { config } from '../../../e2e/config.js' +import { ActorsEnvironment, UsersEnvironment } from '../../../e2e/support/environment' +import { setAccessAndRefreshToken } from '../../helpers/setAccessAndRefreshToken.js' +import * as ui from '../../steps/ui/index' +import * as api from '../../steps/api/api' + +test.describe('Access breadcrumb', { tag: '@predefined-users' }, () => { + let actorsEnvironment + const usersEnvironment = new UsersEnvironment() + + test.beforeEach(async ({ browser }) => { + actorsEnvironment = new ActorsEnvironment({ + context: { + acceptDownloads: config.acceptDownloads, + reportDir: config.reportDir, + tracingReportDir: config.tracingReportDir, + reportHar: config.reportHar, + reportTracing: config.reportTracing, + reportVideo: config.reportVideo, + failOnUncaughtConsoleError: config.failOnUncaughtConsoleError + }, + browser: browser + }) + + await setAccessAndRefreshToken(usersEnvironment) + await api.userHasBeenCreated({ usersEnvironment, stepUser: 'Admin', userToBeCreated: 'Alice' }) + await ui.logInUser({ usersEnvironment, actorsEnvironment, stepUser: 'Alice' }) + }) + + test.afterEach(async () => { + // clean up users + await api.deleteUser({ usersEnvironment, stepUser: 'Admin', targetUser: 'Alice' }) + }) + + test('Breadcrumb navigation', async () => { + await ui.userCreatesResources({ + actorsEnvironment, + stepUser: 'Alice', + type: 'folder', + resource: 'parent/folder%2Fwith%2FSlashes' + }) + await ui.userOpensResources({ + actorsEnvironment, + stepUser: 'Alice', + resource: 'parent/folder%2Fwith%2FSlashes' + }) + await ui.userCreatesResources({ + actorsEnvironment, + stepUser: 'Alice', + type: 'folder', + resource: `'single-double quotes"` + }) + await ui.userOpensResources({ + actorsEnvironment, + stepUser: 'Alice', + resource: `'single-double quotes"` + }) + await ui.userCreatesResources({ + actorsEnvironment, + stepUser: 'Alice', + type: 'folder', + resource: `"inner" double quote` + }) + await ui.userOpensResources({ + actorsEnvironment, + stepUser: 'Alice', + resource: `"inner" double quote` + }) + await ui.userCreatesResources({ + actorsEnvironment, + stepUser: 'Alice', + type: 'folder', + resource: 'sub-folder' + }) + await ui.userOpensResources({ + actorsEnvironment, + stepUser: 'Alice', + resource: 'sub-folder' + }) + await ui.userNavigatesToFolderViaBreadcrumb({ + actorsEnvironment, + stepUser: 'Alice', + resource: `"inner" double quote` + }) + await ui.userNavigatesToFolderViaBreadcrumb({ + actorsEnvironment, + stepUser: 'Alice', + resource: `'single-double quotes"` + }) + await ui.userNavigatesToFolderViaBreadcrumb({ + actorsEnvironment, + stepUser: 'Alice', + resource: 'folder%2Fwith%2FSlashes' + }) + await ui.userNavigatesToFolderViaBreadcrumb({ + actorsEnvironment, + stepUser: 'Alice', + resource: 'parent' + }) + await ui.logOutUser({ actorsEnvironment, stepUser: 'Alice' }) + }) +}) diff --git a/tests/e2e-playwright/specs/oidc/iframeTokenRenewal.spec.ts b/tests/e2e-playwright/specs/oidc/iframeTokenRenewal.spec.ts index cf103a369da..dd01b4f3470 100644 --- a/tests/e2e-playwright/specs/oidc/iframeTokenRenewal.spec.ts +++ b/tests/e2e-playwright/specs/oidc/iframeTokenRenewal.spec.ts @@ -78,7 +78,7 @@ test.describe('details', () => { // And "Alice" creates the following resources // | resource | type | // | space-folder | folder | - await ui.createResource({ + await ui.userCreatesResources({ actorsEnvironment, stepUser: 'Alice', resource: 'space-folder', diff --git a/tests/e2e-playwright/specs/oidc/refreshToken.spec.ts b/tests/e2e-playwright/specs/oidc/refreshToken.spec.ts index 61bb8cce22c..ad41039e2bb 100644 --- a/tests/e2e-playwright/specs/oidc/refreshToken.spec.ts +++ b/tests/e2e-playwright/specs/oidc/refreshToken.spec.ts @@ -79,7 +79,7 @@ test.describe('details', () => { // And "Alice" creates the following resources // | resource | type | // | space-folder | folder | - await ui.createResource({ + await ui.userCreatesResources({ actorsEnvironment, stepUser: 'Alice', resource: 'space-folder', @@ -112,7 +112,7 @@ test.describe('details', () => { // And "Alice" creates the following resources // | resource | type | content | // | PARENT/parent.txt | txtFile | some text | - await ui.createResource({ + await ui.userCreatesResources({ actorsEnvironment, stepUser: 'Alice', resource: 'PARENT/parent.txt', diff --git a/tests/e2e-playwright/specs/search/searchProjectSpace.spec.ts b/tests/e2e-playwright/specs/search/searchProjectSpace.spec.ts index a36472dbd5f..24402386887 100644 --- a/tests/e2e-playwright/specs/search/searchProjectSpace.spec.ts +++ b/tests/e2e-playwright/specs/search/searchProjectSpace.spec.ts @@ -53,7 +53,7 @@ test.describe('Search in the project space', () => { await ui.navigateToSpace({ actorsEnvironment, stepUser: 'Alice', space: 'team.1' }) - await ui.createResource({ + await ui.userCreatesResources({ actorsEnvironment, stepUser: 'Alice', resource: 'folder(WithSymbols:!;_+-&)', diff --git a/tests/e2e-playwright/specs/shares/denyShareAccess.spec.ts b/tests/e2e-playwright/specs/shares/denyShareAccess.spec.ts index 417b0ce2353..4d3a6df0172 100644 --- a/tests/e2e-playwright/specs/shares/denyShareAccess.spec.ts +++ b/tests/e2e-playwright/specs/shares/denyShareAccess.spec.ts @@ -55,7 +55,7 @@ test.describe('deny share access', () => { resourceType: 'folder' }) - await ui.openResource({ + await ui.userOpensResources({ actorsEnvironment, stepUser: 'Alice', resource: 'folder_to_shared' @@ -89,7 +89,7 @@ test.describe('deny share access', () => { }) await ui.navigateToSharedWithMePage({ actorsEnvironment, stepUser: 'Brian' }) - await ui.openResource({ + await ui.userOpensResources({ actorsEnvironment, stepUser: 'Brian', resource: 'folder_to_shared' @@ -108,7 +108,7 @@ test.describe('deny share access', () => { name: 'files' }) - await ui.openResource({ + await ui.userOpensResources({ actorsEnvironment, stepUser: 'Alice', resource: 'folder_to_shared' @@ -125,7 +125,7 @@ test.describe('deny share access', () => { }) await ui.userOpensApplication({ actorsEnvironment, stepUser: 'Brian', name: 'files' }) await ui.navigateToSharedWithMePage({ actorsEnvironment, stepUser: 'Brian' }) - await ui.openResource({ + await ui.userOpensResources({ actorsEnvironment, stepUser: 'Brian', resource: 'folder_to_shared' diff --git a/tests/e2e-playwright/specs/spaces/pagination.spec.ts b/tests/e2e-playwright/specs/spaces/pagination.spec.ts index 34a14eb1d5c..7881810c8ca 100644 --- a/tests/e2e-playwright/specs/spaces/pagination.spec.ts +++ b/tests/e2e-playwright/specs/spaces/pagination.spec.ts @@ -126,7 +126,7 @@ test.describe('check files pagination in project space', () => { }) // When "Alice" opens file "testfile45.txt" - await ui.openResource({ + await ui.userOpensResources({ actorsEnvironment, stepUser: 'Alice', resource: 'testfile45.txt' diff --git a/tests/e2e-playwright/specs/spaces/participantManagement.spec.ts b/tests/e2e-playwright/specs/spaces/participantManagement.spec.ts index 7d56f32685c..2a76d292a23 100644 --- a/tests/e2e-playwright/specs/spaces/participantManagement.spec.ts +++ b/tests/e2e-playwright/specs/spaces/participantManagement.spec.ts @@ -157,7 +157,7 @@ test.describe('check files pagination in project space', () => { // And "Brian" creates the following resources // | resource | type | // | parent | folder | - await ui.createResource({ + await ui.userCreatesResources({ actorsEnvironment, stepUser: 'Brian', resource: 'parent', @@ -202,7 +202,7 @@ test.describe('check files pagination in project space', () => { // And "Edith" creates the following resources // | resource | type | // | edith | folder | - await ui.createResource({ + await ui.userCreatesResources({ actorsEnvironment, stepUser: 'Edith', resource: 'edith', diff --git a/tests/e2e-playwright/specs/user-settings/tiles.spec.ts b/tests/e2e-playwright/specs/user-settings/tiles.spec.ts index 860b3ce216b..f16bcdc0b54 100644 --- a/tests/e2e-playwright/specs/user-settings/tiles.spec.ts +++ b/tests/e2e-playwright/specs/user-settings/tiles.spec.ts @@ -53,13 +53,13 @@ test.describe('tiles view', { tag: '@predefined-users' }, () => { stepUser: 'Alice' }) // And "Alice" opens folder "tile_folder" - await ui.openResource({ + await ui.userOpensResources({ actorsEnvironment, stepUser: 'Alice', resource: 'tile_folder' }) // And "Alice" creates the following resources - await ui.createResource({ + await ui.userCreatesResources({ actorsEnvironment, stepUser: 'Alice', type: 'folder', diff --git a/tests/e2e-playwright/steps/ui/resources.ts b/tests/e2e-playwright/steps/ui/resources.ts index 495e38725dc..c95bc8acfb3 100644 --- a/tests/e2e-playwright/steps/ui/resources.ts +++ b/tests/e2e-playwright/steps/ui/resources.ts @@ -59,7 +59,7 @@ export async function isAbleToEditFileOrFolder({ return userCanEdit } -export async function createResource({ +export async function userCreatesResources({ actorsEnvironment, stepUser, resource, @@ -134,7 +134,7 @@ export async function shouldSeeResourcesAsTiles({ await resourceObject.expectThatResourcesAreTiles() } -export async function openResource({ +export async function userOpensResources({ actorsEnvironment, stepUser, resource @@ -671,3 +671,17 @@ export async function resourceShouldNotBeLocked({ const lockLocator = await resourceObject.getLockLocator({ resource }) expect(await lockLocator.isVisible()).toBe(false) } + +export async function userNavigatesToFolderViaBreadcrumb({ + actorsEnvironment, + stepUser, + resource +}: { + actorsEnvironment: ActorsEnvironment + stepUser: string + resource: string +}): Promise { + const { page } = actorsEnvironment.getActor({ key: stepUser }) + const resourceObject = new objects.applicationFiles.Resource({ page }) + await resourceObject.openFolderViaBreadcrumb(resource) +} diff --git a/tests/e2e/cucumber/features/navigation/breadcrumb.feature b/tests/e2e/cucumber/features/navigation/breadcrumb.feature deleted file mode 100644 index e7e97633a72..00000000000 --- a/tests/e2e/cucumber/features/navigation/breadcrumb.feature +++ /dev/null @@ -1,33 +0,0 @@ -@predefined-users -Feature: access breadcrumb - As a user - I want to browse to parent folders using breadcrumb - So that I can access resources with ease - - - Scenario: breadcrumb navigation - Given "Admin" creates following user using API - | id | - | Alice | - And "Alice" logs in - And "Alice" creates the following resources - | resource | type | - | parent/folder%2Fwith%2FSlashes | folder | - And "Alice" opens folder "parent/folder%2Fwith%2FSlashes" - And "Alice" creates the following resources - | resource | type | - | 'single-double quotes" | folder | - And "Alice" opens folder "\'single-double quotes\"" - And "Alice" creates the following resources - | resource | type | - | "inner" double quotes | folder | - And "Alice" opens folder "\"inner\" double quotes" - And "Alice" creates the following resources - | resource | type | - | sub-folder | folder | - And "Alice" opens folder "sub-folder" - When "Alice" navigates to folder "\"inner\" double quotes" via breadcrumb - And "Alice" navigates to folder "\'single-double quotes\"" via breadcrumb - And "Alice" navigates to folder "folder%2Fwith%2FSlashes" via breadcrumb - And "Alice" navigates to folder "parent" via breadcrumb - And "Alice" logs out diff --git a/tests/e2e/support/objects/a11y/actions.ts b/tests/e2e/support/objects/a11y/actions.ts index daca7505b74..e83f9d7090b 100644 --- a/tests/e2e/support/objects/a11y/actions.ts +++ b/tests/e2e/support/objects/a11y/actions.ts @@ -51,7 +51,8 @@ export const selectors = { actionConfirmButton: '.oc-modal-body-actions-confirm', contextMenuContainer: '#oc-files-context-menu', groupList: '.group-list', - editPanel: '.sidebar-panel__body-EditPanel:visible' + editPanel: '.sidebar-panel__body-EditPanel:visible', + breadcrumb: '#files-breadcrumb' } const a11yRuleTags = ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'best-practice'] diff --git a/tests/e2e/support/objects/app-files/resource/actions.ts b/tests/e2e/support/objects/app-files/resource/actions.ts index 970d24bbebf..e4a47aaf2b1 100644 --- a/tests/e2e/support/objects/app-files/resource/actions.ts +++ b/tests/e2e/support/objects/app-files/resource/actions.ts @@ -174,6 +174,11 @@ export const clickResource = async ({ }), resource.click() ]) + await objects.a11y.Accessibility.assertNoSevereA11yViolations( + page, + ['breadcrumb'], + 'Personal Page Breadcrumb after navigating into a folder' + ) } } @@ -199,6 +204,11 @@ export const clickResourceFromBreadcrumb = async ({ ), page.locator(util.format(breadcrumbResourceNameSelector, folder)).click() ]) + await objects.a11y.Accessibility.assertNoSevereA11yViolations( + page, + ['filesSpaceTable'], + 'Personal Page child folder rows after breadcrumb navigation' + ) await expect(page.locator(breadcrumbLastResourceNameSelector)).toHaveText(resource) } @@ -354,6 +364,11 @@ export const createNewFolder = async ({ page.waitForResponse((resp) => resp.status() === 207 && resp.request().method() === 'PROPFIND'), page.locator(util.format(actionConfirmationButton, 'Create')).click() ]) + await objects.a11y.Accessibility.assertNoSevereA11yViolations( + page, + ['filesSpaceTable'], + 'Personal Page new folder row' + ) } export const createPasswordProtectedFolder = async ({ @@ -586,6 +601,11 @@ export const createResources = async (args: createResourceArgs): Promise = if (!resourcesExists) { await page.locator(addNewResourceButton).click() + await objects.a11y.Accessibility.assertNoSevereA11yViolations( + page, + ['tippyBoxVisible'], + 'Tippy box after button click' + ) await createNewFolder({ page, resource: path }) } await clickResource({ page, path })