51 lines
2.5 KiB
TypeScript
51 lines
2.5 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { readFile } from "node:fs/promises";
|
|
import { compileCapabilityResourceSource } from "../src/capability-language/index.js";
|
|
import { compileQuery } from "../src/query/compile.js";
|
|
import { parseControllerCatalog } from "../src/capability-model/controllers.js";
|
|
const source = { repository: "https://example.test/device.git", commit: "a".repeat(40) };
|
|
test("controller discovery requires complete bounded accepted-state membership", async () => {
|
|
const result = compileCapabilityResourceSource(
|
|
await readFile("test/fixtures/controller-device/DeviceController.qx", "utf8"),
|
|
{ source },
|
|
);
|
|
assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics));
|
|
const iface = result.resource.revision;
|
|
const pkg = compileCapabilityResourceSource(
|
|
'import interface DeviceController;package Driver id "driver" revision "driver@1" {query Enabled id "enabled" root workspace DeviceController document "enabled.graphql" operation "Enabled" {max rows 100;}}',
|
|
{ source, environment: { interfaces: new Map([["DeviceController", iface]]), interfaceClosure: [iface] } },
|
|
);
|
|
assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics));
|
|
const declaration = pkg.resource.revision.queries![0]!;
|
|
const metadata = JSON.stringify({
|
|
schemaVersion: 1,
|
|
controllers: [
|
|
{
|
|
id: "driver",
|
|
registry: "enabled",
|
|
subject: "device-controller@1",
|
|
snapshot: "device:snapshot:call",
|
|
remote: "device:apply:call",
|
|
input: "value",
|
|
},
|
|
],
|
|
});
|
|
const check = async (document: string) =>
|
|
parseControllerCatalog(metadata, [iface], [await compileQuery(declaration, [iface], async () => document)]);
|
|
assert.equal(
|
|
(await check("query Enabled {root {objects(all:64,where:{enabled:{eq:true}}) {entries {node {_camino {ref}}}}}}"))
|
|
.length,
|
|
1,
|
|
);
|
|
for (const document of [
|
|
"query Enabled {root {objects(first:64) {entries {node {_camino {ref}}}}}}",
|
|
"query Enabled {root {objects(all:65) {entries {node {_camino {ref}}}}}}",
|
|
"query Enabled {root {devices:objects(all:64) {entries {node {_camino {ref}}}}}}",
|
|
"query Enabled {root {objects(all:64) {entries {node {enabled}}}}}",
|
|
"query Enabled($enabled:Boolean!) {root {objects(all:64,where:{enabled:{eq:$enabled}}) {entries {node {_camino {ref}}}}}}",
|
|
])
|
|
await assert.rejects(check(document), /registry|Controller/);
|
|
assert.throws(() => parseControllerCatalog(metadata, [iface], []), /registry/);
|
|
});
|