/home/techb158/cosmic.abdallabala.com/tests
Edit: /home/techb158/cosmic.abdallabala.com/tests/gate-workflow.test.js (2946B)
const assert = require("assert");
const fs = require("fs");
const path = require("path");
const os = require("os");
const { JsonDatabase } = require("../src/storage/jsonDatabase.js");
const { DashboardService } = require("../src/services/dashboardService.js");
const { GateWorkflowService } = require("../src/services/gateWorkflowService.js");
const source = path.join(__dirname, "..", "data", "database.json");
const temp = path.join(os.tmpdir(), `cosmic-gate-db-${Date.now()}.json`);
fs.copyFileSync(source, temp);
const database = new JsonDatabase(temp);
const dashboard = new DashboardService(database);
const gates = new GateWorkflowService(database);
const projectId = "cosmic-ai-risk-001";
const evaluated = dashboard.evaluateGate(projectId, "USER-REVIEW");
assert.ok(evaluated.persistedGate, "Gate evaluation should return a persisted gate view");
assert.ok(evaluated.persistedGate.id, "Persisted gate should have an id");
assert.ok(evaluated.persistedGate.criteria.length >= 8, "Persisted gate should include gate criteria snapshot");
const history = gates.listGateHistory(projectId);
assert.ok(history.length >= 1, "Gate history should include persisted evaluation");
assert.strictEqual(history[0].id, evaluated.persistedGate.id, "Latest gate should be first in history");
const criterion = history[0].criteria[0];
const updatedCriterion = gates.updateCriterion(criterion.id, {
reviewerStatus: "Evidence requested",
reviewerNote: "Attach the signed review evidence before deployment.",
evidenceUri: "internal://evidence/gate-review"
}, "USER-REVIEW");
assert.strictEqual(updatedCriterion.reviewerStatus, "Evidence requested", "Criterion reviewer status should update");
assert.strictEqual(updatedCriterion.reviewerNote, "Attach the signed review evidence before deployment.", "Criterion reviewer note should update");
assert.strictEqual(updatedCriterion.evidenceUri, "internal://evidence/gate-review", "Criterion evidence URI should update");
const reviewedGate = gates.addDecision(history[0].id, {
decision: "Needs changes",
reviewerName: "Governance Reviewer",
reason: "Blocking criteria need additional evidence before deployment."
}, "USER-REVIEW");
assert.strictEqual(reviewedGate.reviewStatus, "Needs changes", "Gate review status should reflect latest decision");
assert.ok(reviewedGate.latestDecision, "Gate should expose latest reviewer decision");
assert.strictEqual(reviewedGate.latestDecision.decision, "Needs changes", "Latest decision should match reviewer input");
const auditEvents = gates.listAuditEvents(projectId);
assert.ok(auditEvents.some(event => event.entityType === "GateCriterion" && event.action === "update"), "Criterion update should create audit event");
assert.ok(auditEvents.some(event => event.entityType === "GateDecision" && event.action === "create"), "Gate decision should create audit event");
fs.unlinkSync(temp);
console.log("All COSMIC AI-Risk gate workflow tests passed.");