Health.test.tsx

2.3 KB · raw

1// @vitest-environment jsdom23import { 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("renders the Pro remediation queue without the retired password-change button", 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 });6667    const { HealthView } = await import("./Health");68    const mounted = renderView(69      <HealthView70        entries={[entry()]}71        isPro={true}72        onFixEntry={vi.fn()}73        onBack={vi.fn()}74        onRefresh={vi.fn()}75      />,76    );77    dispose = mounted.dispose;7879    await flushView();80    await flushView();8182    expect(mounted.container.textContent).toContain("Remediation queue");83    expect(mounted.container.textContent).toContain("Example");84    expect(mounted.container.querySelectorAll(".peach-health-pro-row button")).toHaveLength(0);85  });86});