From ef6d6c6a5994666ecf6d0101b8ef50a1bea3f94c Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Wed, 16 Jul 2025 13:56:18 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8F=97=EF=B8=8F(e2e)=20cleaning=20and=20m?= =?UTF-8?q?ore=20consistant=20naming?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Clean up e2e tests by removing unused utils and renaming some files for consistency. --- .../e2e/__tests__/app-impress/auth.setup.ts | 2 +- .../e2e/__tests__/app-impress/config.spec.ts | 2 +- .../__tests__/app-impress/doc-create.spec.ts | 2 +- .../__tests__/app-impress/doc-editor.spec.ts | 4 +- .../__tests__/app-impress/doc-export.spec.ts | 2 +- .../app-impress/doc-grid-dnd.spec.ts | 2 +- .../__tests__/app-impress/doc-grid.spec.ts | 2 +- .../__tests__/app-impress/doc-header.spec.ts | 7 +- .../app-impress/doc-inherited-share.spec.ts | 6 +- .../app-impress/doc-member-create.spec.ts | 4 +- .../app-impress/doc-member-list.spec.ts | 3 +- .../__tests__/app-impress/doc-routing.spec.ts | 2 +- .../__tests__/app-impress/doc-search.spec.ts | 2 +- .../app-impress/doc-table-content.spec.ts | 2 +- .../__tests__/app-impress/doc-tree.spec.ts | 6 +- .../__tests__/app-impress/doc-version.spec.ts | 2 +- .../app-impress/doc-visibility.spec.ts | 4 +- .../e2e/__tests__/app-impress/footer.spec.ts | 2 +- .../e2e/__tests__/app-impress/header.spec.ts | 6 +- .../e2e/__tests__/app-impress/home.spec.ts | 2 +- .../__tests__/app-impress/language.spec.ts | 2 +- .../e2e/__tests__/app-impress/share-utils.ts | 158 ----------------- .../__tests__/app-impress/sub-pages-utils.ts | 80 --------- .../{common.ts => utils-common.ts} | 137 --------------- .../e2e/__tests__/app-impress/utils-share.ts | 165 ++++++++++++++++++ .../__tests__/app-impress/utils-sub-pages.ts | 45 +++++ 26 files changed, 245 insertions(+), 406 deletions(-) delete mode 100644 src/frontend/apps/e2e/__tests__/app-impress/share-utils.ts delete mode 100644 src/frontend/apps/e2e/__tests__/app-impress/sub-pages-utils.ts rename src/frontend/apps/e2e/__tests__/app-impress/{common.ts => utils-common.ts} (67%) create mode 100644 src/frontend/apps/e2e/__tests__/app-impress/utils-share.ts create mode 100644 src/frontend/apps/e2e/__tests__/app-impress/utils-sub-pages.ts diff --git a/src/frontend/apps/e2e/__tests__/app-impress/auth.setup.ts b/src/frontend/apps/e2e/__tests__/app-impress/auth.setup.ts index a6e18985cc..99972b6875 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/auth.setup.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/auth.setup.ts @@ -1,6 +1,6 @@ import { FullConfig, FullProject, chromium, expect } from '@playwright/test'; -import { keyCloakSignIn } from './common'; +import { keyCloakSignIn } from './utils-common'; const saveStorageState = async ( browserConfig: FullProject, diff --git a/src/frontend/apps/e2e/__tests__/app-impress/config.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/config.spec.ts index 52889171b2..250f2d6f84 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/config.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/config.spec.ts @@ -2,7 +2,7 @@ import path from 'path'; import { expect, test } from '@playwright/test'; -import { CONFIG, createDoc, overrideConfig } from './common'; +import { CONFIG, createDoc, overrideConfig } from './utils-common'; test.describe('Config', () => { test('it checks that sentry is trying to init from config endpoint', async ({ diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-create.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-create.spec.ts index 4242caf9f9..c1c25d0a51 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-create.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-create.spec.ts @@ -6,7 +6,7 @@ import { keyCloakSignIn, randomName, verifyDocName, -} from './common'; +} from './utils-common'; test.beforeEach(async ({ page }) => { await page.goto('/'); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-editor.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-editor.spec.ts index dd47f2d0a4..7a450c1aac 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-editor.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-editor.spec.ts @@ -9,8 +9,8 @@ import { mockedDocument, overrideConfig, verifyDocName, -} from './common'; -import { createRootSubPage } from './sub-pages-utils'; +} from './utils-common'; +import { createRootSubPage } from './utils-sub-pages'; test.beforeEach(async ({ page }) => { await page.goto('/'); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts index 0e37740f8c..ed4f60ea26 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts @@ -4,7 +4,7 @@ import { expect, test } from '@playwright/test'; import cs from 'convert-stream'; import pdf from 'pdf-parse'; -import { createDoc, verifyDocName } from './common'; +import { createDoc, verifyDocName } from './utils-common'; test.beforeEach(async ({ page }) => { await page.goto('/'); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-grid-dnd.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-grid-dnd.spec.ts index 32c43c2fee..b9a0a2be59 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-grid-dnd.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-grid-dnd.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from '@playwright/test'; -import { createDoc, mockedListDocs } from './common'; +import { createDoc, mockedListDocs } from './utils-common'; test.describe('Doc grid dnd', () => { test('it creates a doc', async ({ page, browserName }) => { diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-grid.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-grid.spec.ts index f0da725b64..7b200c664d 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-grid.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-grid.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from '@playwright/test'; -import { createDoc, getGridRow } from './common'; +import { createDoc, getGridRow } from './utils-common'; type SmallDoc = { id: string; diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts index e1869c3fa0..d0997ec850 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts @@ -4,12 +4,11 @@ import { createDoc, getGridRow, goToGridDoc, - mockedAccesses, mockedDocument, - mockedInvitations, verifyDocName, -} from './common'; -import { createRootSubPage } from './sub-pages-utils'; +} from './utils-common'; +import { mockedAccesses, mockedInvitations } from './utils-share'; +import { createRootSubPage } from './utils-sub-pages'; test.beforeEach(async ({ page }) => { await page.goto('/'); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-inherited-share.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-inherited-share.spec.ts index ed19250144..838705b0d4 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-inherited-share.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-inherited-share.spec.ts @@ -1,8 +1,8 @@ import { expect, test } from '@playwright/test'; -import { createDoc, verifyDocName } from './common'; -import { updateShareLink } from './share-utils'; -import { createRootSubPage } from './sub-pages-utils'; +import { createDoc, verifyDocName } from './utils-common'; +import { updateShareLink } from './utils-share'; +import { createRootSubPage } from './utils-sub-pages'; test.describe('Inherited share accesses', () => { test('it checks inherited accesses', async ({ page, browserName }) => { diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-member-create.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-member-create.spec.ts index 38a05864b8..9922f28869 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-member-create.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-member-create.spec.ts @@ -6,8 +6,8 @@ import { keyCloakSignIn, randomName, verifyDocName, -} from './common'; -import { createRootSubPage } from './sub-pages-utils'; +} from './utils-common'; +import { createRootSubPage } from './utils-sub-pages'; test.describe('Document create member', () => { test.beforeEach(async ({ page }) => { diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-member-list.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-member-list.spec.ts index 4678082a8a..e7d47a7805 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-member-list.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-member-list.spec.ts @@ -1,6 +1,7 @@ import { expect, test } from '@playwright/test'; -import { addNewMember, createDoc, goToGridDoc, verifyDocName } from './common'; +import { createDoc, goToGridDoc, verifyDocName } from './utils-common'; +import { addNewMember } from './utils-share'; test.beforeEach(async ({ page }) => { await page.goto('/'); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-routing.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-routing.spec.ts index e1be875a89..83845be033 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-routing.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-routing.spec.ts @@ -8,7 +8,7 @@ import { keyCloakSignIn, mockedDocument, verifyDocName, -} from './common'; +} from './utils-common'; test.describe('Doc Routing', () => { test.beforeEach(async ({ page }) => { diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-search.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-search.spec.ts index 939cbadf23..1d55a07fc5 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-search.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-search.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from '@playwright/test'; -import { createDoc, randomName, verifyDocName } from './common'; +import { createDoc, randomName, verifyDocName } from './utils-common'; test.beforeEach(async ({ page }) => { await page.goto('/'); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-table-content.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-table-content.spec.ts index 2f4c4240a6..3f293cfaf3 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-table-content.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-table-content.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from '@playwright/test'; -import { createDoc, verifyDocName } from './common'; +import { createDoc, verifyDocName } from './utils-common'; test.beforeEach(async ({ page }) => { await page.goto('/'); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-tree.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-tree.spec.ts index 31e4161b76..05a00de783 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-tree.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-tree.spec.ts @@ -2,15 +2,15 @@ import { expect, test } from '@playwright/test'; import { - addNewMember, createDoc, expectLoginPage, keyCloakSignIn, randomName, updateDocTitle, verifyDocName, -} from './common'; -import { clickOnAddRootSubPage, createRootSubPage } from './sub-pages-utils'; +} from './utils-common'; +import { addNewMember } from './utils-share'; +import { clickOnAddRootSubPage, createRootSubPage } from './utils-sub-pages'; test.describe('Doc Tree', () => { test.beforeEach(async ({ page }) => { diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-version.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-version.spec.ts index 7223ec440d..80c8fc5a3f 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-version.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-version.spec.ts @@ -5,7 +5,7 @@ import { goToGridDoc, mockedDocument, verifyDocName, -} from './common'; +} from './utils-common'; test.beforeEach(async ({ page }) => { await page.goto('/'); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-visibility.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-visibility.spec.ts index 89721ab9a7..8ec86fc0a5 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-visibility.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-visibility.spec.ts @@ -6,8 +6,8 @@ import { expectLoginPage, keyCloakSignIn, verifyDocName, -} from './common'; -import { createRootSubPage } from './sub-pages-utils'; +} from './utils-common'; +import { createRootSubPage } from './utils-sub-pages'; test.describe('Doc Visibility', () => { test.beforeEach(async ({ page }) => { diff --git a/src/frontend/apps/e2e/__tests__/app-impress/footer.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/footer.spec.ts index f5e952a9c8..80678b2f7e 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/footer.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/footer.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from '@playwright/test'; -import { overrideConfig } from './common'; +import { overrideConfig } from './utils-common'; test.describe('Footer', () => { test.use({ storageState: { cookies: [], origins: [] } }); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/header.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/header.spec.ts index 1abca24b29..f5ce439a01 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/header.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/header.spec.ts @@ -1,6 +1,10 @@ import { expect, test } from '@playwright/test'; -import { expectLoginPage, keyCloakSignIn, overrideConfig } from './common'; +import { + expectLoginPage, + keyCloakSignIn, + overrideConfig, +} from './utils-common'; test.describe('Header', () => { test('checks all the elements are visible', async ({ page }) => { diff --git a/src/frontend/apps/e2e/__tests__/app-impress/home.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/home.spec.ts index 50a3e594d3..ec812ca155 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/home.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/home.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from '@playwright/test'; -import { overrideConfig } from './common'; +import { overrideConfig } from './utils-common'; test.beforeEach(async ({ page }) => { await page.goto('/docs/'); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/language.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/language.spec.ts index 28a07f8fd3..1d616cc498 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/language.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/language.spec.ts @@ -1,6 +1,6 @@ import { Page, expect, test } from '@playwright/test'; -import { createDoc } from './common'; +import { createDoc } from './utils-common'; test.describe.serial('Language', () => { let page: Page; diff --git a/src/frontend/apps/e2e/__tests__/app-impress/share-utils.ts b/src/frontend/apps/e2e/__tests__/app-impress/share-utils.ts deleted file mode 100644 index 91062731bf..0000000000 --- a/src/frontend/apps/e2e/__tests__/app-impress/share-utils.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { Locator, Page, expect } from '@playwright/test'; - -export type UserSearchResult = { - email: string; - full_name?: string | null; -}; - -export type Role = 'Administrator' | 'Owner' | 'Member' | 'Editor' | 'Reader'; -export type LinkReach = 'Private' | 'Connected' | 'Public'; -export type LinkRole = 'Reading' | 'Edition'; - -export const searchUserToInviteToDoc = async ( - page: Page, - inputFill?: string, -): Promise => { - const inputFillValue = inputFill ?? 'user '; - - const responsePromise = page.waitForResponse( - (response) => - response - .url() - .includes(`/users/?q=${encodeURIComponent(inputFillValue)}`) && - response.status() === 200, - ); - - await page.getByRole('button', { name: 'Share' }).click(); - const inputSearch = page.getByRole('combobox', { - name: 'Quick search input', - }); - await expect(inputSearch).toBeVisible(); - await inputSearch.fill(inputFillValue); - const response = await responsePromise; - const users = (await response.json()) as UserSearchResult[]; - return users; -}; - -export const addMemberToDoc = async ( - page: Page, - role: Role, - users: UserSearchResult[], -) => { - const list = page.getByTestId('doc-share-add-member-list'); - await expect(list).toBeHidden(); - const quickSearchContent = page.getByTestId('doc-share-quick-search'); - for (const user of users) { - await quickSearchContent - .getByTestId(`search-user-row-${user.email}`) - .click(); - } - - await list.getByLabel('doc-role-dropdown').click(); - await expect(page.getByLabel(role)).toBeVisible(); - await page.getByLabel(role).click(); - await page.getByRole('button', { name: 'Invite' }).click(); -}; - -export const verifyMemberAddedToDoc = async ( - page: Page, - user: UserSearchResult, - role: Role, -): Promise => { - const container = page.getByLabel('List members card'); - await expect(container).toBeVisible(); - const userRow = container.getByTestId(`doc-share-member-row-${user.email}`); - await expect(userRow).toBeVisible(); - await expect(userRow.getByText(role)).toBeVisible(); - await expect(userRow.getByText(user.full_name || user.email)).toBeVisible(); - return userRow; -}; - -export const updateShareLink = async ( - page: Page, - linkReach: LinkReach, - linkRole?: LinkRole | null, -) => { - await page.getByRole('button', { name: 'Visibility', exact: true }).click(); - await page.getByRole('menuitem', { name: linkReach }).click(); - - const visibilityUpdatedText = page - .getByText('The document visibility has been updated') - .first(); - - await expect(visibilityUpdatedText).toBeVisible(); - - if (linkRole) { - await page - .getByRole('button', { name: 'Visibility mode', exact: true }) - .click(); - await page.getByRole('menuitem', { name: linkRole }).click(); - await expect(visibilityUpdatedText).toBeVisible(); - } -}; - -export const verifyLinkReachIsDisabled = async ( - page: Page, - linkReach: LinkReach, -) => { - await page.getByRole('button', { name: 'Visibility', exact: true }).click(); - const item = page.getByRole('menuitem', { name: linkReach }); - await expect(item).toBeDisabled(); - await page.click('body'); -}; - -export const verifyLinkReachIsEnabled = async ( - page: Page, - linkReach: LinkReach, -) => { - await page.getByRole('button', { name: 'Visibility', exact: true }).click(); - const item = page.getByRole('menuitem', { name: linkReach }); - await expect(item).toBeEnabled(); - await page.click('body'); -}; - -export const verifyLinkRoleIsDisabled = async ( - page: Page, - linkRole: LinkRole, -) => { - await page - .getByRole('button', { name: 'Visibility mode', exact: true }) - .click(); - const item = page.getByRole('menuitem', { name: linkRole }); - await expect(item).toBeDisabled(); - await page.click('body'); -}; - -export const verifyLinkRoleIsEnabled = async ( - page: Page, - linkRole: LinkRole, -) => { - await page - .getByRole('button', { name: 'Visibility mode', exact: true }) - .click(); - const item = page.getByRole('menuitem', { name: linkRole }); - await expect(item).toBeEnabled(); - await page.click('body'); -}; - -export const verifyShareLink = async ( - page: Page, - linkReach: LinkReach, - linkRole?: LinkRole | null, -) => { - const visibilityDropdownButton = page.getByRole('button', { - name: 'Visibility', - exact: true, - }); - await expect(visibilityDropdownButton).toBeVisible(); - await expect(visibilityDropdownButton.getByText(linkReach)).toBeVisible(); - - if (linkRole) { - const visibilityModeButton = page.getByRole('button', { - name: 'Visibility mode', - exact: true, - }); - await expect(visibilityModeButton).toBeVisible(); - await expect(page.getByText(linkRole)).toBeVisible(); - } -}; diff --git a/src/frontend/apps/e2e/__tests__/app-impress/sub-pages-utils.ts b/src/frontend/apps/e2e/__tests__/app-impress/sub-pages-utils.ts deleted file mode 100644 index 07735e3a60..0000000000 --- a/src/frontend/apps/e2e/__tests__/app-impress/sub-pages-utils.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Page, expect } from '@playwright/test'; - -import { randomName, updateDocTitle, waitForResponseCreateDoc } from './common'; - -export const createRootSubPage = async ( - page: Page, - browserName: string, - docName: string, -) => { - // Get response - const responsePromise = waitForResponseCreateDoc(page); - await clickOnAddRootSubPage(page); - const response = await responsePromise; - expect(response.ok()).toBeTruthy(); - const subPageJson = (await response.json()) as { id: string }; - - // Get doc tree - const docTree = page.getByTestId('doc-tree'); - await expect(docTree).toBeVisible(); - - // Get sub page item - const subPageItem = docTree - .getByTestId(`doc-sub-page-item-${subPageJson.id}`) - .first(); - await expect(subPageItem).toBeVisible(); - await subPageItem.click(); - - // Update sub page name - const randomDocs = randomName(docName, browserName, 1); - await updateDocTitle(page, randomDocs[0]); - - // Return sub page data - return { name: randomDocs[0], docTreeItem: subPageItem, item: subPageJson }; -}; - -export const clickOnAddRootSubPage = async (page: Page) => { - const rootItem = page.getByTestId('doc-tree-root-item'); - await expect(rootItem).toBeVisible(); - await rootItem.hover(); - await rootItem.getByRole('button', { name: 'add_box' }).click(); -}; - -export const createSubPageFromParent = async ( - page: Page, - browserName: string, - parentId: string, - subPageName: string, -) => { - // Get parent doc tree item - const parentDocTreeItem = page.getByTestId(`doc-sub-page-item-${parentId}`); - await expect(parentDocTreeItem).toBeVisible(); - await parentDocTreeItem.hover(); - - // Create sub page - const responsePromise = waitForResponseCreateDoc(page); - await parentDocTreeItem.getByRole('button', { name: 'add_box' }).click(); - - // Get response - const response = await responsePromise; - expect(response.ok()).toBeTruthy(); - const subPageJson = (await response.json()) as { id: string }; - - // Get doc tree - const docTree = page.getByTestId('doc-tree'); - await expect(docTree).toBeVisible(); - - // Get sub page item - const subPageItem = docTree - .getByTestId(`doc-sub-page-item-${subPageJson.id}`) - .first(); - await expect(subPageItem).toBeVisible(); - await subPageItem.click(); - - // Update sub page name - const subPageTitle = randomName(subPageName, browserName, 1)[0]; - await updateDocTitle(page, subPageTitle); - - // Return sub page data - return { name: subPageTitle, docTreeItem: subPageItem, item: subPageJson }; -}; diff --git a/src/frontend/apps/e2e/__tests__/app-impress/common.ts b/src/frontend/apps/e2e/__tests__/app-impress/utils-common.ts similarity index 67% rename from src/frontend/apps/e2e/__tests__/app-impress/common.ts rename to src/frontend/apps/e2e/__tests__/app-impress/utils-common.ts index 703aae233c..c0cd15161d 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/common.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/utils-common.ts @@ -127,42 +127,6 @@ export const verifyDocName = async (page: Page, docName: string) => { } }; -export const addNewMember = async ( - page: Page, - index: number, - role: 'Administrator' | 'Owner' | 'Editor' | 'Reader', - fillText: string = 'user ', -) => { - const responsePromiseSearchUser = page.waitForResponse( - (response) => - response.url().includes(`/users/?q=${encodeURIComponent(fillText)}`) && - response.status() === 200, - ); - - const inputSearch = page.getByRole('combobox', { - name: 'Quick search input', - }); - - // Select a new user - await inputSearch.fill(fillText); - - // Intercept response - const responseSearchUser = await responsePromiseSearchUser; - const users = (await responseSearchUser.json()) as { - email: string; - }[]; - - // Choose user - await page.getByRole('option', { name: users[index].email }).click(); - - // Choose a role - await page.getByLabel('doc-role-dropdown').click(); - await page.getByLabel(role).click(); - await page.getByRole('button', { name: 'Invite' }).click(); - - return users[index].email; -}; - export const getGridRow = async (page: Page, title: string) => { const docsGrid = page.getByRole('grid'); await expect(docsGrid).toBeVisible(); @@ -301,107 +265,6 @@ export const mockedListDocs = async (page: Page, data: object[] = []) => { }); }; -export const mockedInvitations = async (page: Page, json?: object) => { - let result = [ - { - id: '120ec765-43af-4602-83eb-7f4e1224548a', - abilities: { - destroy: true, - update: true, - partial_update: true, - retrieve: true, - }, - created_at: '2024-10-03T12:19:26.107687Z', - email: 'test@invitation.test', - document: '4888c328-8406-4412-9b0b-c0ba5b9e5fb6', - role: 'editor', - issuer: '7380f42f-02eb-4ad5-b8f0-037a0e66066d', - is_expired: false, - ...json, - }, - ]; - await page.route('**/invitations/**/', async (route) => { - const request = route.request(); - if ( - request.method().includes('GET') && - request.url().includes('invitations') && - request.url().includes('page=') - ) { - await route.fulfill({ - json: { - count: 1, - next: null, - previous: null, - results: result, - }, - }); - } else { - await route.continue(); - } - }); - - await page.route( - '**/invitations/120ec765-43af-4602-83eb-7f4e1224548a/**/', - async (route) => { - const request = route.request(); - if (request.method().includes('DELETE')) { - result = []; - - await route.fulfill({ - json: {}, - }); - } - }, - ); -}; - -export const mockedAccesses = async (page: Page, json?: object) => { - await page.route('**/accesses/**/', async (route) => { - const request = route.request(); - - if ( - request.method().includes('GET') && - request.url().includes('accesses') - ) { - await route.fulfill({ - json: [ - { - id: 'bc8bbbc5-a635-4f65-9817-fd1e9ec8ef87', - user: { - id: 'b4a21bb3-722e-426c-9f78-9d190eda641c', - email: 'test@accesses.test', - }, - team: '', - max_ancestors_role: null, - max_role: 'reader', - role: 'reader', - document: { - id: 'mocked-document-id', - path: '000000', - depth: 1, - }, - abilities: { - destroy: true, - update: true, - partial_update: true, - retrieve: true, - link_select_options: { - public: ['reader', 'editor'], - authenticated: ['reader', 'editor'], - restricted: null, - }, - set_role_to: ['administrator', 'editor'], - }, - ...json, - }, - ], - }); - } else { - await route.continue(); - } - }); -}; - export const expectLoginPage = async (page: Page) => await expect( page.getByRole('heading', { name: 'Collaborative writing' }), diff --git a/src/frontend/apps/e2e/__tests__/app-impress/utils-share.ts b/src/frontend/apps/e2e/__tests__/app-impress/utils-share.ts new file mode 100644 index 0000000000..535f7aae9a --- /dev/null +++ b/src/frontend/apps/e2e/__tests__/app-impress/utils-share.ts @@ -0,0 +1,165 @@ +import { Page, expect } from '@playwright/test'; + +export type Role = 'Administrator' | 'Owner' | 'Member' | 'Editor' | 'Reader'; +export type LinkReach = 'Private' | 'Connected' | 'Public'; +export type LinkRole = 'Reading' | 'Edition'; + +export const addNewMember = async ( + page: Page, + index: number, + role: 'Administrator' | 'Owner' | 'Editor' | 'Reader', + fillText: string = 'user ', +) => { + const responsePromiseSearchUser = page.waitForResponse( + (response) => + response.url().includes(`/users/?q=${encodeURIComponent(fillText)}`) && + response.status() === 200, + ); + + const inputSearch = page.getByRole('combobox', { + name: 'Quick search input', + }); + + // Select a new user + await inputSearch.fill(fillText); + + // Intercept response + const responseSearchUser = await responsePromiseSearchUser; + const users = (await responseSearchUser.json()) as { + email: string; + }[]; + + // Choose user + await page.getByRole('option', { name: users[index].email }).click(); + + // Choose a role + await page.getByLabel('doc-role-dropdown').click(); + await page.getByLabel(role).click(); + await page.getByRole('button', { name: 'Invite' }).click(); + + return users[index].email; +}; + +export const updateShareLink = async ( + page: Page, + linkReach: LinkReach, + linkRole?: LinkRole | null, +) => { + await page.getByRole('button', { name: 'Visibility', exact: true }).click(); + await page.getByRole('menuitem', { name: linkReach }).click(); + + const visibilityUpdatedText = page + .getByText('The document visibility has been updated') + .first(); + + await expect(visibilityUpdatedText).toBeVisible(); + + if (linkRole) { + await page + .getByRole('button', { name: 'Visibility mode', exact: true }) + .click(); + await page.getByRole('menuitem', { name: linkRole }).click(); + await expect(visibilityUpdatedText).toBeVisible(); + } +}; + +export const mockedInvitations = async (page: Page, json?: object) => { + let result = [ + { + id: '120ec765-43af-4602-83eb-7f4e1224548a', + abilities: { + destroy: true, + update: true, + partial_update: true, + retrieve: true, + }, + created_at: '2024-10-03T12:19:26.107687Z', + email: 'test@invitation.test', + document: '4888c328-8406-4412-9b0b-c0ba5b9e5fb6', + role: 'editor', + issuer: '7380f42f-02eb-4ad5-b8f0-037a0e66066d', + is_expired: false, + ...json, + }, + ]; + await page.route('**/invitations/**/', async (route) => { + const request = route.request(); + if ( + request.method().includes('GET') && + request.url().includes('invitations') && + request.url().includes('page=') + ) { + await route.fulfill({ + json: { + count: 1, + next: null, + previous: null, + results: result, + }, + }); + } else { + await route.continue(); + } + }); + + await page.route( + '**/invitations/120ec765-43af-4602-83eb-7f4e1224548a/**/', + async (route) => { + const request = route.request(); + if (request.method().includes('DELETE')) { + result = []; + + await route.fulfill({ + json: {}, + }); + } + }, + ); +}; + +export const mockedAccesses = async (page: Page, json?: object) => { + await page.route('**/accesses/**/', async (route) => { + const request = route.request(); + + if ( + request.method().includes('GET') && + request.url().includes('accesses') + ) { + await route.fulfill({ + json: [ + { + id: 'bc8bbbc5-a635-4f65-9817-fd1e9ec8ef87', + user: { + id: 'b4a21bb3-722e-426c-9f78-9d190eda641c', + email: 'test@accesses.test', + }, + team: '', + max_ancestors_role: null, + max_role: 'reader', + role: 'reader', + document: { + id: 'mocked-document-id', + path: '000000', + depth: 1, + }, + abilities: { + destroy: true, + update: true, + partial_update: true, + retrieve: true, + link_select_options: { + public: ['reader', 'editor'], + authenticated: ['reader', 'editor'], + restricted: null, + }, + set_role_to: ['administrator', 'editor'], + }, + ...json, + }, + ], + }); + } else { + await route.continue(); + } + }); +}; diff --git a/src/frontend/apps/e2e/__tests__/app-impress/utils-sub-pages.ts b/src/frontend/apps/e2e/__tests__/app-impress/utils-sub-pages.ts new file mode 100644 index 0000000000..10d174914f --- /dev/null +++ b/src/frontend/apps/e2e/__tests__/app-impress/utils-sub-pages.ts @@ -0,0 +1,45 @@ +import { Page, expect } from '@playwright/test'; + +import { + randomName, + updateDocTitle, + waitForResponseCreateDoc, +} from './utils-common'; + +export const createRootSubPage = async ( + page: Page, + browserName: string, + docName: string, +) => { + // Get response + const responsePromise = waitForResponseCreateDoc(page); + await clickOnAddRootSubPage(page); + const response = await responsePromise; + expect(response.ok()).toBeTruthy(); + const subPageJson = (await response.json()) as { id: string }; + + // Get doc tree + const docTree = page.getByTestId('doc-tree'); + await expect(docTree).toBeVisible(); + + // Get sub page item + const subPageItem = docTree + .getByTestId(`doc-sub-page-item-${subPageJson.id}`) + .first(); + await expect(subPageItem).toBeVisible(); + await subPageItem.click(); + + // Update sub page name + const randomDocs = randomName(docName, browserName, 1); + await updateDocTitle(page, randomDocs[0]); + + // Return sub page data + return { name: randomDocs[0], docTreeItem: subPageItem, item: subPageJson }; +}; + +export const clickOnAddRootSubPage = async (page: Page) => { + const rootItem = page.getByTestId('doc-tree-root-item'); + await expect(rootItem).toBeVisible(); + await rootItem.hover(); + await rootItem.getByRole('button', { name: 'add_box' }).click(); +};