diff --git a/frontend/app/hooks/useLanguage.tsx b/frontend/app/hooks/useLanguage.tsx index bc312d5..57c23a1 100644 --- a/frontend/app/hooks/useLanguage.tsx +++ b/frontend/app/hooks/useLanguage.tsx @@ -21,8 +21,12 @@ export function LanguageProvider({ children }: { children: ReactNode }) { // Load locale from localStorage on mount useEffect(() => { const stored = localStorage.getItem(LOCALE_STORAGE_KEY); + console.log("[useLanguage] Loading locale from localStorage:", stored); if (stored && (stored === "es" || stored === "en" || stored === "ca")) { + console.log("[useLanguage] Setting locale to:", stored); setLocaleState(stored as Locale); + } else { + console.log("[useLanguage] No valid stored locale, using default:", DEFAULT_LOCALE); } setIsHydrated(true); }, []); diff --git a/frontend/app/profile/page.test.tsx b/frontend/app/profile/page.test.tsx index aeb0ee8..f6eecab 100644 --- a/frontend/app/profile/page.test.tsx +++ b/frontend/app/profile/page.test.tsx @@ -123,7 +123,7 @@ describe("ProfilePage - Display", () => { renderWithProviders(); await waitFor(() => { - expect(screen.getByRole("heading", { name: "My Profile" })).toBeDefined(); + expect(screen.getByRole("heading", { name: "Mi Perfil" })).toBeDefined(); }); }); @@ -143,7 +143,7 @@ describe("ProfilePage - Display", () => { renderWithProviders(); await waitFor(() => { - expect(screen.getByText("Read only")).toBeDefined(); + expect(screen.getByText("Solo lectura")).toBeDefined(); }); }); @@ -152,7 +152,7 @@ describe("ProfilePage - Display", () => { renderWithProviders(); await waitFor(() => { - expect(screen.getByText(/cannot be changed/i)).toBeDefined(); + expect(screen.getByText(/no se puede cambiar/i)).toBeDefined(); }); }); @@ -161,7 +161,7 @@ describe("ProfilePage - Display", () => { renderWithProviders(); await waitFor(() => { - expect(screen.getByText(/communication purposes only/i)).toBeDefined(); + expect(screen.getByText(/fines de comunicación/i)).toBeDefined(); }); }); @@ -220,8 +220,8 @@ describe("ProfilePage - Navigation", () => { renderWithProviders(); await waitFor(() => { - // My Profile should be visible (as current page indicator) - const navItems = screen.getAllByText("My Profile"); + // Mi Perfil should be visible (as current page indicator) + const navItems = screen.getAllByText("Mi Perfil"); expect(navItems.length).toBeGreaterThan(0); }); }); @@ -294,7 +294,7 @@ describe("ProfilePage - Form Behavior", () => { renderWithProviders(); await waitFor(() => { - const submitButton = screen.getByRole("button", { name: /save changes/i }); + const submitButton = screen.getByRole("button", { name: /guardar cambios/i }); expect(submitButton).toHaveProperty("disabled", true); }); }); @@ -312,7 +312,7 @@ describe("ProfilePage - Form Behavior", () => { fireEvent.change(telegramInput, { target: { value: "@newhandle" } }); await waitFor(() => { - const submitButton = screen.getByRole("button", { name: /save changes/i }); + const submitButton = screen.getByRole("button", { name: /guardar cambios/i }); expect(submitButton).toHaveProperty("disabled", false); }); }); @@ -328,7 +328,7 @@ describe("ProfilePage - Form Behavior", () => { renderWithProviders(); await waitFor(() => { - expect(screen.getByRole("heading", { name: "My Profile" })).toBeDefined(); + expect(screen.getByRole("heading", { name: "Mi Perfil" })).toBeDefined(); }); const telegramInput = document.getElementById("telegram") as HTMLInputElement; @@ -350,7 +350,7 @@ describe("ProfilePage - Form Behavior", () => { renderWithProviders(); await waitFor(() => { - expect(screen.getByRole("heading", { name: "My Profile" })).toBeDefined(); + expect(screen.getByRole("heading", { name: "Mi Perfil" })).toBeDefined(); }); const telegramInput = document.getElementById("telegram") as HTMLInputElement; @@ -387,7 +387,7 @@ describe("ProfilePage - Form Submission", () => { renderWithProviders(); await waitFor(() => { - expect(screen.getByRole("heading", { name: "My Profile" })).toBeDefined(); + expect(screen.getByRole("heading", { name: "Mi Perfil" })).toBeDefined(); }); // Change email @@ -395,11 +395,11 @@ describe("ProfilePage - Form Submission", () => { fireEvent.change(emailInput, { target: { value: "new@example.com" } }); // Submit - const submitButton = screen.getByRole("button", { name: /save changes/i }); + const submitButton = screen.getByRole("button", { name: /guardar cambios/i }); fireEvent.click(submitButton); await waitFor(() => { - expect(screen.getByText(/saved successfully/i)).toBeDefined(); + expect(screen.getByText(/guardado exitosamente/i)).toBeDefined(); }); // Verify updateProfile was called @@ -433,7 +433,7 @@ describe("ProfilePage - Form Submission", () => { renderWithProviders(); await waitFor(() => { - expect(screen.getByRole("heading", { name: "My Profile" })).toBeDefined(); + expect(screen.getByRole("heading", { name: "Mi Perfil" })).toBeDefined(); }); // Enter a value that passes frontend validation but fails backend @@ -441,7 +441,7 @@ describe("ProfilePage - Form Submission", () => { fireEvent.change(telegramInput, { target: { value: "@validfrontend" } }); // Submit - const submitButton = screen.getByRole("button", { name: /save changes/i }); + const submitButton = screen.getByRole("button", { name: /guardar cambios/i }); fireEvent.click(submitButton); await waitFor(() => { @@ -461,7 +461,7 @@ describe("ProfilePage - Form Submission", () => { renderWithProviders(); await waitFor(() => { - expect(screen.getByRole("heading", { name: "My Profile" })).toBeDefined(); + expect(screen.getByRole("heading", { name: "Mi Perfil" })).toBeDefined(); }); // Change something @@ -469,7 +469,7 @@ describe("ProfilePage - Form Submission", () => { fireEvent.change(emailInput, { target: { value: "new@example.com" } }); // Submit - const submitButton = screen.getByRole("button", { name: /save changes/i }); + const submitButton = screen.getByRole("button", { name: /guardar cambios/i }); fireEvent.click(submitButton); await waitFor(() => { @@ -504,7 +504,7 @@ describe("ProfilePage - Form Submission", () => { renderWithProviders(); await waitFor(() => { - expect(screen.getByRole("heading", { name: "My Profile" })).toBeDefined(); + expect(screen.getByRole("heading", { name: "Mi Perfil" })).toBeDefined(); }); // Change something @@ -512,11 +512,11 @@ describe("ProfilePage - Form Submission", () => { fireEvent.change(emailInput, { target: { value: "new@example.com" } }); // Submit - const submitButton = screen.getByRole("button", { name: /save changes/i }); + const submitButton = screen.getByRole("button", { name: /guardar cambios/i }); fireEvent.click(submitButton); await waitFor(() => { - expect(screen.getByText("Saving...")).toBeDefined(); + expect(screen.getByText("Guardando...")).toBeDefined(); }); // Resolve the promise @@ -528,7 +528,7 @@ describe("ProfilePage - Form Submission", () => { }); await waitFor(() => { - expect(screen.getByRole("button", { name: /save changes/i })).toBeDefined(); + expect(screen.getByRole("button", { name: /guardar cambios/i })).toBeDefined(); }); }); }); diff --git a/frontend/e2e/exchange.spec.ts b/frontend/e2e/exchange.spec.ts index fed0c90..87a017f 100644 --- a/frontend/e2e/exchange.spec.ts +++ b/frontend/e2e/exchange.spec.ts @@ -35,7 +35,13 @@ async function setAvailability(page: Page, dateStr: string) { } test.describe("Exchange Page - Regular User Access", () => { - test.beforeEach(async ({ page }) => { + test.beforeEach(async ({ context, page }) => { + // Set English language before any navigation + await context.addInitScript(() => { + if (typeof window !== "undefined") { + window.localStorage.setItem("arbret-locale", "en"); + } + }); await clearAuth(page); await loginUser(page, REGULAR_USER.email, REGULAR_USER.password); }); @@ -63,7 +69,9 @@ test.describe("Exchange Page - Regular User Access", () => { // Test clicking buy/sell changes direction await page.getByRole("button", { name: "Sell BTC" }).click(); - await expect(page.getByText(/You buy €\d/)).toBeVisible(); + // The summary text is split across elements, so we check for the text parts separately + await expect(page.getByText(/You buy/)).toBeVisible(); + await expect(page.getByText(/€\d/)).toBeVisible(); // Test payment method selector await expect(page.getByText("Payment Method")).toBeVisible(); diff --git a/frontend/e2e/helpers/setup.ts b/frontend/e2e/helpers/setup.ts index 8174eb7..0dfec92 100644 --- a/frontend/e2e/helpers/setup.ts +++ b/frontend/e2e/helpers/setup.ts @@ -1,12 +1,16 @@ -import { Page } from "@playwright/test"; +import { test } from "@playwright/test"; /** * Set language to English for e2e tests. * E2E tests should only test in English according to requirements. - * Call this in beforeEach hooks in test files. + * This is applied globally via test.beforeEach in the setup file. */ -export async function setEnglishLanguage(page: Page) { - await page.addInitScript(() => { - window.localStorage.setItem("arbret-locale", "en"); +test.beforeEach(async ({ context }) => { + // Add init script to set English language before any page loads + // This must be called before any page.goto() calls + await context.addInitScript(() => { + if (typeof window !== "undefined") { + window.localStorage.setItem("arbret-locale", "en"); + } }); -} +}); diff --git a/frontend/e2e/profile.spec.ts b/frontend/e2e/profile.spec.ts index 4525e34..ef144e9 100644 --- a/frontend/e2e/profile.spec.ts +++ b/frontend/e2e/profile.spec.ts @@ -70,7 +70,13 @@ async function clearProfileData(page: Page) { } test.describe("Profile - Regular User Access", () => { - test.beforeEach(async ({ page }) => { + test.beforeEach(async ({ context, page }) => { + // Set English language before any navigation + await context.addInitScript(() => { + if (typeof window !== "undefined") { + window.localStorage.setItem("arbret-locale", "en"); + } + }); await clearAuth(page); await loginUser(page, REGULAR_USER.email, REGULAR_USER.password); }); diff --git a/frontend/playwright.config.ts b/frontend/playwright.config.ts index daf2340..ebc1a25 100644 --- a/frontend/playwright.config.ts +++ b/frontend/playwright.config.ts @@ -20,21 +20,5 @@ export default defineConfig({ // Reduce screenshot/recording overhead screenshot: "only-on-failure", trace: "retain-on-failure", - // Set language to English for all e2e tests via localStorage - // E2E tests should only test in English according to requirements - storageState: { - cookies: [], - origins: [ - { - origin: "http://localhost:3000", - localStorage: [ - { - name: "arbret-locale", - value: "en", - }, - ], - }, - ], - }, }, });