fix(i18n): localize generated labels without changing saved content

This commit is contained in:
cesnimda
2026-10-20 20:27:42 +02:00
parent d8c0187305
commit ab89b6984c
17 changed files with 1106 additions and 31 deletions
+17 -3
View File
@@ -98,6 +98,20 @@ function action(row: JobApplication, language: Sample['language'] = 'en') {
: signal.actionKey === 'interview-prep' ? t.jobTableInterviewStage : signal.actionKey === 'follow-up' ? t.jobTableFollowUp : t.jobTableReadiness;
return `${label}: ${row.jobTitle}`;
}
function fixtureReason(row: JobApplication, language: Sample['language']) {
if (language === 'en') return row.workflowSignal!.reason;
const t = translations[language];
switch (row.workflowSignal!.actionKey) {
case 'package-work': return t.reminderReasonCvAndAnswers;
case 'interview-prep': return t.reminderReasonInterview;
case 'review-readiness': return t.reminderReasonNoGaps;
default: {
const feedback = /^Feedback requested (\d+)d ago$/.exec(row.workflowSignal!.reason);
expect(feedback).not.toBeNull();
return text(t.reminderReasonFeedbackDays, { days: feedback![1] });
}
}
}
function requests(session: Session, method: string, path: string) { return session.requests.filter(request => request.method === method && request.path === path); }
function hold() { let release!: () => void; const pending = new Promise<void>(resolve => { release = resolve; }); return { pending, release }; }
async function keyboard(page: Page, control: Locator) { await control.focus(); await expect(control).toBeFocused(); await page.keyboard.press('Enter'); }
@@ -261,7 +275,7 @@ test('[P7-05 Reminders] committed PATCH204 followed by a failed reload retries o
} finally { gate.release(); }
});
test('[P7-05 Reminders] live EN/Bokmal translates status/date controls and preserves raw reasons without a page-triggered refetch', async ({ page, session }, info) => {
test('[P7-05 Reminders] live EN/Bokmal translates status/date controls and generated reasons without a page-triggered refetch', async ({ page, session }, info) => {
test.setTimeout(90_000); const { rows } = await groups(page.request, session.owner);
await enter(page, session.owner); await expect(region(page).getByRole('article')).toHaveCount(4);
await expect.poll(() => requests(session, 'GET', '/api/jobapplications/reminders').length).toBeGreaterThanOrEqual(2);
@@ -269,7 +283,7 @@ test('[P7-05 Reminders] live EN/Bokmal translates status/date controls and prese
const preference = response(page, 'PUT', `${apiUrl}/auth/preferences/language`);
await keyboard(page, page.locator('header').getByRole('button', { name: 'Norsk', exact: true })); expect((await preference).status()).toBe(204);
await expect(page.locator('html')).toHaveAttribute('lang', 'nb-NO'); await expect(region(page, 'nb').getByRole('article')).toHaveCount(4);
for (const row of rows) await expect(article(page, row.jobTitle)).toContainText(row.workflowSignal!.reason);
for (const row of rows) await expect(article(page, row.jobTitle)).toContainText(fixtureReason(row, 'nb'));
await expect(article(page, rows[1].jobTitle).getByText(translations.nb.statusInterview, { exact: true })).toBeVisible();
const authoritative = (await read(page.request)).find(row => row.id === rows[3].id)!;
const date = await page.evaluate(value => new Date(value).toLocaleDateString('nb-NO'), authoritative.followUpAt!);
@@ -297,7 +311,7 @@ test('[P7-05 Reminders] eight finite bilingual theme widths preserve long rows a
await enter(page, session.owner, sample); await expect(region(page, sample.language).getByRole('article')).toHaveCount(4);
for (const row of rows) {
await expect(article(page, row.jobTitle).getByRole('heading', { level: 4 })).toContainText(row.jobTitle);
await expect(article(page, row.jobTitle)).toContainText(row.workflowSignal!.reason);
await expect(article(page, row.jobTitle)).toContainText(fixtureReason(row, sample.language));
const open = article(page, row.jobTitle).getByRole('button', { name: action(row, sample.language), exact: true });
await open.scrollIntoViewIfNeeded(); await open.focus(); await expect(open).toBeFocused();
for (const days of [3, 7]) { await snooze(page, row, days, sample.language).focus(); await expect(snooze(page, row, days, sample.language)).toBeFocused(); }