56 lines
2.0 KiB
TypeScript
56 lines
2.0 KiB
TypeScript
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("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");
|
|
});
|
|
});
|