Health.test.tsx

2.5 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("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});