Co-authored-by: Jason Woltje <jason@diversecanvas.com> Co-committed-by: Jason Woltje <jason@diversecanvas.com>
86 lines
2.8 KiB
TypeScript
86 lines
2.8 KiB
TypeScript
import { describe, it, expect, beforeEach } from 'vitest';
|
|
import {
|
|
KNOWN_CONNECTOR_KINDS,
|
|
isKnownConnectorKind,
|
|
resolveConnectorKind,
|
|
registerConnector,
|
|
hasConnector,
|
|
createConnector,
|
|
ConnectorNotImplementedError,
|
|
_resetConnectorRegistry,
|
|
} from './registry.js';
|
|
import type { ConnectorConfig, OrchestratorConnector } from './types.js';
|
|
|
|
function fakeConnector(kind: 'tmux' | 'discord' | 'matrix'): OrchestratorConnector {
|
|
return {
|
|
kind,
|
|
send: async () => ({ delivered: true, messageId: 'x' }),
|
|
subscribe: () => () => {},
|
|
health: async () => ({ reachable: true, authenticated: true }),
|
|
};
|
|
}
|
|
|
|
describe('connector registry (F4 Phase 1)', () => {
|
|
beforeEach(() => {
|
|
_resetConnectorRegistry();
|
|
});
|
|
|
|
it('knows the three peer connector kinds', () => {
|
|
expect(KNOWN_CONNECTOR_KINDS).toEqual(['tmux', 'discord', 'matrix']);
|
|
});
|
|
|
|
it('isKnownConnectorKind guards correctly', () => {
|
|
expect(isKnownConnectorKind('matrix')).toBe(true);
|
|
expect(isKnownConnectorKind('irc')).toBe(false);
|
|
expect(isKnownConnectorKind(42)).toBe(false);
|
|
});
|
|
|
|
it('resolveConnectorKind defaults to tmux when config is absent (back-compat)', () => {
|
|
expect(resolveConnectorKind(undefined)).toBe('tmux');
|
|
expect(resolveConnectorKind({ kind: 'matrix' })).toBe('matrix');
|
|
});
|
|
|
|
it('createConnector throws ConnectorNotImplementedError for an unregistered kind', () => {
|
|
const cfg: ConnectorConfig = { kind: 'matrix' };
|
|
expect(() => createConnector(cfg)).toThrow(ConnectorNotImplementedError);
|
|
expect(() => createConnector(cfg)).toThrow(/not implemented yet/i);
|
|
});
|
|
|
|
it('createConnector with no config resolves the default kind (tmux) and reports it unimplemented in Phase 1', () => {
|
|
try {
|
|
createConnector();
|
|
throw new Error('expected throw');
|
|
} catch (err) {
|
|
expect(err).toBeInstanceOf(ConnectorNotImplementedError);
|
|
expect((err as ConnectorNotImplementedError).kind).toBe('tmux');
|
|
}
|
|
});
|
|
|
|
it('register → has → create resolves a registered factory', () => {
|
|
expect(hasConnector('matrix')).toBe(false);
|
|
registerConnector('matrix', (cfg) => fakeConnector(cfg.kind));
|
|
expect(hasConnector('matrix')).toBe(true);
|
|
|
|
const connector = createConnector({ kind: 'matrix' });
|
|
expect(connector.kind).toBe('matrix');
|
|
});
|
|
|
|
it('passes the config through to the factory', () => {
|
|
let received: ConnectorConfig | null = null;
|
|
registerConnector('matrix', (cfg) => {
|
|
received = cfg;
|
|
return fakeConnector(cfg.kind);
|
|
});
|
|
const cfg: ConnectorConfig = {
|
|
kind: 'matrix',
|
|
matrix: {
|
|
homeserverUrl: 'https://matrix.internal',
|
|
userId: '@mos:internal',
|
|
roomId: '!room:internal',
|
|
},
|
|
};
|
|
createConnector(cfg);
|
|
expect(received).toEqual(cfg);
|
|
});
|
|
});
|