- RequireAuth: use setTimeout to defer clientReady=true until after hydration completes, preventing SSR/client mismatch - dashboard.tsx: add SSR guard to return empty div on server - playwright tests for dashboard role verification
55 lines
No EOL
2 KiB
TypeScript
55 lines
No EOL
2 KiB
TypeScript
import { test, expect, Page } from "@playwright/test";
|
|
|
|
test("TUTOR dashboard - final verification", async ({ page }) => {
|
|
const errors: string[] = [];
|
|
page.on("pageerror", (err) => errors.push(err.message));
|
|
|
|
await page.goto("http://localhost:3000/");
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
const loginRes = await page.request.post("http://localhost:3000/api/auth/login", {
|
|
data: { email: "testtutora2026@example.com", password: "Test1234!" },
|
|
headers: { "Content-Type": "application/json", Accept: "application/json" },
|
|
});
|
|
const loginData = await loginRes.json();
|
|
const token = loginData.access_token;
|
|
const role = loginData.user?.active_role || "TUTOR";
|
|
|
|
await page.evaluate(
|
|
({ token, role }) => {
|
|
const payload = {
|
|
email: "testtutora2026@example.com",
|
|
fullName: "Test User",
|
|
name: "Test User",
|
|
roleKey: role.toLowerCase(),
|
|
role: role.toLowerCase(),
|
|
active_role: role,
|
|
selectedProfessionalRole: role,
|
|
user: { id: "test-id", email: "testtutora2026@example.com", full_name: "Test User", active_role: role },
|
|
};
|
|
window.sessionStorage.setItem("nxtgauge_access_token", token);
|
|
window.sessionStorage.setItem("nxtgauge_frontend_access_token", token);
|
|
window.localStorage.setItem("nxtgauge_auth_user", JSON.stringify(payload));
|
|
window.localStorage.setItem("nxtgauge_user", JSON.stringify(payload));
|
|
window.localStorage.setItem("nxtgauge_signup_profile_v1", JSON.stringify(payload));
|
|
},
|
|
{ token, role }
|
|
);
|
|
|
|
await page.goto(`http://localhost:3000/dashboard?role=${role}`, { timeout: 10000 });
|
|
await page.waitForLoadState("domcontentloaded");
|
|
await page.waitForTimeout(5000);
|
|
|
|
await page.screenshot({ path: "test-results/dashboard-tutor-final.png", fullPage: true });
|
|
|
|
// Check URL
|
|
console.log("URL:", page.url());
|
|
|
|
// Check for errors
|
|
if (errors.length > 0) {
|
|
console.log("Page errors:", errors.slice(0, 3));
|
|
}
|
|
|
|
// Assertions
|
|
expect(page.url()).toContain("dashboard");
|
|
}); |