Format authored monorepo code with pinned language formatters
This commit is contained in:
+56
-16
@@ -1,13 +1,30 @@
|
||||
import assert from "node:assert/strict";
|
||||
import { test } from "node:test";
|
||||
import { capabilityId as id, valueType, validateWorkspaceRevision } from "../src/capability-model/index.js";
|
||||
import { contentDigest, planEvolution, runtimeContracts, storageContracts, storageChangeRequiresMigration } from "../src/capability-model/evolution.js";
|
||||
import { capabilityFixtureSource, capabilityResourceSources, compileCapabilityFixture, makeValidCapabilityWorkspace } from "./fixtures/capability-model.js";
|
||||
import {
|
||||
contentDigest,
|
||||
planEvolution,
|
||||
runtimeContracts,
|
||||
storageContracts,
|
||||
storageChangeRequiresMigration,
|
||||
} from "../src/capability-model/evolution.js";
|
||||
import {
|
||||
capabilityFixtureSource,
|
||||
capabilityResourceSources,
|
||||
compileCapabilityFixture,
|
||||
makeValidCapabilityWorkspace,
|
||||
} from "./fixtures/capability-model.js";
|
||||
|
||||
test("QX carries stable conformance IDs and implementation semantic majors", () => {
|
||||
const result = compileCapabilityFixture({
|
||||
workspace: capabilityFixtureSource.replace("conform Project as Named {", 'conform Project as Named id "conformance:project:named" semantic-major 3 {'),
|
||||
todo: capabilityResourceSources.todo.replace('revision "package:todo-runtime@1" {', 'revision "package:todo-runtime@1" semantic-major 2 {'),
|
||||
workspace: capabilityFixtureSource.replace(
|
||||
"conform Project as Named {",
|
||||
'conform Project as Named id "conformance:project:named" semantic-major 3 {',
|
||||
),
|
||||
todo: capabilityResourceSources.todo.replace(
|
||||
'revision "package:todo-runtime@1" {',
|
||||
'revision "package:todo-runtime@1" semantic-major 2 {',
|
||||
),
|
||||
});
|
||||
assert.ok(result.ok, JSON.stringify(result));
|
||||
assert.equal(result.workspace.conformances[0]!.id, "conformance:project:named");
|
||||
@@ -43,16 +60,32 @@ test("a workspace root change and display names do not restart package runtimes"
|
||||
after.conformances.reverse();
|
||||
after.interfaceImports.reverse();
|
||||
const report = planEvolution(before, after, { allowLegacy: true });
|
||||
assert.deepEqual(report.runtimeActions.map((entry) => entry.action), ["keep"]);
|
||||
assert.deepEqual(
|
||||
report.runtimeActions.map((entry) => entry.action),
|
||||
["keep"],
|
||||
);
|
||||
assert.deepEqual(report.storageChanges, []);
|
||||
assert.deepEqual(report.packageChecks, []);
|
||||
});
|
||||
|
||||
test("consumer changes preserve unrelated resource owners", () => {
|
||||
const before = makeValidCapabilityWorkspace();
|
||||
before.packageImports.push({ packageId: id.package("package:resource-owner"), revisionId: id.packageRevision("package:resource-owner@1"),
|
||||
displayName: "ResourceOwner", source: { repository: "https://example.org/owner.git", commit: "a".repeat(40) },
|
||||
exports: [{ kind: "function", id: id.packageExport("export:owner:ping"), displayName: "ping", inputType: valueType.unit, outputType: valueType.unit, dependencyPorts: [] }] });
|
||||
before.packageImports.push({
|
||||
packageId: id.package("package:resource-owner"),
|
||||
revisionId: id.packageRevision("package:resource-owner@1"),
|
||||
displayName: "ResourceOwner",
|
||||
source: { repository: "https://example.org/owner.git", commit: "a".repeat(40) },
|
||||
exports: [
|
||||
{
|
||||
kind: "function",
|
||||
id: id.packageExport("export:owner:ping"),
|
||||
displayName: "ping",
|
||||
inputType: valueType.unit,
|
||||
outputType: valueType.unit,
|
||||
dependencyPorts: [],
|
||||
},
|
||||
],
|
||||
});
|
||||
const after = structuredClone(before);
|
||||
after.packageImports[0]!.source.commit = "e".repeat(40);
|
||||
const actions = planEvolution(before, after, { allowLegacy: true }).runtimeActions;
|
||||
@@ -82,8 +115,12 @@ test("semantic review receipts cover exact consumer/provider contracts", () => {
|
||||
const report = planEvolution(before, after, { allowLegacy: true });
|
||||
assert.equal(report.reviews.length, 1);
|
||||
assert.equal(report.reviews[0]!.accepted, false);
|
||||
const receipt = { requirementDigest: report.reviews[0]!.requirementDigest, decision: "accepted-unchanged" as const,
|
||||
rationale: "Reviewed the semantic change against summary behavior", agentId: "workspace-agent" };
|
||||
const receipt = {
|
||||
requirementDigest: report.reviews[0]!.requirementDigest,
|
||||
decision: "accepted-unchanged" as const,
|
||||
rationale: "Reviewed the semantic change against summary behavior",
|
||||
agentId: "workspace-agent",
|
||||
};
|
||||
assert.equal(planEvolution(before, after, { allowLegacy: true, reviews: [receipt] }).reviews[0]!.accepted, true);
|
||||
after.packageImports[0]!.source.commit = "f".repeat(40);
|
||||
assert.equal(planEvolution(before, after, { allowLegacy: true, reviews: [receipt] }).reviews[0]!.accepted, false);
|
||||
@@ -95,15 +132,18 @@ test("evolution enrollment is explicit and never erases legacy ownership", () =>
|
||||
assert.ok(report.blockers.some((entry) => entry.includes("workspace-shared")));
|
||||
assert.ok(report.blockers.some((entry) => entry.includes("authored ID")));
|
||||
assert.equal(runtimeContracts(workspace).length, 1);
|
||||
assert.throws(() => planEvolution(workspace, { ...workspace, workspaceId: id.workspace("other") }), /different workspace/);
|
||||
assert.throws(
|
||||
() => planEvolution(workspace, { ...workspace, workspaceId: id.workspace("other") }),
|
||||
/different workspace/,
|
||||
);
|
||||
});
|
||||
|
||||
test("automatic preservation distinguishes additions and defaults from incompatible storage", () => {
|
||||
const workspace = makeValidCapabilityWorkspace();
|
||||
const before = storageContracts(workspace).find(entry => entry.kind === "state")!;
|
||||
const before = storageContracts(workspace).find((entry) => entry.kind === "state")!;
|
||||
const next = structuredClone(before);
|
||||
const value = next.definition as Record<string, unknown>;
|
||||
value.defaultValue = {displayName: "important user data"};
|
||||
value.defaultValue = { displayName: "important user data" };
|
||||
assert.equal(storageChangeRequiresMigration(before, next, new Set()), false);
|
||||
next.ownerId = "another-owner";
|
||||
assert.equal(storageChangeRequiresMigration(before, next, new Set()), true);
|
||||
@@ -111,10 +151,10 @@ test("automatic preservation distinguishes additions and defaults from incompati
|
||||
delete value.defaultValue;
|
||||
assert.equal(storageChangeRequiresMigration(undefined, next, new Set([value.attachedTo as string])), true);
|
||||
assert.equal(storageChangeRequiresMigration(undefined, next, new Set()), false);
|
||||
const slot = workspace.sharedAttachments.find(entry => entry.kind === "state")!;
|
||||
const slot = workspace.sharedAttachments.find((entry) => entry.kind === "state")!;
|
||||
if (slot.kind !== "state") throw new Error("fixture slot");
|
||||
slot.defaultValue = {displayName: "one"};
|
||||
slot.defaultValue = { displayName: "one" };
|
||||
const first = storageContracts(workspace);
|
||||
slot.defaultValue = {displayName: "two"};
|
||||
slot.defaultValue = { displayName: "two" };
|
||||
assert.notDeepEqual(storageContracts(workspace), first, "user data must not be stripped as schema metadata");
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user