Files
NODEDC_PLATFORM/device-plane/services/device-control-core/test/infrastructure-lifecycle-contract.test.mjs
T

34 lines
1.9 KiB
JavaScript

import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import test from "node:test";
const repositorySource = new URL(
"../src/infrastructure-repository.mjs",
import.meta.url,
);
test("catalog, Edge and route upserts enforce irreversible lifecycle transitions", async () => {
const source = await readFile(repositorySource, "utf8");
assert.match(source, /device_adapter_versions\.lifecycle_state = 'draft'[\s\S]*excluded\.lifecycle_state in \('active', 'retired'\)/);
assert.match(source, /device_model_profiles\.lifecycle_state = 'active'[\s\S]*excluded\.lifecycle_state = 'retired'/);
assert.match(source, /device_edges\.lifecycle_state = 'suspended'[\s\S]*excluded\.lifecycle_state in \('active', 'retired'\)/);
assert.match(source, /device_routes\.lifecycle_state = 'draft'[\s\S]*excluded\.lifecycle_state in \('active', 'retired'\)/);
assert.doesNotMatch(source, /device_(?:adapter_versions|model_profiles|edges|routes)\.lifecycle_state = 'retired'[\s\S]{0,160}excluded\.lifecycle_state = 'active'/);
});
test("legacy model adoption is a one-way exact-identity registry transition", async () => {
const source = await readFile(
new URL("../src/infrastructure-repository.mjs", import.meta.url),
"utf8",
);
assert.match(source, /profile ->> 'schemaVersion' = excluded\.schema_version/);
assert.match(source, /profile ->> 'profileRef' = excluded\.profile_ref/);
assert.match(source, /profile ->> 'vendor' = excluded\.vendor/);
assert.match(source, /profile ->> 'model' = excluded\.model/);
assert.match(source, /profile ->> 'deviceType' = excluded\.device_type/);
assert.match(source, /profile ->> 'protocol' = excluded\.protocol/);
assert.match(source, /adapter_version_id is null[\s\S]*schema_artifact_ref is null[\s\S]*profile_digest is null[\s\S]*cardinality\(device_model_profiles\.capabilities\) = 0[\s\S]*lifecycle_state = 'active'[\s\S]*excluded\.lifecycle_state = 'draft'/);
});