* feat(web): Phase 2 production readiness — locale, mobile, E2E matrix Localize onboarding focus facts by profile locale (DE assertion). Add mobile overflow/touch audits, deep-link matrix, extended console checks, and E2E for empty project, session unavailable, and teaching composer. Safe-area and Heute header layout on 390px viewports. Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(e2e): stabilize Phase 2 specs for mobile shell and empty project Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(api): satisfy typecheck for focusFactValue Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(api): type-safe focusFactValue lookup Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(api): narrow focus fact locale key Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(api): use FocusOptionId union for fact lookup Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * test(web): align Shell header control assertions with touch targets Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * style(web): format desktop header control test Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(web): stabilize Phase 2 E2E (settings i18n, empty project, chart plot load) Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(web): empty project E2E simulates pre-start bootstrap; relax module recovery wait Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(web): format empty-project E2E; stabilize chart-links cold Plot load Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * test(web): run chart-links E2E serially to reuse warmed Plot module Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * style(web): format chart-links E2E Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
31 lines
1.4 KiB
TypeScript
31 lines
1.4 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
import { completeOnboarding, openUserSettings, rpc, signup } from "./helpers";
|
|
|
|
test.use({ viewport: { width: 390, height: 844 }, isMobile: true, hasTouch: true });
|
|
|
|
test("German UI localizes goal placeholder and question in intake", async ({ page }) => {
|
|
await page.addInitScript(() => {
|
|
Object.defineProperty(navigator, "language", { value: "de-DE", configurable: true });
|
|
localStorage.setItem("rakazo.uiLocale", "de");
|
|
});
|
|
const stamp = Date.now();
|
|
await signup(page, `intake-de-${stamp}@rakazo.test`, "password12", "Deutsch Intake");
|
|
await completeOnboarding(page, undefined, { mainConversation: true });
|
|
await rpc(page, "profile/update", { locale: "de-DE", language: "de" });
|
|
await page.getByTestId("focus-choice-day").click();
|
|
|
|
const goal = page.locator('[data-testid="choice-card"][data-step="goal"]');
|
|
await expect(goal).toContainText("Was möchtest du in den nächsten Wochen erledigt bekommen?");
|
|
await expect(
|
|
goal.getByRole("textbox", {
|
|
name: "Was möchtest du in den nächsten Wochen erledigt bekommen?",
|
|
}),
|
|
).toHaveAttribute("placeholder", "Dein Ziel");
|
|
|
|
const settings = await openUserSettings(page);
|
|
const profile = settings.getByTestId("user-profile-settings");
|
|
await expect(profile.getByTestId("user-facts-goals")).toContainText(
|
|
"Möchte zuerst bei der täglichen Arbeit unterstützt werden",
|
|
);
|
|
});
|