import { describe, expect, it } from "bun:test"; import { CHAT_PROVIDER_IDS } from "./chat-types"; import { getProviderOnboardingContract, listProviderOnboardingContracts, } from "./provider-contract"; describe("provider onboarding contract", () => { it("covers all chat providers in canonical provider order", () => { const contracts = listProviderOnboardingContracts(); expect(contracts).toHaveLength(CHAT_PROVIDER_IDS.length); expect(contracts.map((contract) => contract.providerId)).toEqual([ ...CHAT_PROVIDER_IDS, ]); }); it("defines required checklist fields for each provider", () => { for (const providerId of CHAT_PROVIDER_IDS) { const contract = getProviderOnboardingContract(providerId); expect(contract.providerId).toBe(providerId); expect(contract.defaultScanRoots.length).toBeGreaterThan(0); expect(contract.pathDiscovery.length).toBeGreaterThan(10); expect(contract.sessionIdStrategy.length).toBeGreaterThan(5); expect( Object.keys(contract.roleMapping.sourceRoles).length, ).toBeGreaterThan(0); expect(contract.dedupe.messageIdentity.length).toBeGreaterThan(10); expect(["none", "skip-known-snapshots", "content-signature"]).toContain( contract.dedupe.snapshotHandling, ); expect(["skip", "fail"]).toContain(contract.replay.malformedRecordPolicy); expect(["skip", "synthesize"]).toContain( contract.replay.missingTimestampPolicy, ); expect([ "file-mtime+message-timestamp", "message-timestamp-only", ]).toContain(contract.replay.sinceFiltering); } }); });