WIP: Phase 3B playback engine handoff
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
const test = require("node:test");
|
||||
const assert = require("node:assert/strict");
|
||||
const net = require("node:net");
|
||||
const { loadConfig } = require("../src/config");
|
||||
const { createRuntime } = require("../src/runtime");
|
||||
|
||||
function testConfig() {
|
||||
function testConfig(overrides = {}) {
|
||||
return loadConfig({
|
||||
NODE_ENV: "test",
|
||||
HOST: "127.0.0.1",
|
||||
@@ -20,6 +21,7 @@ function testConfig() {
|
||||
MQTT_URL: "mqtt://broker:1883",
|
||||
MQTT_PASSWORD: "mqtt-password-that-must-not-leak",
|
||||
HA_WEBHOOK_URL: "http://home-assistant:8123/api/webhook/private-id",
|
||||
...overrides,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -171,3 +173,28 @@ test("runtime startup and shutdown are idempotent", async () => {
|
||||
assert.equal(runtime.lifecycle.ready, false);
|
||||
assert.equal(runtime.database.open, false);
|
||||
});
|
||||
|
||||
test("a listen failure stops playback and closes startup resources", async (t) => {
|
||||
const occupied = net.createServer();
|
||||
occupied.listen(0, "127.0.0.1");
|
||||
await new Promise((resolve, reject) => {
|
||||
occupied.once("listening", resolve);
|
||||
occupied.once("error", reject);
|
||||
});
|
||||
t.after(
|
||||
() =>
|
||||
new Promise((resolve) => {
|
||||
occupied.close(resolve);
|
||||
}),
|
||||
);
|
||||
|
||||
const runtime = createRuntime({
|
||||
config: testConfig({ PORT: String(occupied.address().port) }),
|
||||
logger: silentLogger,
|
||||
storage: testStorage(),
|
||||
});
|
||||
|
||||
await assert.rejects(runtime.start(), (error) => error.code === "EADDRINUSE");
|
||||
assert.equal(runtime.lifecycle.ready, false);
|
||||
assert.equal(runtime.database.open, false);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user