Files
reactor/test/edge/invalid-topic.edge.test.js

69 lines
1.7 KiB
JavaScript
Raw Normal View History

'use strict';
// Phase 10 rewrite: drives only the public BaseNodeAdapter surface. The
// commands registry built by BaseNodeAdapter logs a warn on unknown topics
// and still calls done — no throw.
2026-02-19 17:37:42 +01:00
const test = require('node:test');
const assert = require('node:assert/strict');
const nodeClass = require('../../src/nodeClass');
const { makeUiConfig } = require('../helpers/factories');
2026-02-19 17:37:42 +01:00
function makeRED() { return { nodes: { getNode: () => null } }; }
function makeNode(id = 'reactor-node-1') {
const sends = [];
const statuses = [];
const handlers = {};
return {
id, sends, statuses, handlers,
send(arr) { sends.push(arr); },
status(b) { statuses.push(b); },
on(ev, fn) { handlers[ev] = fn; },
warn() {}, error() {},
2026-02-19 17:37:42 +01:00
};
}
function closeNode(node) {
if (node.handlers.close) node.handlers.close(() => {});
}
2026-02-19 17:37:42 +01:00
test('unknown input topic does not throw and still calls done', async () => {
const node = makeNode();
new nodeClass(makeUiConfig(), makeRED(), node, 'reactor');
try {
let doneCalled = 0;
await assert.doesNotReject(async () => {
await node.handlers.input(
{ topic: 'somethingUnknown', payload: 1 },
() => {},
() => { doneCalled += 1; },
);
2026-02-19 17:37:42 +01:00
});
assert.equal(doneCalled, 1);
} finally {
closeNode(node);
}
});
2026-02-19 17:37:42 +01:00
test('missing topic field is handled gracefully', async () => {
const node = makeNode();
new nodeClass(makeUiConfig(), makeRED(), node, 'reactor');
try {
let doneCalled = 0;
await assert.doesNotReject(async () => {
await node.handlers.input(
{ payload: 'no-topic-here' },
() => {},
() => { doneCalled += 1; },
);
});
assert.equal(doneCalled, 1);
} finally {
closeNode(node);
}
2026-02-19 17:37:42 +01:00
});