Files
NODEDC_DEVICE_CORE/services/device-control-core/test/ontology-app.test.mjs
T

98 lines
3.0 KiB
JavaScript

import assert from "node:assert/strict";
import test from "node:test";
import { createControlCoreApp } from "../src/app.mjs";
const managementToken = "test-only-management-token-with-32-bytes";
const identifierPepper = "test-only-identifier-pepper-with-32-bytes";
const projectId = "11111111-1111-4111-8111-111111111111";
test("management API forwards a canonical asset command", async () => {
let executed;
const runtime = await startServer({
executeManagementCommand: async (input) => {
executed = input;
return { replayed: false, result: { created: true } };
},
});
try {
const response = await fetch(`${runtime.baseUrl}/internal/v1/management/assets:ensure`, {
method: "POST",
headers: managementHeaders("ontology-asset-0001"),
body: JSON.stringify({
projectRef: `project:${projectId}`,
assetKey: "trike-001",
displayName: "Trike 001",
assetTypeRef: "asset-type:delivery-trike",
}),
});
assert.equal(response.status, 200);
assert.equal(executed.commandKind, "asset.ensure");
assert.equal(executed.command.assetKey, "trike-001");
} finally {
await runtime.close();
}
});
test("query API exposes the ontology projection through Core", async () => {
let actor;
const runtime = await startServer({
getProjectOntologyProjection: async (value, requestedProjectId) => {
actor = value;
assert.equal(requestedProjectId, projectId);
return {
ontology: { catalogHash: "229c61c02a790906" },
assets: [],
hosts: [],
};
},
});
try {
const response = await fetch(
`${runtime.baseUrl}/internal/v1/query/projects/${projectId}/ontology`,
{ headers: managementHeaders("ontology-query-0001") },
);
const body = await response.json();
assert.equal(response.status, 200);
assert.equal(body.projection.ontology.catalogHash, "229c61c02a790906");
assert.equal(actor.userRef, "user:test-owner");
} finally {
await runtime.close();
}
});
async function startServer(repositoryOverrides) {
const server = createControlCoreApp({
managementApiEnabled: true,
managementToken,
identifierPepper,
repository: {
health: async () => "ready",
executeManagementCommand: async () => ({ replayed: false, result: {} }),
...repositoryOverrides,
},
});
await new Promise((resolve, reject) => {
server.once("error", reject);
server.listen(0, "127.0.0.1", resolve);
});
const address = server.address();
return {
baseUrl: `http://127.0.0.1:${address.port}`,
close: () => new Promise((resolve, reject) =>
server.close((error) => error ? reject(error) : resolve())),
};
}
function managementHeaders(idempotencyKey) {
return {
Authorization: `Bearer ${managementToken}`,
"Content-Type": "application/json",
"Idempotency-Key": idempotencyKey,
"X-NODEDC-User-Ref": "user:test-owner",
"X-NODEDC-Hub-Role": "owner",
"X-NODEDC-Group-Refs": "",
"X-NODEDC-Owner-Scopes": "company=organization:test",
};
}