import { resolve } from "node:path"; import { Check } from "typebox/value"; import { describe, expect, it } from "vitest"; import { decideToolPolicy, executeMockAdsMetrics, mockAdsMetricsInputSchema, } from "../src/index.js"; const fixturePath = resolve(import.meta.dirname, "../../../fixtures/ads-account.json"); describe("mock_ads_metrics", () => { it("uses an integer 1-30 day TypeBox schema", () => { expect(Check(mockAdsMetricsInputSchema, { accountId: "demo-account", days: 7 })).toBe(true); expect(Check(mockAdsMetricsInputSchema, { accountId: "demo-account", days: 0 })).toBe(false); expect(Check(mockAdsMetricsInputSchema, { accountId: "demo-account", days: 7.5 })).toBe(false); expect(Check(mockAdsMetricsInputSchema, { accountId: "demo-account", days: 31 })).toBe(false); }); it("returns hand-checked zero-safe metrics and campaign details", async () => { const result = await executeMockAdsMetrics(fixturePath, { accountId: "demo-account", days: 7 }); expect(result).toMatchObject({ spend: 10000, impressions: 400000, clicks: 8100, ctr: 2.03, conversions: 295, cpa: 33.9, revenue: 21800, roas: 2.18, days: 7, }); expect(result.campaigns).toContainEqual(expect.objectContaining({ campaignId: "cmp-low-ctr", ctr: 1, cpa: 80, })); }); it("rejects unknown accounts with a stable error code", async () => { await expect(executeMockAdsMetrics(fixturePath, { accountId: "missing", days: 7 })) .rejects.toMatchObject({ code: "ADS_ACCOUNT_NOT_FOUND" }); }); }); describe("tool policy", () => { it("requires approval for real analytics and report generation but never allows arbitrary MCP mutations", () => { expect(decideToolPolicy("swads_whoami")).toBe("allow"); expect(decideToolPolicy("metrics_catalog")).toBe("allow"); expect(decideToolPolicy("metrics_semantic_query")).toBe("ask"); expect(decideToolPolicy("generate_minis_report")).toBe("ask"); expect(decideToolPolicy("campaign_update")).toBe("deny"); }); it("allows only the explicit safe set, asks for report save, and denies unknown tools", () => { expect(["read", "grep", "find", "ls", "mock_ads_metrics"].map(decideToolPolicy)).toEqual([ "allow", "allow", "allow", "allow", "allow", ]); expect(decideToolPolicy("save_report_draft")).toBe("ask"); expect(decideToolPolicy("bash")).toBe("deny"); expect(decideToolPolicy("unknown_tool")).toBe("deny"); }); });