diff --git a/src/frontend/apps/e2e/__tests__/app-impress/common.ts b/src/frontend/apps/e2e/__tests__/app-impress/common.ts index a0a2f03b..3d1a9d12 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/common.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/common.ts @@ -33,7 +33,6 @@ export const createDoc = async ( length: number, isPublic: boolean = false, ) => { - const panel = page.getByLabel('Documents panel').first(); const buttonCreate = page.getByRole('button', { name: 'Create the document', }); @@ -41,8 +40,20 @@ export const createDoc = async ( const randomDocs = randomName(docName, browserName, length); for (let i = 0; i < randomDocs.length; i++) { - await panel.getByRole('button', { name: 'Add a document' }).click(); - await page.getByText('Document name').fill(randomDocs[i]); + const header = page.locator('header').first(); + await header.locator('h2').getByText('Docs').click(); + + const buttonCreateHomepage = page.getByRole('button', { + name: 'Create a new document', + }); + await buttonCreateHomepage.click(); + + // Fill input + await page + .getByRole('textbox', { + name: 'Document name', + }) + .fill(randomDocs[i]); if (isPublic) { await page.getByText('Is it public ?').click(); @@ -50,41 +61,13 @@ export const createDoc = async ( await expect(buttonCreate).toBeEnabled(); await buttonCreate.click(); - await expect(panel.locator('li').getByText(randomDocs[i])).toBeVisible(); + + await expect(page.locator('h2').getByText(randomDocs[i])).toBeVisible(); } return randomDocs; }; -export const createTemplate = async ( - page: Page, - templateName: string, - browserName: string, - length: number, -) => { - const menu = page.locator('menu').first(); - await menu.getByLabel(`Template button`).click(); - - const panel = page.getByLabel('Templates panel').first(); - const buttonCreate = page.getByRole('button', { - name: 'Create the template', - }); - - const randomTemplates = randomName(templateName, browserName, length); - - for (let i = 0; i < randomTemplates.length; i++) { - await panel.getByRole('button', { name: 'Add a template' }).click(); - await page.getByText('Template name').fill(randomTemplates[i]); - await expect(buttonCreate).toBeEnabled(); - await buttonCreate.click(); - await expect( - panel.locator('li').getByText(randomTemplates[i]), - ).toBeVisible(); - } - - return randomTemplates; -}; - export const addNewMember = async ( page: Page, index: number, @@ -125,3 +108,36 @@ export const addNewMember = async ( return users[index].email; }; + +interface GoToGridDocOptions { + nthRow?: number; + title?: string; +} +export const goToGridDoc = async ( + page: Page, + { nthRow = 1, title }: GoToGridDocOptions = {}, +) => { + const header = page.locator('header').first(); + await header.locator('h2').getByText('Docs').click(); + + const rows = page + .getByLabel('Datagrid of the documents page 1') + .getByRole('table') + .getByRole('row'); + + const row = title + ? rows.filter({ + hasText: title, + }) + : rows.nth(nthRow); + + const docTitleCell = row.getByRole('cell').nth(1); + + const docTitle = await docTitleCell.textContent(); + + expect(docTitle).toBeDefined(); + + await docTitleCell.click(); + + return docTitle as string; +}; 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 4854f342..93970de5 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 @@ -1,5 +1,7 @@ import { expect, test } from '@playwright/test'; +import { createDoc } from './common'; + test.beforeEach(async ({ page }) => { await page.goto('/'); }); @@ -38,6 +40,8 @@ test.describe('Doc Create', () => { name: 'Cancel', }), ).toBeVisible(); + + await expect(page).toHaveURL('/docs/create/'); }); test('checks the cancel button interaction', async ({ page }) => { @@ -58,73 +62,28 @@ test.describe('Doc Create', () => { await expect(buttonCreateHomepage).toBeVisible(); }); - test('checks the routing on new doc created', async ({ - page, - browserName, - }) => { - const panel = page.getByLabel('Documents panel').first(); - - await panel.getByRole('button', { name: 'Add a document' }).click(); - - const docName = `My routing doc ${browserName}-${Math.floor(Math.random() * 1000)}`; - await page.getByText('Document name').fill(docName); - await page.getByRole('button', { name: 'Create the document' }).click(); - - const elDoc = page.locator('h2').getByText(docName); - await expect(elDoc).toBeVisible(); - - await panel.getByRole('button', { name: 'Add a document' }).click(); - await expect(elDoc).toBeHidden(); - - await panel.locator('li').getByText(docName).click(); - await expect(elDoc).toBeVisible(); - }); - - test('checks alias docs url with homepage', async ({ page }) => { - await expect(page).toHaveURL('/'); - - const buttonCreateHomepage = page.getByRole('button', { - name: 'Create a new document', - }); - - await expect(buttonCreateHomepage).toBeVisible(); - - await page.goto('/docs'); - await expect(buttonCreateHomepage).toBeVisible(); - await expect(page).toHaveURL(/\/docs$/); - }); - - test('checks 404 on docs/[id] page', async ({ page }) => { - // eslint-disable-next-line playwright/no-wait-for-timeout - await page.waitForTimeout(300); - - await page.goto('/docs/some-unknown-doc'); - await expect( - page.getByText( - 'It seems that the page you are looking for does not exist or cannot be displayed correctly.', - ), - ).toBeVisible({ - timeout: 15000, - }); - }); - - test('checks that the doc is public', async ({ page, browserName }) => { - const responsePromiseDoc = page.waitForResponse( - (response) => - response.url().includes('/documents/') && response.status() === 201, + test('create a new public doc', async ({ page, browserName }) => { + const [docTitle] = await createDoc( + page, + 'My new doc', + browserName, + 1, + true, ); - const panel = page.getByLabel('Documents panel').first(); + const header = page.locator('header').first(); + await header.locator('h2').getByText('Docs').click(); - await panel.getByRole('button', { name: 'Add a document' }).click(); + const datagrid = page + .getByLabel('Datagrid of the documents page 1') + .getByRole('table'); - const docName = `My routing doc ${browserName}-${Math.floor(Math.random() * 1000)}`; - await page.getByText('Document name').fill(docName); - await page.getByText('Is it public ?').click(); - await page.getByRole('button', { name: 'Create the document' }).click(); + await expect(datagrid.getByText(docTitle)).toBeVisible(); - const responseDoc = await responsePromiseDoc; - const is_public = (await responseDoc.json()).is_public; - expect(is_public).toBeTruthy(); + const row = datagrid.getByRole('row').filter({ + hasText: docTitle, + }); + + await expect(row.getByRole('cell').nth(0)).toHaveText('Public'); }); }); 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 3d502fad..4654945c 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 @@ -1,6 +1,6 @@ import { expect, test } from '@playwright/test'; -import { createDoc } from './common'; +import { createDoc, goToGridDoc } from './common'; test.beforeEach(async ({ page }) => { await page.goto('/'); @@ -76,26 +76,18 @@ test.describe('Doc Editor', () => { test('it renders correctly when we switch from one doc to another', async ({ page, - browserName, }) => { - const [firstDoc, secondDoc] = await createDoc( - page, - 'doc-multiple', - browserName, - 2, - ); - - const panel = page.getByLabel('Documents panel').first(); - // Check the first doc - await panel.getByText(firstDoc).click(); + const firstDoc = await goToGridDoc(page); await expect(page.locator('h2').getByText(firstDoc)).toBeVisible(); await page.locator('.ProseMirror.bn-editor').click(); await page.locator('.ProseMirror.bn-editor').fill('Hello World Doc 1'); await expect(page.getByText('Hello World Doc 1')).toBeVisible(); // Check the second doc - await panel.getByText(secondDoc).click(); + const secondDoc = await goToGridDoc(page, { + nthRow: 2, + }); await expect(page.locator('h2').getByText(secondDoc)).toBeVisible(); await expect(page.getByText('Hello World Doc 1')).toBeHidden(); await page.locator('.ProseMirror.bn-editor').click(); @@ -103,22 +95,17 @@ test.describe('Doc Editor', () => { await expect(page.getByText('Hello World Doc 2')).toBeVisible(); // Check the first doc again - await panel.getByText(firstDoc).click(); + await goToGridDoc(page, { + title: firstDoc, + }); await expect(page.locator('h2').getByText(firstDoc)).toBeVisible(); await expect(page.getByText('Hello World Doc 2')).toBeHidden(); await expect(page.getByText('Hello World Doc 1')).toBeVisible(); }); - test('it saves the doc when we change pages', async ({ - page, - browserName, - }) => { - const [doc] = await createDoc(page, 'doc-save-page', browserName, 1); - - const panel = page.getByLabel('Documents panel').first(); - + test('it saves the doc when we change pages', async ({ page }) => { // Check the first doc - await panel.getByText(doc).click(); + const doc = await goToGridDoc(page); await expect(page.locator('h2').getByText(doc)).toBeVisible(); await page.locator('.ProseMirror.bn-editor').click(); await page @@ -126,27 +113,19 @@ test.describe('Doc Editor', () => { .fill('Hello World Doc persisted 1'); await expect(page.getByText('Hello World Doc persisted 1')).toBeVisible(); - await panel - .getByRole('button', { - name: 'Add a document', - }) - .click(); + const secondDoc = await goToGridDoc(page, { + nthRow: 2, + }); await expect( page.getByText(`Your document "${doc}" has been saved.`), ).toBeVisible(); - const card = page.getByLabel('Create new document card').first(); - await expect( - card.getByRole('heading', { - name: 'Name the document', - level: 3, - }), - ).toBeVisible(); + await expect(page.locator('h2').getByText(secondDoc)).toBeVisible(); - await page.goto('/'); - - await panel.getByText(doc).click(); + await goToGridDoc(page, { + title: doc, + }); await expect(page.getByText('Hello World Doc persisted 1')).toBeVisible(); }); @@ -155,12 +134,8 @@ test.describe('Doc Editor', () => { // eslint-disable-next-line playwright/no-skipped-test test.skip(browserName === 'webkit', 'This test is very flaky with webkit'); - const [doc] = await createDoc(page, 'doc-save-quit', browserName, 1); - - const panel = page.getByLabel('Documents panel').first(); - // Check the first doc - await panel.getByText(doc).click(); + const doc = await goToGridDoc(page); await expect(page.locator('h2').getByText(doc)).toBeVisible(); await page.locator('.ProseMirror.bn-editor').click(); await page @@ -170,12 +145,14 @@ test.describe('Doc Editor', () => { await page.goto('/'); - await panel.getByText(doc).click(); + await goToGridDoc(page, { + title: doc, + }); await expect(page.getByText('Hello World Doc persisted 2')).toBeVisible(); }); - test('it cannot edit if viewer', async ({ page, browserName }) => { + test('it cannot edit if viewer', async ({ page }) => { await page.route('**/documents/**/', async (route) => { const request = route.request(); if ( @@ -206,7 +183,7 @@ test.describe('Doc Editor', () => { } }); - await createDoc(page, 'doc-right-edit', browserName, 1); + await goToGridDoc(page); await expect( page.getByText( diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-member-grid.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-member-grid.spec.ts index 1a3ddbff..f21c8c57 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-member-grid.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-member-grid.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from '@playwright/test'; -import { createDoc } from './common'; +import { createDoc, goToGridDoc } from './common'; test.beforeEach(async ({ page }) => { await page.goto('/'); @@ -27,10 +27,7 @@ test.describe('Document grid members', () => { ); }); - test('it display the grid with many members', async ({ - page, - browserName, - }) => { + test('it display the grid with many members', async ({ page }) => { await page.route('**/documents/*/', async (route) => { const request = route.request(); if ( @@ -91,7 +88,7 @@ test.describe('Document grid members', () => { }, ); - await createDoc(page, 'grid-no-member', browserName, 1); + await goToGridDoc(page); await page.getByLabel('Open the document options').click(); await page.getByRole('button', { name: 'Manage members' }).click(); 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 new file mode 100644 index 00000000..cebbb11b --- /dev/null +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-routing.spec.ts @@ -0,0 +1,35 @@ +import { expect, test } from '@playwright/test'; + +test.beforeEach(async ({ page }) => { + await page.goto('/'); +}); + +test.describe('Doc Routing', () => { + test('checks alias docs url with homepage', async ({ page }) => { + await expect(page).toHaveURL('/'); + + const buttonCreateHomepage = page.getByRole('button', { + name: 'Create a new document', + }); + + await expect(buttonCreateHomepage).toBeVisible(); + + await page.goto('/docs'); + await expect(buttonCreateHomepage).toBeVisible(); + await expect(page).toHaveURL(/\/docs$/); + }); + + test('checks 404 on docs/[id] page', async ({ page }) => { + // eslint-disable-next-line playwright/no-wait-for-timeout + await page.waitForTimeout(300); + + await page.goto('/docs/some-unknown-doc'); + await expect( + page.getByText( + 'It seems that the page you are looking for does not exist or cannot be displayed correctly.', + ), + ).toBeVisible({ + timeout: 15000, + }); + }); +}); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-tools.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-tools.spec.ts index 3a6a7d6c..9dde2885 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-tools.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-tools.spec.ts @@ -2,7 +2,7 @@ import { expect, test } from '@playwright/test'; import cs from 'convert-stream'; import pdf from 'pdf-parse'; -import { createDoc } from './common'; +import { createDoc, goToGridDoc } from './common'; test.beforeEach(async ({ page }) => { await page.goto('/'); @@ -123,10 +123,9 @@ test.describe('Doc Tools', () => { page.getByText('The document has been updated.'), ).toBeVisible(); - const panel = page.getByLabel('Documents panel').first(); - await expect( - panel.locator('li').getByText(`${randomDoc}-updated`), - ).toBeVisible(); + await goToGridDoc(page, { + title: `${randomDoc}-updated`, + }); await page.getByLabel('Open the document options').click(); await page @@ -169,14 +168,18 @@ test.describe('Doc Tools', () => { page.getByRole('button', { name: 'Create a new document' }), ).toBeVisible(); - const panel = page.getByLabel('Documents panel').first(); - await expect(panel.locator('li').getByText(randomDoc)).toBeHidden(); + const row = page + .getByLabel('Datagrid of the documents page 1') + .getByRole('table') + .getByRole('row') + .filter({ + hasText: randomDoc, + }); + + expect(await row.count()).toBe(0); }); - test('it checks the options available if administrator', async ({ - page, - browserName, - }) => { + test('it checks the options available if administrator', async ({ page }) => { await page.route('**/documents/**/', async (route) => { const request = route.request(); if ( @@ -207,7 +210,7 @@ test.describe('Doc Tools', () => { } }); - await createDoc(page, 'doc-tools-right-admin', browserName, 1); + await goToGridDoc(page); await expect(page.locator('h2').getByText('Mocked document')).toBeVisible(); @@ -227,10 +230,7 @@ test.describe('Doc Tools', () => { ).toBeHidden(); }); - test('it checks the options available if editor', async ({ - page, - browserName, - }) => { + test('it checks the options available if editor', async ({ page }) => { await page.route('**/documents/**/', async (route) => { const request = route.request(); if ( @@ -261,7 +261,7 @@ test.describe('Doc Tools', () => { } }); - await createDoc(page, 'doc-tools-right-editor', browserName, 1); + await goToGridDoc(page); await expect(page.locator('h2').getByText('Mocked document')).toBeVisible(); @@ -281,10 +281,7 @@ test.describe('Doc Tools', () => { ).toBeHidden(); }); - test('it checks the options available if reader', async ({ - page, - browserName, - }) => { + test('it checks the options available if reader', async ({ page }) => { await page.route('**/documents/**/', async (route) => { const request = route.request(); if ( @@ -315,7 +312,7 @@ test.describe('Doc Tools', () => { } }); - await createDoc(page, 'doc-tools-right-reader', browserName, 1); + await goToGridDoc(page); await expect(page.locator('h2').getByText('Mocked document')).toBeVisible();