import { describe, expect, it } from "vitest";
import { createCandidateManifest, InvalidCandidateManifestError } from "@awp/domain";

describe("candidate safety manifest", () => {
  it("is immutable and carries a complete structured changed-path set", () => {
    const manifest = createCandidateManifest({
      treeDigest: "tree-1",
      patchDigest: "patch-1",
      changedPaths: ["src/a.ts", "old.txt"],
      changes: [
        { path: "src/a.ts", kind: "modify" },
        { path: "old.txt", kind: "delete" },
      ],
    });
    expect(Object.isFrozen(manifest)).toBe(true);
    expect(Object.isFrozen(manifest.changedPaths)).toBe(true);
    expect(Object.isFrozen(manifest.changes)).toBe(true);
    expect(
      manifest.changes.filter((change) => change.kind === "delete").map((c) => c.path),
    ).toEqual(["old.txt"]);
    expect(() =>
      createCandidateManifest({
        ...manifest,
        changedPaths: [...manifest.changedPaths, "unreported.txt"],
      }),
    ).toThrow(InvalidCandidateManifestError);
  });
});
