diff --git a/CHANGELOG.md b/CHANGELOG.md index e93488c199..a3f9027873 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to - #1255 - #1262 - #1270 + - #1271 ## [3.5.0] - 2025-07-31 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 43a855cf4e..1664b95c90 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 @@ -45,7 +45,12 @@ test.describe('Doc Create', () => { }) .click(); - const input = page.getByRole('textbox', { name: 'doc title input' }); + await page.waitForURL('**/docs/**', { + timeout: 10000, + waitUntil: 'domcontentloaded', + }); + + const input = page.getByRole('textbox', { name: 'Document title' }); await expect(input).toHaveText(''); await expect( page.locator('.c__tree-view--row-content').getByText('Untitled document'), @@ -67,7 +72,12 @@ test.describe('Doc Create', () => { .getByText('New sub-doc') .click(); - const input = page.getByRole('textbox', { name: 'doc title input' }); + await page.waitForURL('**/docs/**', { + timeout: 10000, + waitUntil: 'domcontentloaded', + }); + + const input = page.getByRole('textbox', { name: 'Document title' }); await expect(input).toHaveText(''); await expect( page.locator('.c__tree-view--row-content').getByText('Untitled document'), 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 1e14c42ee2..4ea3264038 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 @@ -23,11 +23,7 @@ test.describe('Doc Export', () => { browserName, }) => { await createDoc(page, 'doc-editor', browserName, 1); - await page - .getByRole('button', { - name: 'download', - }) - .click(); + await page.getByTestId('doc-open-modal-download-button').click(); await expect( page @@ -45,7 +41,7 @@ test.describe('Doc Export', () => { await expect( page.getByRole('button', { name: 'Close the modal' }), ).toBeVisible(); - await expect(page.getByRole('button', { name: 'Download' })).toBeVisible(); + await expect(page.getByTestId('doc-export-download-button')).toBeVisible(); }); test('it exports the doc with pdf line break', async ({ @@ -76,23 +72,13 @@ test.describe('Doc Export', () => { await editor.locator('.bn-block-outer').last().fill('World'); - await page - .getByRole('button', { - name: 'download', - exact: true, - }) - .click(); + await page.getByTestId('doc-open-modal-download-button').click(); const downloadPromise = page.waitForEvent('download', (download) => { return download.suggestedFilename().includes(`${randomDoc}.pdf`); }); - void page - .getByRole('button', { - name: 'Download', - exact: true, - }) - .click(); + void page.getByTestId('doc-export-download-button').click(); const download = await downloadPromise; expect(download.suggestedFilename()).toBe(`${randomDoc}.pdf`); @@ -126,33 +112,18 @@ test.describe('Doc Export', () => { await expect(image).toBeVisible(); - await page - .getByRole('button', { - name: 'download', - exact: true, - }) - .click(); + await page.getByTestId('doc-open-modal-download-button').click(); await page.getByRole('combobox', { name: 'Format' }).click(); await page.getByRole('option', { name: 'Docx' }).click(); - await expect( - page.getByRole('button', { - name: 'Download', - exact: true, - }), - ).toBeVisible(); + await expect(page.getByTestId('doc-export-download-button')).toBeVisible(); const downloadPromise = page.waitForEvent('download', (download) => { return download.suggestedFilename().includes(`${randomDoc}.docx`); }); - void page - .getByRole('button', { - name: 'Download', - exact: true, - }) - .click(); + void page.getByTestId('doc-export-download-button').click(); const download = await downloadPromise; expect(download.suggestedFilename()).toBe(`${randomDoc}.docx`); @@ -194,11 +165,7 @@ test.describe('Doc Export', () => { .fill('https://docs.numerique.gouv.fr/assets/logo-gouv.png'); await page.getByText('Embed image').click(); - await page - .getByRole('button', { - name: 'download', - }) - .click(); + await page.getByTestId('doc-open-modal-download-button').click(); await page .getByRole('combobox', { @@ -216,11 +183,7 @@ test.describe('Doc Export', () => { await new Promise((resolve) => setTimeout(resolve, 1000)); - await expect( - page.getByRole('button', { - name: 'Download', - }), - ).toBeVisible(); + await expect(page.getByTestId('doc-export-download-button')).toBeVisible(); const responseCorsPromise = page.waitForResponse( (response) => @@ -231,11 +194,7 @@ test.describe('Doc Export', () => { return download.suggestedFilename().includes(`${randomDoc}.pdf`); }); - void page - .getByRole('button', { - name: 'Download', - }) - .click(); + void page.getByTestId('doc-export-download-button').click(); const responseCors = await responseCorsPromise; expect(responseCors.ok()).toBe(true); @@ -271,27 +230,15 @@ test.describe('Doc Export', () => { 'italic', ); - await page - .getByRole('button', { - name: 'download', - }) - .click(); + await page.getByTestId('doc-open-modal-download-button').click(); - await expect( - page.getByRole('button', { - name: 'Download', - }), - ).toBeVisible(); + await expect(page.getByTestId('doc-export-download-button')).toBeVisible(); const downloadPromise = page.waitForEvent('download', (download) => { return download.suggestedFilename().includes(`${randomDoc}.pdf`); }); - void page - .getByRole('button', { - name: 'Download', - }) - .click(); + void page.getByTestId('doc-export-download-button').click(); const download = await downloadPromise; expect(download.suggestedFilename()).toBe(`${randomDoc}.pdf`); @@ -321,30 +268,17 @@ test.describe('Doc Export', () => { editor.locator('.bn-block-content[data-content-type="divider"]'), ).toBeVisible(); - await page - .getByRole('button', { - name: 'download', - exact: true, - }) - .click(); + await page.getByTestId('doc-open-modal-download-button').click(); await expect( - page.getByRole('button', { - name: 'Download', - exact: true, - }), + page.getByTestId('doc-open-modal-download-button'), ).toBeVisible(); const downloadPromise = page.waitForEvent('download', (download) => { return download.suggestedFilename().includes(`${randomDoc}.pdf`); }); - void page - .getByRole('button', { - name: 'Download', - exact: true, - }) - .click(); + void page.getByTestId('doc-export-download-button').click(); const download = await downloadPromise; expect(download.suggestedFilename()).toBe(`${randomDoc}.pdf`); @@ -384,30 +318,17 @@ test.describe('Doc Export', () => { page.locator('.bn-block-column[data-node-type="column"]').last(), ).toHaveText('Column 3'); - await page - .getByRole('button', { - name: 'download', - exact: true, - }) - .click(); + await page.getByTestId('doc-open-modal-download-button').click(); await expect( - page.getByRole('button', { - name: 'Download', - exact: true, - }), + page.getByTestId('doc-open-modal-download-button'), ).toBeVisible(); const downloadPromise = page.waitForEvent('download', (download) => { return download.suggestedFilename().includes(`${randomDoc}.pdf`); }); - void page - .getByRole('button', { - name: 'Download', - exact: true, - }) - .click(); + void page.getByTestId('doc-export-download-button').click(); const download = await downloadPromise; expect(download.suggestedFilename()).toBe(`${randomDoc}.pdf`); @@ -448,9 +369,8 @@ test.describe('Doc Export', () => { waitUntil: 'domcontentloaded', }); - const input = page.getByLabel('doc title input'); - await expect(input).toBeVisible(); - await expect(input).toHaveText(''); + const input = page.locator('.--docs--doc-title-input[role="textbox"]'); + await expect(input).toBeVisible({ timeout: 20000 }); await input.click(); await input.fill(randomDocFrench); await input.blur(); @@ -459,23 +379,13 @@ test.describe('Doc Export', () => { await editor.click(); await editor.fill('Contenu de test pour export en français'); - await page - .getByRole('button', { - name: 'download', - exact: true, - }) - .click(); + await page.getByTestId('doc-open-modal-download-button').click(); const downloadPromise = page.waitForEvent('download', (download) => { return download.suggestedFilename().includes(`${randomDocFrench}.pdf`); }); - void page - .getByRole('button', { - name: 'Télécharger', - exact: true, - }) - .click(); + void page.getByTestId('doc-export-download-button').click(); const download = await downloadPromise; expect(download.suggestedFilename()).toBe(`${randomDocFrench}.pdf`); @@ -527,23 +437,17 @@ test.describe('Doc Export', () => { await expect(interlink).toBeVisible(); + // Open export modal before triggering the download + await page.getByTestId('doc-open-modal-download-button').click(); + await expect( + page.getByTestId('doc-open-modal-download-button'), + ).toBeVisible(); + const downloadPromise = page.waitForEvent('download', (download) => { return download.suggestedFilename().includes(`${docChild}.pdf`); }); - await page - .getByRole('button', { - name: 'download', - exact: true, - }) - .click(); - - void page - .getByRole('button', { - name: 'Download', - exact: true, - }) - .click(); + await page.getByTestId('doc-export-download-button').click(); const download = await downloadPromise; expect(download.suggestedFilename()).toBe(`${docChild}.pdf`); 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 a1542353bf..dcbf63cf66 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 @@ -25,7 +25,7 @@ test.describe('Doc Header', () => { 'It is the card information about the document.', ); - const docTitle = card.getByRole('textbox', { name: 'doc title input' }); + const docTitle = card.getByRole('textbox', { name: 'Document title' }); await expect(docTitle).toBeVisible(); await page.getByRole('button', { name: 'Share' }).click(); @@ -52,7 +52,7 @@ test.describe('Doc Header', () => { test('it updates the title doc', async ({ page, browserName }) => { await createDoc(page, 'doc-update', browserName, 1); - const docTitle = page.getByRole('textbox', { name: 'doc title input' }); + const docTitle = page.getByRole('textbox', { name: 'Document title' }); await expect(docTitle).toBeVisible(); await docTitle.fill('Hello World'); await docTitle.blur(); @@ -115,7 +115,9 @@ test.describe('Doc Header', () => { await goToGridDoc(page); - await expect(page.getByRole('button', { name: 'download' })).toBeVisible(); + await expect( + page.getByTestId('doc-open-modal-download-button'), + ).toBeVisible(); await page.getByLabel('Open the document options').click(); @@ -185,7 +187,9 @@ test.describe('Doc Header', () => { await goToGridDoc(page); - await expect(page.getByRole('button', { name: 'download' })).toBeVisible(); + await expect( + page.getByTestId('doc-open-modal-download-button'), + ).toBeVisible(); await page.getByLabel('Open the document options').click(); await expect(page.getByLabel('Delete document')).toBeDisabled(); @@ -196,22 +200,24 @@ test.describe('Doc Header', () => { await page.getByRole('button', { name: 'Share' }).click(); const shareModal = page.getByLabel('Share modal'); + await expect(shareModal).toBeVisible(); await expect(page.getByText('Share the document')).toBeVisible(); await expect(page.getByPlaceholder('Type a name or email')).toBeHidden(); const invitationCard = shareModal.getByLabel('List invitation card'); + await expect(invitationCard).toBeVisible(); await expect( invitationCard.getByText('test@invitation.test').first(), ).toBeVisible(); - await expect(invitationCard.getByLabel('doc-role-text')).toBeVisible(); + await expect(invitationCard.getByLabel('Document role text')).toBeVisible(); await expect( invitationCard.getByRole('button', { name: 'more_horiz' }), ).toBeHidden(); const memberCard = shareModal.getByLabel('List members card'); await expect(memberCard.getByText('test@accesses.test')).toBeVisible(); - await expect(memberCard.getByLabel('doc-role-text')).toBeVisible(); + await expect(memberCard.getByLabel('Document role text')).toBeVisible(); await expect( memberCard.getByRole('button', { name: 'more_horiz' }), ).toBeHidden(); @@ -245,7 +251,9 @@ test.describe('Doc Header', () => { await goToGridDoc(page); - await expect(page.getByRole('button', { name: 'download' })).toBeVisible(); + await expect( + page.getByTestId('doc-open-modal-download-button'), + ).toBeVisible(); await page.getByLabel('Open the document options').click(); await expect(page.getByLabel('Delete document')).toBeDisabled(); @@ -261,17 +269,18 @@ test.describe('Doc Header', () => { await expect(page.getByPlaceholder('Type a name or email')).toBeHidden(); const invitationCard = shareModal.getByLabel('List invitation card'); + await expect(invitationCard).toBeVisible(); await expect( invitationCard.getByText('test@invitation.test').first(), ).toBeVisible(); - await expect(invitationCard.getByLabel('doc-role-text')).toBeVisible(); + await expect(invitationCard.getByLabel('Document role text')).toBeVisible(); await expect( invitationCard.getByRole('button', { name: 'more_horiz' }), ).toBeHidden(); const memberCard = shareModal.getByLabel('List members card'); await expect(memberCard.getByText('test@accesses.test')).toBeVisible(); - await expect(memberCard.getByLabel('doc-role-text')).toBeVisible(); + await expect(memberCard.getByLabel('Document role text')).toBeVisible(); await expect( memberCard.getByRole('button', { name: 'more_horiz' }), ).toBeHidden(); 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 ad2bea5a77..91bf70d5be 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 @@ -51,7 +51,7 @@ test.describe('Doc Tree', () => { await expect(subPageItem).toBeVisible(); await subPageItem.click(); await verifyDocName(page, ''); - const input = page.getByRole('textbox', { name: 'doc title input' }); + const input = page.getByRole('textbox', { name: 'Document title' }); await input.click(); const [randomDocName] = randomName('doc-tree-test', browserName, 1); await input.fill(randomDocName); @@ -197,7 +197,7 @@ test.describe('Doc Tree', () => { await page.getByText('Move to my docs').click(); await expect( - page.getByRole('textbox', { name: 'doc title input' }), + page.getByRole('textbox', { name: 'Document title' }), ).not.toHaveText(docChild); const header = page.locator('header').first(); diff --git a/src/frontend/apps/e2e/__tests__/app-impress/utils-common.ts b/src/frontend/apps/e2e/__tests__/app-impress/utils-common.ts index 4cbf886bb8..35b8a6c76a 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/utils-common.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/utils-common.ts @@ -101,10 +101,9 @@ export const createDoc = async ( waitUntil: 'networkidle', }); - const input = page.getByLabel('doc title input'); + const input = page.getByLabel('Document title'); await expect(input).toBeVisible(); await expect(input).toHaveText(''); - await input.click(); await input.fill(randomDocs[i]); await input.blur(); @@ -122,7 +121,7 @@ export const verifyDocName = async (page: Page, docName: string) => { try { await expect( - page.getByRole('textbox', { name: 'doc title input' }), + page.getByRole('textbox', { name: 'Document title' }), ).toHaveText(docName); } catch { await expect(page.getByRole('heading', { name: docName })).toBeVisible(); @@ -180,9 +179,9 @@ export const goToGridDoc = async ( }; export const updateDocTitle = async (page: Page, title: string) => { - const input = page.getByLabel('doc title input'); - await expect(input).toBeVisible(); + const input = page.getByRole('textbox', { name: 'Document title' }); await expect(input).toHaveText(''); + await expect(input).toBeVisible(); await input.click(); await input.fill(title); await input.click(); diff --git a/src/frontend/apps/impress/src/features/docs/doc-export/components/ModalExport.tsx b/src/frontend/apps/impress/src/features/docs/doc-export/components/ModalExport.tsx index 3d9beed178..51a54fdabb 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-export/components/ModalExport.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-export/components/ModalExport.tsx @@ -143,6 +143,7 @@ export const ModalExport = ({ onClose, doc }: ModalExportProps) => { {t('Cancel')}