import { beforeEach, describe, expect, it, vi } from "vitest"; const mocks = vi.hoisted(() => ({ getClientCookie: vi.fn(), setCachedEntryPath: vi.fn(), })); vi.mock("./cookies", () => ({ getClientCookie: mocks.getClientCookie, })); vi.mock("./entry-route-cache", () => ({ setCachedMarriageEntryPath: mocks.setCachedEntryPath, })); describe("authBridge", () => { let listeners: Array<(e: any) => void> = []; beforeEach(() => { vi.resetModules(); vi.clearAllMocks(); listeners = []; mocks.getClientCookie.mockReturnValue(null); window.HABIB_TOKEN = undefined; window.addFlutterResponseListener = vi.fn((cb) => { listeners.push(cb); return () => { listeners = listeners.filter((l) => l !== cb); }; }); window.sessionStorage.clear(); delete (window as any).HABIB_MARRIAGE; delete (window as any).__HABIB_MARRIAGE_INITIAL_DATA__; delete (window as any).__HABIB_BOOTSTRAP__; }); it("treats a missing token as anonymous and clears the entry cache", async () => { const { authBridge } = await import("./auth-bridge"); expect(authBridge.isAuthenticated()).toBe(false); expect(mocks.setCachedEntryPath).toHaveBeenCalledWith(null); }); it("treats an empty token as anonymous", async () => { window.HABIB_TOKEN = ""; const { authBridge } = await import("./auth-bridge"); expect(authBridge.isAuthenticated()).toBe(false); }); it("captures marriage initial data from Flutter initial_config event", async () => { const { authBridge } = await import("./auth-bridge"); const marriagePayload = { id: 123, status: "match_found", match_summary: { id: 456, gender: "female", public_info: [] }, }; // Simulate Flutter firing INITIAL_CONFIG event listeners.forEach((listener) => { listener({ action: "INITIAL_CONFIG", success: true, data: { marriage: marriagePayload }, }); }); expect(authBridge.getMarriageData()).toEqual(marriagePayload); expect((window as any).HABIB_MARRIAGE).toEqual(marriagePayload); }); it("captures marriage data when passed via payload property instead of data", async () => { const { authBridge } = await import("./auth-bridge"); const marriagePayload = { id: 789, status: "match_found", }; listeners.forEach((listener) => { listener({ action: "initial_config", success: true, payload: { marriage: marriagePayload }, }); }); expect(authBridge.getMarriageData()).toEqual(marriagePayload); }); it("extracts and parses URI-encoded HABIB_MARRIAGE_DATA cookie with Persian text", async () => { const marriagePayload = { id: 999, status: "match_found", city: "اصفهان", name: "سارا", }; mocks.getClientCookie.mockImplementation((name: string) => { if (name === "HABIB_MARRIAGE_DATA") { return encodeURIComponent(JSON.stringify(marriagePayload)); } return null; }); const { authBridge } = await import("./auth-bridge"); expect(authBridge.getMarriageData()).toEqual(marriagePayload); }); it("falls back to parsing unencoded HABIB_MARRIAGE_DATA cookie", async () => { const marriagePayload = { id: 888, status: "intro", city: "تبریز", }; mocks.getClientCookie.mockImplementation((name: string) => { if (name === "HABIB_MARRIAGE_DATA") { return JSON.stringify(marriagePayload); } return null; }); const { authBridge } = await import("./auth-bridge"); expect(authBridge.getMarriageData()).toEqual(marriagePayload); }); });