kt-template-online-api/test/modules/qqbot/message-push/system-message-source.registry.spec.ts

62 lines
2.2 KiB
TypeScript

import type { SystemMessageSourceAdapter } from '../../../../src/modules/qqbot/core/contract/message-push/qqbot-message-push.types';
import { SystemMessageSourceRegistry } from '../../../../src/modules/qqbot/core/application/message-push/system-message-source.registry';
function createAdapter(sourceKey: string): SystemMessageSourceAdapter {
return {
definition: {
description: 'test',
displayName: sourceKey,
sourceKey,
subscriptionFields: [],
variables: [],
version: 1,
},
eventResourceKey: jest.fn(),
inspectSubscription: jest.fn(),
listSubscriptionOptions: jest.fn(),
normalizeSubscriptionConfig: jest.fn(),
resolveDelivery: jest.fn(),
subscriptionResourceKey: jest.fn(),
validateEventPayload: jest.fn(),
};
}
describe('SystemMessageSourceRegistry', () => {
it('rejects duplicate source registration and returns immutable definitions', () => {
const registry = new SystemMessageSourceRegistry();
const adapter = createAdapter('network.stun.mapping-port-changed');
registry.register(adapter);
expect(() => registry.register(adapter)).toThrow(
'duplicate_message_source',
);
expect(registry.list()).toEqual([adapter.definition]);
expect(() => registry.get('missing')).toThrow('unknown_message_source');
const [definition] = registry.list();
definition.displayName = 'mutated';
expect(
registry.get(adapter.definition.sourceKey).definition.displayName,
).toBe(adapter.definition.displayName);
});
it('sorts definitions and unregisters only the same adapter instance', () => {
const registry = new SystemMessageSourceRegistry();
const first = createAdapter('z.source');
const second = createAdapter('a.source');
const replacement = createAdapter('z.source');
registry.register(first);
registry.register(second);
registry.unregister('z.source', replacement);
expect(registry.list().map((definition) => definition.sourceKey)).toEqual([
'a.source',
'z.source',
]);
registry.unregister('z.source', first);
expect(registry.list().map((definition) => definition.sourceKey)).toEqual([
'a.source',
]);
});
});