/*
Unit tests for resolver covering resolve. It also guards the documented public contract and regression-sensitive edge cases.
- Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only.
- RFC-1311: Compass header sweep — declares the resolver suite's contract for test-file scaffold coverage.
*/
import { describe, it, expect } from "vitest";
import { resolve, type ResolveOptions } from "../resolver.ts";
import type { ComponentDeclaration, ComponentId } from "@warpgogol/werkstatt-shared/component";
import type { DesiredState } from "@warpgogol/werkstatt-shared/kernel";
import type { Sha256Digest } from "@warpgogol/werkstatt-shared/fingerprint";
const VALID_SHA = ("sha256:" + "a".repeat(64)) as Sha256Digest;
const VALID_SHA_2 = ("sha256:" + "b".repeat(64)) as Sha256Digest;
function cid(id: string): ComponentId {
return id as ComponentId;
}
function makeManifest(overrides: Partial = {}): ComponentDeclaration {
const componentId = overrides.componentId ?? "werkstatt/engine";
return {
schema: "werkstatt/component-declaration@1",
componentId,
version: "1.0.0",
artifactHash: VALID_SHA,
scope: "per-workshop",
provides: [
{ capability: "werkstatt/kernel", version: "1.0.0", schemaHash: VALID_SHA as string },
],
requires: [],
requestedGrants: [],
effects: [
{
effectClass: "revertible",
description: "test",
recoveryCommand: null,
commitMetadata: null,
},
],
isolation: { tier: 0, adapterId: null },
resources: [{ kind: "cpu", limit: "100ms", owner: componentId, lifecycle: "process" }],
priority: 0,
active: true,
...overrides,
};
}
function makeDesiredState(overrides: Partial = {}): DesiredState {
const manifest = makeManifest();
return {
components: new Map([[manifest.componentId, manifest]]),
requiredCapabilities: [],
availableArtifacts: new Map([[cid("werkstatt/engine"), VALID_SHA]]),
admittedGrants: [],
profileId: "site",
...overrides,
};
}
function componentsFromArray(manifests: ComponentDeclaration[]): Map {
return new Map(manifests.map((m) => [m.componentId, m]));
}
function makeInput(
overrides: Partial & {
effectPolicyHash?: string;
isolationPolicyHash?: string;
} = {},
): ResolveOptions {
const { effectPolicyHash, isolationPolicyHash, ...stateOverrides } = overrides;
return {
desiredState: makeDesiredState(stateOverrides),
effectPolicyHash: effectPolicyHash ?? (VALID_SHA as string),
isolationPolicyHash: isolationPolicyHash ?? (VALID_SHA as string),
};
}
describe("resolve", () => {
it("resolves a single component with no dependencies", () => {
const result = resolve(makeInput());
expect(result.status).toBe("resolved");
if (result.status === "resolved") {
expect(result.set.components).toHaveLength(1);
expect(result.set.components[0]!.componentId).toBe("werkstatt/engine");
expect(result.proof.componentCount).toBe(1);
expect(result.proof.edgeCount).toBe(0);
}
});
it("resolves two components with a dependency", () => {
const engine = makeManifest({
componentId: "werkstatt/engine",
requires: [
{
capability: "werkstatt/fingerprint",
compatibility: "^1.0.0",
schemaHash: VALID_SHA as string,
optional: false,
},
],
});
const fp = makeManifest({
componentId: "werkstatt/fingerprint",
version: "1.0.0",
provides: [
{ capability: "werkstatt/fingerprint", version: "1.0.0", schemaHash: VALID_SHA as string },
],
requires: [],
});
const input = makeInput({
components: componentsFromArray([engine, fp]),
availableArtifacts: new Map([
[cid("werkstatt/engine"), VALID_SHA],
[cid("werkstatt/fingerprint"), VALID_SHA],
]),
});
const result = resolve(input);
expect(result.status).toBe("resolved");
if (result.status === "resolved") {
expect(result.set.components).toHaveLength(2);
expect(result.proof.edgeCount).toBe(1);
expect(result.proof.maxDepth).toBe(1);
}
});
it("is deterministic under input permutation", () => {
const a = makeManifest({
componentId: "werkstatt/alpha",
provides: [
{ capability: "werkstatt/alpha-cap", version: "1.0.0", schemaHash: VALID_SHA as string },
],
requires: [],
});
const b = makeManifest({
componentId: "werkstatt/beta",
provides: [
{ capability: "werkstatt/beta-cap", version: "1.0.0", schemaHash: VALID_SHA as string },
],
requires: [
{
capability: "werkstatt/alpha-cap",
compatibility: "^1.0.0",
schemaHash: VALID_SHA as string,
optional: false,
},
],
});
const artifacts = new Map([
[cid("werkstatt/alpha"), VALID_SHA],
[cid("werkstatt/beta"), VALID_SHA],
]);
const input1 = makeInput({
components: componentsFromArray([a, b]),
availableArtifacts: artifacts,
});
const input2 = makeInput({
components: componentsFromArray([b, a]),
availableArtifacts: artifacts,
});
const r1 = resolve(input1);
const r2 = resolve(input2);
expect(r1.status).toBe("resolved");
expect(r2.status).toBe("resolved");
if (r1.status === "resolved" && r2.status === "resolved") {
expect(r1.set.setHash).toBe(r2.set.setHash);
}
});
it("blocks on missing artifact", () => {
const result = resolve(
makeInput({
availableArtifacts: new Map(),
}),
);
expect(result.status).toBe("blocked");
if (result.status === "blocked") {
expect(result.violations.some((v) => v.code === "RESOLUTION-02")).toBe(true);
}
});
it("blocks on artifact hash mismatch", () => {
const result = resolve(
makeInput({
availableArtifacts: new Map([["werkstatt/engine", VALID_SHA_2]]),
}),
);
expect(result.status).toBe("blocked");
});
it("blocks on missing required capability", () => {
const manifest = makeManifest({
requires: [
{
capability: "werkstatt/missing",
compatibility: "^1.0.0",
schemaHash: VALID_SHA as string,
optional: false,
},
],
});
const result = resolve(makeInput({ components: componentsFromArray([manifest]) }));
expect(result.status).toBe("blocked");
if (result.status === "blocked") {
expect(result.violations.some((v) => v.code === "RESOLUTION-04")).toBe(true);
}
});
it("blocks on incompatible version", () => {
const engine = makeManifest({
componentId: "werkstatt/engine",
requires: [
{
capability: "werkstatt/fingerprint",
compatibility: "^2.0.0",
schemaHash: VALID_SHA as string,
optional: false,
},
],
});
const fp = makeManifest({
componentId: "werkstatt/fingerprint",
version: "1.5.0",
provides: [
{ capability: "werkstatt/fingerprint", version: "1.5.0", schemaHash: VALID_SHA as string },
],
requires: [],
});
const result = resolve(
makeInput({
components: componentsFromArray([engine, fp]),
availableArtifacts: new Map([
[cid("werkstatt/engine"), VALID_SHA],
[cid("werkstatt/fingerprint"), VALID_SHA],
]),
}),
);
expect(result.status).toBe("blocked");
if (result.status === "blocked") {
expect(result.violations.some((v) => v.code === "RESOLUTION-05")).toBe(true);
}
});
it("blocks on multiple compatible providers", () => {
const a = makeManifest({
componentId: "werkstatt/provider-a",
provides: [
{ capability: "werkstatt/shared", version: "1.0.0", schemaHash: VALID_SHA as string },
],
requires: [],
});
const b = makeManifest({
componentId: "werkstatt/provider-b",
provides: [
{ capability: "werkstatt/shared", version: "1.0.0", schemaHash: VALID_SHA as string },
],
requires: [],
});
const consumer = makeManifest({
componentId: "werkstatt/consumer",
provides: [
{ capability: "werkstatt/consumer-cap", version: "1.0.0", schemaHash: VALID_SHA as string },
],
requires: [
{
capability: "werkstatt/shared",
compatibility: "^1.0.0",
schemaHash: VALID_SHA as string,
optional: false,
},
],
});
const result = resolve(
makeInput({
components: componentsFromArray([a, b, consumer]),
availableArtifacts: new Map([
[cid("werkstatt/provider-a"), VALID_SHA],
[cid("werkstatt/provider-b"), VALID_SHA],
[cid("werkstatt/consumer"), VALID_SHA],
]),
}),
);
expect(result.status).toBe("blocked");
if (result.status === "blocked") {
expect(result.violations.some((v) => v.code === "RESOLUTION-06")).toBe(true);
}
});
it("blocks on dependency cycle", () => {
const a = makeManifest({
componentId: "werkstatt/cycle-a",
provides: [
{ capability: "werkstatt/cap-a", version: "1.0.0", schemaHash: VALID_SHA as string },
],
requires: [
{
capability: "werkstatt/cap-b",
compatibility: "^1.0.0",
schemaHash: VALID_SHA as string,
optional: false,
},
],
});
const b = makeManifest({
componentId: "werkstatt/cycle-b",
provides: [
{ capability: "werkstatt/cap-b", version: "1.0.0", schemaHash: VALID_SHA as string },
],
requires: [
{
capability: "werkstatt/cap-a",
compatibility: "^1.0.0",
schemaHash: VALID_SHA as string,
optional: false,
},
],
});
const result = resolve(
makeInput({
components: componentsFromArray([a, b]),
availableArtifacts: new Map([
[cid("werkstatt/cycle-a"), VALID_SHA],
[cid("werkstatt/cycle-b"), VALID_SHA],
]),
}),
);
expect(result.status).toBe("blocked");
if (result.status === "blocked") {
expect(result.violations.some((v) => v.code === "RESOLUTION-07")).toBe(true);
}
});
it("blocks on unadmitted grant", () => {
const manifest = makeManifest({
requestedGrants: [{ scope: "read", resource: "dossier", attenuated: true }],
});
const result = resolve(
makeInput({
components: componentsFromArray([manifest]),
admittedGrants: [],
}),
);
expect(result.status).toBe("blocked");
if (result.status === "blocked") {
expect(result.violations.some((v) => v.code === "RESOLUTION-03")).toBe(true);
}
});
it("optional missing capability does not block", () => {
const manifest = makeManifest({
requires: [
{
capability: "werkstatt/optional",
compatibility: "^1.0.0",
schemaHash: VALID_SHA as string,
optional: true,
},
],
});
const result = resolve(makeInput({ components: componentsFromArray([manifest]) }));
expect(result.status).toBe("resolved");
});
it("semverSatisfies: caret range", () => {
const engine = makeManifest({
componentId: "werkstatt/engine",
requires: [
{
capability: "werkstatt/fingerprint",
compatibility: "^1.2.0",
schemaHash: VALID_SHA as string,
optional: false,
},
],
});
const fp = makeManifest({
componentId: "werkstatt/fingerprint",
version: "1.2.5",
provides: [
{ capability: "werkstatt/fingerprint", version: "1.2.5", schemaHash: VALID_SHA as string },
],
requires: [],
});
const result = resolve(
makeInput({
components: componentsFromArray([engine, fp]),
availableArtifacts: new Map([
[cid("werkstatt/engine"), VALID_SHA],
[cid("werkstatt/fingerprint"), VALID_SHA],
]),
}),
);
expect(result.status).toBe("resolved");
});
});