Files
LangBot/web/tests/unit/event-pattern-coverage.test.mjs
T

93 lines
2.9 KiB
JavaScript

import assert from 'node:assert/strict';
import fs from 'node:fs';
import test from 'node:test';
import ts from 'typescript';
const source = fs.readFileSync(
new URL(
'../../src/app/home/components/event-patterns/event-pattern-groups.ts',
import.meta.url,
),
'utf8',
);
const exports = {};
new Function(
'exports',
ts.transpileModule(source, {
compilerOptions: {
module: ts.ModuleKind.CommonJS,
target: ts.ScriptTarget.ES2022,
},
}).outputText,
)(exports);
for (const [supported, required, covered] of [
['message.received', 'message.received', true],
['message.received', 'group.member_joined', false],
['message.received', 'message.*', false],
['message.received', '*', false],
['group.*', 'group.member_joined', true],
['group.*', 'group.*', true],
['group.*', 'groupish.member_joined', false],
['group.*', '*', false],
['*', 'group.*', true],
['*', '*', true],
]) {
test(`${supported} ${covered ? 'covers' : 'does not cover'} ${required}`, () => {
assert.equal(exports.eventPatternCovers(supported, required), covered);
});
}
test('processor events put covered declarations first and report only the intersection', () => {
const result = exports.processorEventCompatibility(
[
'group.member_joined',
'message.received',
'friend.request_received',
'message.received',
],
['message.received', 'message.edited'],
);
assert.deepEqual(result.entries, [
{ pattern: 'message.received', supported: true },
{ pattern: 'group.member_joined', supported: false },
{ pattern: 'friend.request_received', supported: false },
]);
assert.deepEqual(result.matchingEvents, ['message.received']);
});
test('wildcard subscriptions show matching concrete adapter events without claiming full coverage', () => {
const result = exports.processorEventCompatibility(
['group.*'],
['group.member_joined', 'message.received'],
);
assert.deepEqual(result.entries, [{ pattern: 'group.*', supported: false }]);
assert.deepEqual(result.matchingEvents, ['group.member_joined']);
assert.deepEqual(
exports.processorEventCompatibility(['*'], ['message.received'])
.matchingEvents,
['message.received'],
);
});
test('adapter wildcards cover concrete subscriptions without expanding the intersection', () => {
const result = exports.processorEventCompatibility(
['group.member_joined'],
['group.*'],
);
assert.equal(result.entries[0].supported, true);
assert.deepEqual(result.matchingEvents, ['group.member_joined']);
});
test('legacy adapters default to messages and unmatched subscriptions have an empty intersection', () => {
assert.deepEqual(
exports.processorEventCompatibility(['*'], []).matchingEvents,
['message.received'],
);
assert.deepEqual(
exports.processorEventCompatibility(['group.*'], []).matchingEvents,
[],
);
assert.deepEqual(exports.processorEventCompatibility([], []).entries, []);
});