Skip to content

Commit 1cdb6b6

Browse files
OvgoddAntoLC
authored andcommitted
✅(e2e) ensure i18n.language is injected into generated PDF
Adds an end-to-end test to verify language injection in the generated PDF. Signed-off-by: Cyril <[email protected]>
1 parent 2bf5330 commit 1cdb6b6

File tree

3 files changed

+123
-47
lines changed

3 files changed

+123
-47
lines changed

src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@ import { expect, test } from '@playwright/test';
44
import cs from 'convert-stream';
55
import pdf from 'pdf-parse';
66

7-
import { createDoc, verifyDocName } from './utils-common';
7+
import {
8+
TestLanguage,
9+
createDoc,
10+
randomName,
11+
verifyDocName,
12+
waitForLanguageSwitch,
13+
} from './utils-common';
814
import { createRootSubPage } from './utils-sub-pages';
915

1016
test.beforeEach(async ({ page }) => {
@@ -413,6 +419,75 @@ test.describe('Doc Export', () => {
413419
expect(pdfData.text).toContain('Column 3');
414420
});
415421

422+
test('it injects the correct language attribute into PDF export', async ({
423+
page,
424+
browserName,
425+
}) => {
426+
await waitForLanguageSwitch(page, TestLanguage.French);
427+
428+
// Wait for the page to be ready after language switch
429+
await page.waitForLoadState('domcontentloaded');
430+
431+
const header = page.locator('header').first();
432+
await header.locator('h2').getByText('Docs').click();
433+
434+
const randomDocFrench = randomName(
435+
'doc-language-export-french',
436+
browserName,
437+
1,
438+
)[0];
439+
440+
await page
441+
.getByRole('button', {
442+
name: 'Nouveau doc',
443+
})
444+
.click();
445+
446+
await page.waitForURL('**/docs/**', {
447+
timeout: 10000,
448+
waitUntil: 'domcontentloaded',
449+
});
450+
451+
const input = page.getByLabel('doc title input');
452+
await expect(input).toBeVisible();
453+
await expect(input).toHaveText('');
454+
await input.click();
455+
await input.fill(randomDocFrench);
456+
await input.blur();
457+
458+
const editor = page.locator('.ProseMirror.bn-editor');
459+
await editor.click();
460+
await editor.fill('Contenu de test pour export en français');
461+
462+
await page
463+
.getByRole('button', {
464+
name: 'download',
465+
exact: true,
466+
})
467+
.click();
468+
469+
const downloadPromise = page.waitForEvent('download', (download) => {
470+
return download.suggestedFilename().includes(`${randomDocFrench}.pdf`);
471+
});
472+
473+
void page
474+
.getByRole('button', {
475+
name: 'Télécharger',
476+
exact: true,
477+
})
478+
.click();
479+
480+
const download = await downloadPromise;
481+
expect(download.suggestedFilename()).toBe(`${randomDocFrench}.pdf`);
482+
483+
const pdfBuffer = await cs.toBuffer(await download.createReadStream());
484+
const pdfString = pdfBuffer.toString('latin1');
485+
486+
expect(pdfString).toContain('/Lang (fr)');
487+
488+
await waitForLanguageSwitch(page, TestLanguage.English);
489+
});
490+
416491
test('it exports the doc with interlinking', async ({
417492
page,
418493
browserName,

src/frontend/apps/e2e/__tests__/app-impress/language.spec.ts

Lines changed: 1 addition & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Page, expect, test } from '@playwright/test';
22

3-
import { createDoc } from './utils-common';
3+
import { TestLanguage, createDoc, waitForLanguageSwitch } from './utils-common';
44

55
test.describe.serial('Language', () => {
66
let page: Page;
@@ -100,48 +100,3 @@ test.describe.serial('Language', () => {
100100
await expect(page.getByText('Titres', { exact: true })).toBeVisible();
101101
});
102102
});
103-
104-
// language helper
105-
export const TestLanguage = {
106-
English: {
107-
label: 'English',
108-
expectedLocale: ['en-us'],
109-
},
110-
French: {
111-
label: 'Français',
112-
expectedLocale: ['fr-fr'],
113-
},
114-
German: {
115-
label: 'Deutsch',
116-
expectedLocale: ['de-de'],
117-
},
118-
} as const;
119-
120-
type TestLanguageKey = keyof typeof TestLanguage;
121-
type TestLanguageValue = (typeof TestLanguage)[TestLanguageKey];
122-
123-
export async function waitForLanguageSwitch(
124-
page: Page,
125-
lang: TestLanguageValue,
126-
) {
127-
const header = page.locator('header').first();
128-
const languagePicker = header.locator('.--docs--language-picker-text');
129-
const isAlreadyTargetLanguage = await languagePicker
130-
.innerText()
131-
.then((text) => text.toLowerCase().includes(lang.label.toLowerCase()));
132-
133-
if (isAlreadyTargetLanguage) {
134-
return;
135-
}
136-
137-
await languagePicker.click();
138-
const responsePromise = page.waitForResponse(
139-
(resp) =>
140-
resp.url().includes('/user') && resp.request().method() === 'PATCH',
141-
);
142-
await page.getByLabel(lang.label).click();
143-
const resolvedResponsePromise = await responsePromise;
144-
const responseData = await resolvedResponsePromise.json();
145-
146-
expect(lang.expectedLocale).toContain(responseData.language);
147-
}

src/frontend/apps/e2e/__tests__/app-impress/utils-common.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,3 +273,49 @@ export const expectLoginPage = async (page: Page) =>
273273
).toBeVisible({
274274
timeout: 10000,
275275
});
276+
// language helper
277+
export const TestLanguage = {
278+
English: {
279+
label: 'English',
280+
expectedLocale: ['en-us'],
281+
},
282+
French: {
283+
label: 'Français',
284+
expectedLocale: ['fr-fr'],
285+
},
286+
German: {
287+
label: 'Deutsch',
288+
expectedLocale: ['de-de'],
289+
},
290+
} as const;
291+
292+
type TestLanguageKey = keyof typeof TestLanguage;
293+
type TestLanguageValue = (typeof TestLanguage)[TestLanguageKey];
294+
295+
export async function waitForLanguageSwitch(
296+
page: Page,
297+
lang: TestLanguageValue,
298+
) {
299+
const header = page.locator('header').first();
300+
const languagePicker = header.locator('.--docs--language-picker-text');
301+
const isAlreadyTargetLanguage = await languagePicker
302+
.innerText()
303+
.then((text) => text.toLowerCase().includes(lang.label.toLowerCase()));
304+
305+
if (isAlreadyTargetLanguage) {
306+
return;
307+
}
308+
309+
await languagePicker.click();
310+
const responsePromise = page.waitForResponse(
311+
(resp) =>
312+
resp.url().includes('/user') && resp.request().method() === 'PATCH',
313+
);
314+
await page.getByLabel(lang.label).click();
315+
const resolvedResponsePromise = await responsePromise;
316+
const responseData = (await resolvedResponsePromise.json()) as {
317+
language: string;
318+
};
319+
320+
expect(lang.expectedLocale).toContain(responseData.language);
321+
}

0 commit comments

Comments
 (0)