62 lines
2.2 KiB
TypeScript
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',
|
|
]);
|
|
});
|
|
});
|