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",
- },
- ],
- },
- ],
- },
},
});