✅(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 <c.gromoff@gmail.com>
This commit is contained in:
@@ -4,7 +4,13 @@ import { expect, test } from '@playwright/test';
|
|||||||
import cs from 'convert-stream';
|
import cs from 'convert-stream';
|
||||||
import pdf from 'pdf-parse';
|
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';
|
import { createRootSubPage } from './utils-sub-pages';
|
||||||
|
|
||||||
test.beforeEach(async ({ page }) => {
|
test.beforeEach(async ({ page }) => {
|
||||||
@@ -413,6 +419,75 @@ test.describe('Doc Export', () => {
|
|||||||
expect(pdfData.text).toContain('Column 3');
|
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 ({
|
test('it exports the doc with interlinking', async ({
|
||||||
page,
|
page,
|
||||||
browserName,
|
browserName,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Page, expect, test } from '@playwright/test';
|
import { Page, expect, test } from '@playwright/test';
|
||||||
|
|
||||||
import { createDoc } from './utils-common';
|
import { TestLanguage, createDoc, waitForLanguageSwitch } from './utils-common';
|
||||||
|
|
||||||
test.describe.serial('Language', () => {
|
test.describe.serial('Language', () => {
|
||||||
let page: Page;
|
let page: Page;
|
||||||
@@ -100,48 +100,3 @@ test.describe.serial('Language', () => {
|
|||||||
await expect(page.getByText('Titres', { exact: true })).toBeVisible();
|
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);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -273,3 +273,49 @@ export const expectLoginPage = async (page: Page) =>
|
|||||||
).toBeVisible({
|
).toBeVisible({
|
||||||
timeout: 10000,
|
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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user