Files
coa-server-manager/tools/server-lifecycle.test.mjs

65 lines
2.6 KiB
JavaScript

import test from "node:test";
import assert from "node:assert/strict";
import { ServerLifecycle, serverLifecycle } from "../src/lib/serverLifecycle.ts";
test("polls during a slow deliberate stop never rearm crash restart", () => {
const state = new ServerLifecycle();
state.observe(true, false, false);
state.request("stopping");
for (let i = 0; i < 50; i++) assert.equal(state.observe(true, true, false), false);
assert.equal(state.observe(false, false, false), false);
assert.equal(state.observe(false, false, false), false);
state.request("starting");
state.complete("starting");
state.observe(true, false, false);
assert.equal(state.observe(false, false, false), true);
assert.equal(state.observe(false, false, false), false);
});
test("update validation and rollback shutdowns are not crashes", () => {
const state = new ServerLifecycle();
state.observe(true, false, false);
assert.equal(state.observe(false, false, true), false);
assert.equal(state.observe(false, false, false), false);
state.observe(true, false, false);
assert.equal(state.observe(false, false, true), false);
state.observe(true, false, false);
assert.equal(state.observe(false, false, false), true);
});
test("navigation retains a pending stop and a later external start rearms detection", () => {
const state = serverLifecycle("navigation");
state.observe(true, false, false);
state.request("stopping");
const returned = serverLifecycle("navigation");
assert.equal(returned, state);
assert.equal(returned.observe(false, false, false), false);
returned.complete("stopping");
assert.equal(returned.observe(false, false, false), false);
returned.observe(true, false, false);
assert.equal(returned.observe(false, false, false), true);
});
test("an update between status polls cannot look like a crash after completion", () => {
const state = new ServerLifecycle();
state.observe(true, false, false);
state.beginMaintenance();
state.endMaintenance();
assert.equal(state.observe(false, false, false), false);
state.observe(true, false, false);
assert.equal(state.observe(false, false, false), true);
});
test("an intentional restart remains suppressed across navigation until the action completes", () => {
const state = serverLifecycle("restart-navigation");
state.observe(true, false, false);
state.request("restarting");
const returned = serverLifecycle("restart-navigation");
assert.equal(returned.observe(false, false, false), false);
assert.equal(returned.observe(true, false, false), false);
returned.complete("restarting");
returned.observe(true, false, false);
assert.equal(returned.observe(false, false, false), true);
});