From 1cdb6b62c87d212dee1b0e98fc7a27be3685211d Mon Sep 17 00:00:00 2001 From: Cyril Date: Wed, 30 Jul 2025 11:23:14 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=85(e2e)=20ensure=20i18n.language=20is=20?= =?UTF-8?q?injected=20into=20generated=20PDF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds an end-to-end test to verify language injection in the generated PDF. Signed-off-by: Cyril --- .../__tests__/app-impress/doc-export.spec.ts | 77 ++++++++++++++++++- .../__tests__/app-impress/language.spec.ts | 47 +---------- .../e2e/__tests__/app-impress/utils-common.ts | 46 +++++++++++ 3 files changed, 123 insertions(+), 47 deletions(-) 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 f66aecf8..c081da74 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,13 @@ import { expect, test } from '@playwright/test'; import cs from 'convert-stream'; import pdf from 'pdf-parse'; -import { createDoc, verifyDocName } from './utils-common'; +import { + TestLanguage, + createDoc, + randomName, + verifyDocName, + waitForLanguageSwitch, +} from './utils-common'; import { createRootSubPage } from './utils-sub-pages'; test.beforeEach(async ({ page }) => { @@ -413,6 +419,75 @@ test.describe('Doc Export', () => { expect(pdfData.text).toContain('Column 3'); }); + test('it injects the correct language attribute into PDF export', async ({ + page, + browserName, + }) => { + await waitForLanguageSwitch(page, TestLanguage.French); + + // Wait for the page to be ready after language switch + await page.waitForLoadState('domcontentloaded'); + + const header = page.locator('header').first(); + await header.locator('h2').getByText('Docs').click(); + + const randomDocFrench = randomName( + 'doc-language-export-french', + browserName, + 1, + )[0]; + + await page + .getByRole('button', { + name: 'Nouveau doc', + }) + .click(); + + await page.waitForURL('**/docs/**', { + timeout: 10000, + waitUntil: 'domcontentloaded', + }); + + const input = page.getByLabel('doc title input'); + await expect(input).toBeVisible(); + await expect(input).toHaveText(''); + await input.click(); + await input.fill(randomDocFrench); + await input.blur(); + + const editor = page.locator('.ProseMirror.bn-editor'); + await editor.click(); + await editor.fill('Contenu de test pour export en français'); + + await page + .getByRole('button', { + name: 'download', + exact: true, + }) + .click(); + + const downloadPromise = page.waitForEvent('download', (download) => { + return download.suggestedFilename().includes(`${randomDocFrench}.pdf`); + }); + + void page + .getByRole('button', { + name: 'Télécharger', + exact: true, + }) + .click(); + + const download = await downloadPromise; + expect(download.suggestedFilename()).toBe(`${randomDocFrench}.pdf`); + + const pdfBuffer = await cs.toBuffer(await download.createReadStream()); + const pdfString = pdfBuffer.toString('latin1'); + + expect(pdfString).toContain('/Lang (fr)'); + + await waitForLanguageSwitch(page, TestLanguage.English); + }); + test('it exports the doc with interlinking', async ({ page, browserName, 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 166ac653..c3888ac7 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 './utils-common'; +import { TestLanguage, createDoc, waitForLanguageSwitch } from './utils-common'; test.describe.serial('Language', () => { let page: Page; @@ -100,48 +100,3 @@ test.describe.serial('Language', () => { await expect(page.getByText('Titres', { exact: true })).toBeVisible(); }); }); - -// language helper -export const TestLanguage = { - English: { - label: 'English', - expectedLocale: ['en-us'], - }, - French: { - label: 'Français', - expectedLocale: ['fr-fr'], - }, - German: { - label: 'Deutsch', - expectedLocale: ['de-de'], - }, -} as const; - -type TestLanguageKey = keyof typeof TestLanguage; -type TestLanguageValue = (typeof TestLanguage)[TestLanguageKey]; - -export async function waitForLanguageSwitch( - page: Page, - lang: TestLanguageValue, -) { - const header = page.locator('header').first(); - const languagePicker = header.locator('.--docs--language-picker-text'); - const isAlreadyTargetLanguage = await languagePicker - .innerText() - .then((text) => text.toLowerCase().includes(lang.label.toLowerCase())); - - if (isAlreadyTargetLanguage) { - return; - } - - await languagePicker.click(); - const responsePromise = page.waitForResponse( - (resp) => - resp.url().includes('/user') && resp.request().method() === 'PATCH', - ); - await page.getByLabel(lang.label).click(); - const resolvedResponsePromise = await responsePromise; - const responseData = await resolvedResponsePromise.json(); - - expect(lang.expectedLocale).toContain(responseData.language); -} 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 dc3c412e..79d46f55 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/utils-common.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/utils-common.ts @@ -273,3 +273,49 @@ export const expectLoginPage = async (page: Page) => ).toBeVisible({ timeout: 10000, }); +// language helper +export const TestLanguage = { + English: { + label: 'English', + expectedLocale: ['en-us'], + }, + French: { + label: 'Français', + expectedLocale: ['fr-fr'], + }, + German: { + label: 'Deutsch', + expectedLocale: ['de-de'], + }, +} as const; + +type TestLanguageKey = keyof typeof TestLanguage; +type TestLanguageValue = (typeof TestLanguage)[TestLanguageKey]; + +export async function waitForLanguageSwitch( + page: Page, + lang: TestLanguageValue, +) { + const header = page.locator('header').first(); + const languagePicker = header.locator('.--docs--language-picker-text'); + const isAlreadyTargetLanguage = await languagePicker + .innerText() + .then((text) => text.toLowerCase().includes(lang.label.toLowerCase())); + + if (isAlreadyTargetLanguage) { + return; + } + + await languagePicker.click(); + const responsePromise = page.waitForResponse( + (resp) => + resp.url().includes('/user') && resp.request().method() === 'PATCH', + ); + await page.getByLabel(lang.label).click(); + const resolvedResponsePromise = await responsePromise; + const responseData = (await resolvedResponsePromise.json()) as { + language: string; + }; + + expect(lang.expectedLocale).toContain(responseData.language); +}