123import { afterEach, describe, expect, it, vi } from "vitest";45import { flushView, renderView } from "./view-test-utils";6import type { AdvancedHealthReport, VaultEntry } from "../../shared/types";78const sendMessageMock = vi.fn<(msg: unknown) => Promise<unknown>>();910vi.mock("../App", () => ({11 sendMessage: (msg: unknown) => sendMessageMock(msg),12}));1314function entry(overrides: Partial<VaultEntry> = {}): VaultEntry {15 return {16 id: "entry-1",17 type: "login",18 title: "Example",19 username: "[email protected]",20 password: "correct-horse-battery-staple",21 url: "https://example.com/login",22 createdAt: Date.now() - 10_000,23 modifiedAt: Date.now() - 10_000,24 ...overrides,25 };26}2728describe("HealthView", () => {29 let dispose: (() => void) | undefined;3031 afterEach(() => {32 dispose?.();33 dispose = undefined;34 sendMessageMock.mockReset();35 document.body.innerHTML = "";36 });3738 it("opens the local entry editor from the Pro remediation queue", async () => {39 const report: AdvancedHealthReport = {40 vaultScore: 65,41 generatedAt: Date.now(),42 entryCount: 1,43 reusedGroups: 0,44 agedCount: 1,45 remediation: [46 {47 id: "entry-1",48 title: "Example",49 domain: "example.com",50 url: "https://example.com/login",51 score: 65,52 ageDays: 200,53 reasons: ["200 days old"],54 factors: {55 breached: false,56 breachCount: 0,57 reused: false,58 aged: true,59 weak: false,60 missingTotpOnSensitive: false,61 },62 },63 ],64 };65 sendMessageMock.mockResolvedValue({ ok: true, data: report });66 const onFixEntry = vi.fn();6768 const { HealthView } = await import("./Health");69 const mounted = renderView(70 <HealthView71 entries={[entry()]}72 isPro={true}73 onFixEntry={onFixEntry}74 onBack={vi.fn()}75 onRefresh={vi.fn()}76 />,77 );78 dispose = mounted.dispose;7980 await flushView();81 await flushView();8283 expect(mounted.container.textContent).toContain("Remediation queue");84 expect(mounted.container.textContent).toContain("Example");85 expect(mounted.container.textContent).not.toContain("Change password");8687 const button = mounted.container.querySelector<HTMLButtonElement>(".peach-health-pro-row button");88 expect(button?.textContent).toContain("Update");89 button?.click();90 expect(onFixEntry).toHaveBeenCalledWith(expect.objectContaining({ id: "entry-1" }));91 });92});