Back to Quality Engineering Toolkit

capstone-quality-engineering-toolkit/test/executionValidation.test.ts

import assert from "node:assert/strict";
import test from "node:test";

import { ToolkitError } from "../src/errors.js";
import { validateExecutionCollection } from "../src/validation.js";

const validExecution = {
  executionId: "exec-001",
  operation: "GET /catalogue",
  environment: "staging",
  outcome: "passed",
  durationMs: 500,
  timestamp: "2026-08-09T09:00:00.000Z",
};

test("accepts the documented ISO 8601 UTC timestamp form", () => {
  assert.deepEqual(validateExecutionCollection([{ ...validExecution }]), [validExecution]);
});

test("rejects timestamps outside the documented ISO 8601 UTC form", () => {
  assert.throws(
    () => validateExecutionCollection([{ ...validExecution, timestamp: "2026-08-09 09:00:00Z" }]),
    (error: unknown) => {
      assert.ok(error instanceof ToolkitError);
      assert.equal(error.kind, "invalid-input");
      assert.equal(error.context.recordIndex, 0);
      assert.match(error.message, /ISO 8601 UTC timestamp/);
      return true;
    },
  );
});

test("includes the record index for a malformed numeric duration", () => {
  assert.throws(
    () => validateExecutionCollection([{ ...validExecution, durationMs: "slow" }]),
    (error: unknown) => {
      assert.ok(error instanceof ToolkitError);
      assert.equal(error.kind, "invalid-input");
      assert.equal(error.context.recordIndex, 0);
      assert.match(error.message, /durationMs/);
      return true;
    },
  );
});

test("rejects a malformed execution outcome with its record index", () => {
  const malformed = { ...validExecution, outcome: "green" };

  assert.throws(() => validateExecutionCollection([malformed]), (error: unknown) => {
    assert.ok(error instanceof ToolkitError);
    assert.equal(error.kind, "invalid-input");
    assert.equal(error.context.recordIndex, 0);
    assert.match(error.message, /outcome/);
    return true;
  });
});

test("rejects an execution fixture that is not an array", () => {
  assert.throws(() => validateExecutionCollection(validExecution), (error: unknown) => {
    assert.ok(error instanceof ToolkitError);
    assert.equal(error.kind, "invalid-input");
    assert.match(error.message, /JSON array/);
    return true;
  });
});