fable-agent/src/fable5/factory-capabilities.test.ts

44 lines
1.7 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { formatCapabilityReport, parseFactoryCapabilities, probeFactoryCapabilities } from "./factory-capabilities.js";
const yaml = `services:
git-proxy-deploy:
url: http://77.42.112.29:8099/deploy
provides: [deploy]
required: true
git-proxy:
url: http://77.42.112.29:8099/factory-status
provides: [factory-status, discovery]
required: true
`;
describe("factory capabilities", () => {
it("parses the capability registry", () => {
const services = parseFactoryCapabilities(yaml);
expect(services).toHaveLength(2);
expect(services[0]).toMatchObject({ name: "git-proxy-deploy", required: true, provides: ["deploy"] });
});
it("fails required capabilities that return 404", async () => {
const services = parseFactoryCapabilities(yaml);
const report = await probeFactoryCapabilities(services, async (url) => ({ ok: url.includes("/deploy"), status: url.includes("/deploy") ? 401 : 404 }));
expect(report.requiredOk).toBe(false);
expect(report.available).toContain("deploy");
expect(report.missing).toContain("factory-status");
expect(formatCapabilityReport(report)).toContain("FAIL git-proxy provides factory-status, discovery: HTTP 404");
});
it("fails closed for malformed registry entries", async () => {
const services = parseFactoryCapabilities(`services:
broken:
provides: [factory-status]
`);
const report = await probeFactoryCapabilities(services, async () => ({ ok: true, status: 200 }));
expect(report.requiredOk).toBe(false);
expect(report.missing).toContain("factory-status");
expect(formatCapabilityReport(report)).toContain("FAIL broken provides factory-status: missing url");
});
});