import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { describe, expect, it, vi } from "vitest"; import { ApprovalDialog } from "../src/components/approvals/ApprovalDialog.js"; import { AdsMetricsTool } from "../src/components/tools/AdsMetricsTool.js"; import type { ClientApproval } from "../src/store/reducer.js"; const pendingApproval: ClientApproval = { approvalId: "ap_1", toolCallId: "tool_1", toolName: "save_report_draft", arguments: { title: "周报", body: "内容" }, riskLevel: "medium", expiresAt: "2026-09-07T09:00:00.000Z", status: "pending", }; describe("tool and approval UI", () => { it("disables both decisions after submitting approval", async () => { const user = userEvent.setup(); let resolveApproval: (() => void) | undefined; const approve = vi.fn(() => new Promise((resolve) => { resolveApproval = resolve; })); render(); await user.click(screen.getByRole("button", { name: "批准并保存" })); expect(screen.getByRole("button", { name: "批准并保存" })).toBeDisabled(); expect(screen.getByRole("button", { name: "拒绝" })).toBeDisabled(); expect(approve).toHaveBeenCalledTimes(1); resolveApproval?.(); }); it("renders safe ads metrics fields", () => { render(); expect(screen.getByText("demo-account")).toBeVisible(); expect(screen.getByText("3.01")).toBeVisible(); }); });