PR C: wire real NotaryRegistry on Chain 138 (arch step 4) (#7)
Some checks failed
CI / Frontend Lint (push) Failing after 6s
CI / Frontend Type Check (push) Failing after 6s
CI / Frontend Build (push) Failing after 6s
CI / Frontend E2E Tests (push) Failing after 8s
CI / Contracts Compile (push) Has been cancelled
CI / Contracts Test (push) Has been cancelled
CI / Orchestrator Build (push) Has been cancelled
Security Scan / OWASP ZAP Scan (push) Has been cancelled
Security Scan / Dependency Vulnerability Scan (push) Has been cancelled
Some checks failed
CI / Frontend Lint (push) Failing after 6s
CI / Frontend Type Check (push) Failing after 6s
CI / Frontend Build (push) Failing after 6s
CI / Frontend E2E Tests (push) Failing after 8s
CI / Contracts Compile (push) Has been cancelled
CI / Contracts Test (push) Has been cancelled
CI / Orchestrator Build (push) Has been cancelled
Security Scan / OWASP ZAP Scan (push) Has been cancelled
Security Scan / Dependency Vulnerability Scan (push) Has been cancelled
This commit was merged in pull request #7.
This commit is contained in:
85
orchestrator/tests/unit/transactionState.test.ts
Normal file
85
orchestrator/tests/unit/transactionState.test.ts
Normal file
@@ -0,0 +1,85 @@
|
||||
import { describe, it, expect } from "@jest/globals";
|
||||
import {
|
||||
ALLOWED_TRANSITIONS,
|
||||
ROLE_FOR_TRANSITION,
|
||||
SOD_REQUIRED_TRANSITIONS,
|
||||
TRANSACTION_STATES,
|
||||
canTransition,
|
||||
} from "../../src/types/transactionState";
|
||||
|
||||
describe("Transaction state machine (architecture note §8–§9)", () => {
|
||||
it("declares the 12 states from §8.1", () => {
|
||||
expect(TRANSACTION_STATES).toEqual([
|
||||
"DRAFT",
|
||||
"INITIATED",
|
||||
"PRECONDITIONS_PENDING",
|
||||
"READY_FOR_PREPARE",
|
||||
"PREPARED",
|
||||
"EXECUTING",
|
||||
"PARTIALLY_EXECUTED",
|
||||
"VALIDATING",
|
||||
"COMMITTED",
|
||||
"ABORTED",
|
||||
"UNWIND_PENDING",
|
||||
"CLOSED",
|
||||
]);
|
||||
});
|
||||
|
||||
describe("§9.1 permitted high-level transitions", () => {
|
||||
// Each of these is listed in the note; canTransition must accept them.
|
||||
const legal: Array<[string, string]> = [
|
||||
["DRAFT", "INITIATED"],
|
||||
["INITIATED", "PRECONDITIONS_PENDING"],
|
||||
["PRECONDITIONS_PENDING", "READY_FOR_PREPARE"],
|
||||
["READY_FOR_PREPARE", "PREPARED"],
|
||||
["PREPARED", "EXECUTING"],
|
||||
["EXECUTING", "PARTIALLY_EXECUTED"],
|
||||
["EXECUTING", "VALIDATING"],
|
||||
["PARTIALLY_EXECUTED", "VALIDATING"],
|
||||
["VALIDATING", "COMMITTED"],
|
||||
["VALIDATING", "ABORTED"],
|
||||
["ABORTED", "UNWIND_PENDING"],
|
||||
["COMMITTED", "CLOSED"],
|
||||
["UNWIND_PENDING", "CLOSED"],
|
||||
];
|
||||
it.each(legal)("allows %s -> %s", (from, to) => {
|
||||
expect(canTransition(from as any, to as any)).toBe(true);
|
||||
});
|
||||
|
||||
// A few illegal edges — explicitly not in §9.1.
|
||||
const illegal: Array<[string, string]> = [
|
||||
["DRAFT", "COMMITTED"],
|
||||
["INITIATED", "EXECUTING"],
|
||||
["CLOSED", "INITIATED"],
|
||||
["PREPARED", "COMMITTED"],
|
||||
["COMMITTED", "ABORTED"],
|
||||
["ABORTED", "COMMITTED"],
|
||||
];
|
||||
it.each(illegal)("rejects %s -> %s", (from, to) => {
|
||||
expect(canTransition(from as any, to as any)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
it("CLOSED is a terminal state", () => {
|
||||
expect(ALLOWED_TRANSITIONS.CLOSED).toEqual([]);
|
||||
});
|
||||
|
||||
describe("segregation-of-duties checkpoints (§13)", () => {
|
||||
it("flags the four SoD-gated transitions", () => {
|
||||
expect([...SOD_REQUIRED_TRANSITIONS].sort()).toEqual(
|
||||
[
|
||||
"ABORTED->UNWIND_PENDING",
|
||||
"PREPARED->EXECUTING",
|
||||
"READY_FOR_PREPARE->PREPARED",
|
||||
"VALIDATING->COMMITTED",
|
||||
].sort(),
|
||||
);
|
||||
});
|
||||
|
||||
it("assigns a role to every SoD-gated transition", () => {
|
||||
for (const key of SOD_REQUIRED_TRANSITIONS) {
|
||||
expect(ROLE_FOR_TRANSITION[key]).toBeDefined();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user