diff --git a/e2e/auth/login.spec.ts b/e2e/auth/login.spec.ts index acd6de68..852fe779 100644 --- a/e2e/auth/login.spec.ts +++ b/e2e/auth/login.spec.ts @@ -6,8 +6,17 @@ const TEST_USER = { name: "Test User", }; -async function mockUnauthenticatedSession(page: Page) { +async function mockSession(page: Page, isAuthenticated: () => boolean = () => false) { await page.route("**/api/Authentication/GetCurrentUser", async (route) => { + if (isAuthenticated()) { + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ data: TEST_USER }), + }); + return; + } + await route.fulfill({ status: 401, contentType: "application/json", @@ -35,7 +44,7 @@ async function mockDashboardStats(page: Page) { test.describe("Login page", () => { test.beforeEach(async ({ page }) => { - await mockUnauthenticatedSession(page); + await mockSession(page); await mockDashboardStats(page); }); @@ -77,7 +86,13 @@ test.describe("Login page", () => { }); test("logs in successfully and navigates to dashboard", async ({ page }) => { + let authenticated = false; + + await page.unroute("**/api/Authentication/GetCurrentUser"); + await mockSession(page, () => authenticated); + await page.route("**/api/Authentication/Login", async (route) => { + authenticated = true; await route.fulfill({ status: 200, contentType: "application/json", diff --git a/scripts/migrate-routes.mjs b/scripts/migrate-routes.mjs index f122bc11..f05182ef 100644 --- a/scripts/migrate-routes.mjs +++ b/scripts/migrate-routes.mjs @@ -32,9 +32,7 @@ function toDefaultExport(content, exportName) { `export default function ${exportName}`, ); } - return result - .replace(/^export \{ ([A-Za-z]+) as default \} from .+;\s*$/m, "") - .trimEnd() + "\n"; + return result.replace(/^export \{ ([A-Za-z]+) as default \} from .+;\s*$/m, "").trimEnd() + "\n"; } function copyRoutesTree() { @@ -58,7 +56,13 @@ function updateProtectedLayout() { write(layoutPath, content); } -function mergePage(sourceRel, destRel, exportName, importReplacements = [], { namedOnly = false } = {}) { +function mergePage( + sourceRel, + destRel, + exportName, + importReplacements = [], + { namedOnly = false } = {}, +) { const source = path.join(app, sourceRel); if (!fs.existsSync(source)) { console.warn("Missing source:", sourceRel); @@ -87,7 +91,7 @@ function writeReExport(destRel, componentPath, { nestedEdit = false } = {}) { write(path.join(src, "app-root.tsx"), read(path.join(app, "app-root.tsx"))); let main = read(path.join(src, "main.tsx")); -main = main.replace('@/app/app-root', '@/app-root'); +main = main.replace("@/app/app-root", "@/app-root"); write(path.join(src, "main.tsx"), main); let vite = read(path.join(root, "vite.config.ts")); @@ -106,29 +110,57 @@ updateProtectedLayout(); // --- accounts pilot --- mergePage("accounts/accounts-list-page.tsx", "(protected)/accounts/index.tsx", "AccountsListPage"); -mergePage("accounts/account-form-page.tsx", "(protected)/accounts/_components/account-form.tsx", "AccountFormPage"); +mergePage( + "accounts/account-form-page.tsx", + "(protected)/accounts/_components/account-form.tsx", + "AccountFormPage", +); writeReExport("(protected)/accounts/new.tsx", "./_components/account-form"); writeReExport("(protected)/accounts/edit/[id].tsx", "./_components/account-form"); // --- contacts, employees, locations --- mergePage("contacts/contacts-list-page.tsx", "(protected)/contacts/index.tsx", "ContactsListPage"); -mergePage("contacts/contact-form-page.tsx", "(protected)/contacts/_components/contact-form.tsx", "ContactFormPage"); +mergePage( + "contacts/contact-form-page.tsx", + "(protected)/contacts/_components/contact-form.tsx", + "ContactFormPage", +); writeReExport("(protected)/contacts/new.tsx", "./_components/contact-form"); writeReExport("(protected)/contacts/edit/[id].tsx", "./_components/contact-form"); -mergePage("employees/employees-list-page.tsx", "(protected)/employees/index.tsx", "EmployeesListPage"); -mergePage("employees/employee-form-page.tsx", "(protected)/employees/_components/employee-form.tsx", "EmployeeFormPage"); +mergePage( + "employees/employees-list-page.tsx", + "(protected)/employees/index.tsx", + "EmployeesListPage", +); +mergePage( + "employees/employee-form-page.tsx", + "(protected)/employees/_components/employee-form.tsx", + "EmployeeFormPage", +); writeReExport("(protected)/employees/new.tsx", "./_components/employee-form"); writeReExport("(protected)/employees/edit/[id].tsx", "./_components/employee-form"); -mergePage("locations/locations-list-page.tsx", "(protected)/locations/index.tsx", "LocationsListPage"); -mergePage("locations/location-form-page.tsx", "(protected)/locations/_components/location-form.tsx", "LocationFormPage"); +mergePage( + "locations/locations-list-page.tsx", + "(protected)/locations/index.tsx", + "LocationsListPage", +); +mergePage( + "locations/location-form-page.tsx", + "(protected)/locations/_components/location-form.tsx", + "LocationFormPage", +); writeReExport("(protected)/locations/new.tsx", "./_components/location-form"); writeReExport("(protected)/locations/edit/[id].tsx", "./_components/location-form"); // --- assets, vendors, followups, pmschedules --- mergePage("assets/assets-list-page.tsx", "(protected)/assets/index.tsx", "AssetsListPage"); -mergePage("assets/asset-form-page.tsx", "(protected)/assets/_components/asset-form.tsx", "AssetFormPage"); +mergePage( + "assets/asset-form-page.tsx", + "(protected)/assets/_components/asset-form.tsx", + "AssetFormPage", +); writeReExport("(protected)/assets/new.tsx", "./_components/asset-form"); writeReExport("(protected)/assets/edit/[id].tsx", "./_components/asset-form"); @@ -146,29 +178,65 @@ copyFile( writeReExport("(protected)/vendors/new.tsx", "./_components/vendor-form"); writeReExport("(protected)/vendors/edit/[id].tsx", "./_components/vendor-form"); -mergePage("follow-ups/follow-ups-list-page.tsx", "(protected)/followups/index.tsx", "FollowUpsListPage"); -mergePage("follow-ups/follow-up-form-page.tsx", "(protected)/followups/_components/follow-up-form.tsx", "FollowUpFormPage"); +mergePage( + "follow-ups/follow-ups-list-page.tsx", + "(protected)/followups/index.tsx", + "FollowUpsListPage", +); +mergePage( + "follow-ups/follow-up-form-page.tsx", + "(protected)/followups/_components/follow-up-form.tsx", + "FollowUpFormPage", +); writeReExport("(protected)/followups/new.tsx", "./_components/follow-up-form"); writeReExport("(protected)/followups/edit/[id].tsx", "./_components/follow-up-form"); -mergePage("pm-schedules/pm-schedules-list-page.tsx", "(protected)/pmschedules/index.tsx", "PmSchedulesListPage"); -mergePage("pm-schedules/pm-schedule-form-page.tsx", "(protected)/pmschedules/_components/pm-schedule-form.tsx", "PmScheduleFormPage"); +mergePage( + "pm-schedules/pm-schedules-list-page.tsx", + "(protected)/pmschedules/index.tsx", + "PmSchedulesListPage", +); +mergePage( + "pm-schedules/pm-schedule-form-page.tsx", + "(protected)/pmschedules/_components/pm-schedule-form.tsx", + "PmScheduleFormPage", +); writeReExport("(protected)/pmschedules/new.tsx", "./_components/pm-schedule-form"); writeReExport("(protected)/pmschedules/edit/[id].tsx", "./_components/pm-schedule-form"); // --- calendar, uplifts, vendor-pos, settings, dashboard, login --- mergePage("calendar/calendar-page.tsx", "(protected)/calendar/index.tsx", "CalendarPage"); -mergePage("calendar/event-form-page.tsx", "(protected)/calendar/_components/event-form.tsx", "EventFormPage"); +mergePage( + "calendar/event-form-page.tsx", + "(protected)/calendar/_components/event-form.tsx", + "EventFormPage", +); writeReExport("(protected)/calendar/new.tsx", "./_components/event-form"); writeReExport("(protected)/calendar/edit/[id].tsx", "./_components/event-form"); mergePage("uplifts/uplift-queue-page.tsx", "(protected)/uplifts/index.tsx", "UpliftQueuePage"); -mergePage("vendor-pos/vendor-pos-list-page.tsx", "(protected)/vendor-pos/index.tsx", "VendorPosListPage"); -mergePage("vendor-pos/vendor-po-view-page.tsx", "(protected)/vendor-pos/[id].tsx", "VendorPoViewPage"); +mergePage( + "vendor-pos/vendor-pos-list-page.tsx", + "(protected)/vendor-pos/index.tsx", + "VendorPosListPage", +); +mergePage( + "vendor-pos/vendor-po-view-page.tsx", + "(protected)/vendor-pos/[id].tsx", + "VendorPoViewPage", +); -mergePage("settings/dropdown-options-page.tsx", "(protected)/settings/dropdowns.tsx", "DropdownOptionsPage"); -mergePage("settings/task-templates-page.tsx", "(protected)/settings/task-templates.tsx", "TaskTemplatesPage"); +mergePage( + "settings/dropdown-options-page.tsx", + "(protected)/settings/dropdowns.tsx", + "DropdownOptionsPage", +); +mergePage( + "settings/task-templates-page.tsx", + "(protected)/settings/task-templates.tsx", + "TaskTemplatesPage", +); mergePage("dashboard/dashboard-page.tsx", "(protected)/index.tsx", "DashboardPage"); mergePage("dashboard/dashboard-page.tsx", "(protected)/dashboard.tsx", "DashboardPage"); @@ -176,8 +244,16 @@ mergePage("dashboard/dashboard-page.tsx", "(protected)/dashboard.tsx", "Dashboar mergePage("login/login-page.tsx", "(auth)/login.tsx", "LoginPage"); // --- workorders --- -mergePage("work-orders/work-orders-list-page.tsx", "(protected)/workorders/index.tsx", "WorkOrdersListPage"); -mergePage("work-orders/work-order-form-page.tsx", "(protected)/workorders/_components/work-order-form.tsx", "WorkOrderFormPage"); +mergePage( + "work-orders/work-orders-list-page.tsx", + "(protected)/workorders/index.tsx", + "WorkOrdersListPage", +); +mergePage( + "work-orders/work-order-form-page.tsx", + "(protected)/workorders/_components/work-order-form.tsx", + "WorkOrderFormPage", +); writeReExport("(protected)/workorders/new.tsx", "./_components/work-order-form"); writeReExport("(protected)/workorders/edit/[id].tsx", "./_components/work-order-form"); mergePage( @@ -211,7 +287,10 @@ fs.copyFileSync( let vpLayout = read(path.join(app, "vendor-portal/vendor-portal-layout.tsx")); vpLayout = vpLayout - .replace("@/app/vendor-portal/vendor-portal-provider", "@/app/v/_components/vendor-portal-provider") + .replace( + "@/app/vendor-portal/vendor-portal-provider", + "@/app/v/_components/vendor-portal-provider", + ) .replace("@/app/vendor-portal/vendor-portal.css", "@/app/v/_components/vendor-portal.css") .replace("export function VendorPortalLayout", "export default function VendorPortalLayout"); write(path.join(app, "v", "[token]", "_layout.tsx"), vpLayout); @@ -222,12 +301,9 @@ mergePage( "VendorPortalDashboardPage", [["@/app/vendor-portal/vendor-portal-provider", "@/app/v/_components/vendor-portal-provider"]], ); -mergePage( - "vendor-portal/vendor-portal-pos-page.tsx", - "v/[token]/pos.tsx", - "VendorPortalPosPage", - [["@/app/vendor-portal/vendor-portal-provider", "@/app/v/_components/vendor-portal-provider"]], -); +mergePage("vendor-portal/vendor-portal-pos-page.tsx", "v/[token]/pos.tsx", "VendorPortalPosPage", [ + ["@/app/vendor-portal/vendor-portal-provider", "@/app/v/_components/vendor-portal-provider"], +]); mergePage( "vendor-portal/vendor-portal-dispatch-page.tsx", "v/[token]/dispatch/[id].tsx",