UNPKG

@volley/recognition-client-sdk

Version:

Recognition Service TypeScript/Node.js Client SDK

216 lines (187 loc) 6.49 kB
/** * Unit tests for Factory functions */ import { createClient, createClientWithBuilder } from './factory.js'; import { ConfigBuilder } from './config-builder.js'; import { RecognitionProvider, RecognitionContextTypeV1 } from '@recog/shared-types'; // Mock the RealTimeTwoWayWebSocketRecognitionClient jest.mock('./recognition-client.js', () => ({ RealTimeTwoWayWebSocketRecognitionClient: jest.fn().mockImplementation((config) => ({ config, connect: jest.fn(), disconnect: jest.fn(), sendAudio: jest.fn(), startRecognition: jest.fn(), stopRecognition: jest.fn() })) })); describe('Factory Functions', () => { describe('createClient', () => { it('should create client with config object', () => { const config = { url: 'ws://localhost:3101/ws/v1/recognize', audioUtteranceId: 'test-id', asrRequestConfig: { provider: RecognitionProvider.DEEPGRAM, model: 'nova-2-general', language: 'en-US', sampleRate: 16000, encoding: 'linear16' } }; const client = createClient(config); expect(client).toBeDefined(); expect(client.connect).toBeDefined(); expect(client.sendAudio).toBeDefined(); }); it('should create client with minimal config', () => { const config = { url: 'ws://localhost:3101/ws/v1/recognize', audioUtteranceId: 'test-id' }; const client = createClient(config); expect(client).toBeDefined(); }); it('should create client with callbacks', () => { const onTranscript = jest.fn(); const onError = jest.fn(); const onConnected = jest.fn(); const config = { url: 'ws://localhost:3101/ws/v1/recognize', audioUtteranceId: 'test-id', onTranscript, onError, onConnected }; const client = createClient(config); expect(client).toBeDefined(); }); }); describe('createClientWithBuilder', () => { it('should create client using builder pattern', () => { const client = createClientWithBuilder((builder) => builder .url('ws://localhost:3101/ws/v1/recognize') .audioUtteranceId('test-id') ); expect(client).toBeDefined(); expect(client.connect).toBeDefined(); }); it('should create client with multiple builder methods', () => { const onTranscript = jest.fn(); const onError = jest.fn(); const client = createClientWithBuilder((builder) => builder .url('ws://localhost:3101/ws/v1/recognize') .audioUtteranceId('test-id') .userId('user-123') .gameSessionId('session-456') .onTranscript(onTranscript) .onError(onError) ); expect(client).toBeDefined(); }); it('should create client with ASR config via builder', () => { const client = createClientWithBuilder((builder) => builder .url('ws://localhost:3101/ws/v1/recognize') .audioUtteranceId('test-id') .asrRequestConfig({ provider: RecognitionProvider.DEEPGRAM, model: 'nova-2-general', language: 'en-US', sampleRate: 16000, encoding: 'linear16' }) ); expect(client).toBeDefined(); }); it('should create client with game context via builder', () => { const client = createClientWithBuilder((builder) => builder .url('ws://localhost:3101/ws/v1/recognize') .audioUtteranceId('test-id') .gameContext({ type: RecognitionContextTypeV1.GAME_CONTEXT as const, gameId: 'test-game', gamePhase: 'test-phase' }) ); expect(client).toBeDefined(); }); it('should create client with all optional fields via builder', () => { const onTranscript = jest.fn(); const onMetadata = jest.fn(); const onError = jest.fn(); const onConnected = jest.fn(); const onDisconnected = jest.fn(); const logger = jest.fn(); const client = createClientWithBuilder((builder) => builder .url('ws://localhost:3101/ws/v1/recognize') .audioUtteranceId('test-id') .userId('user-123') .gameSessionId('session-456') .deviceId('device-789') .accountId('account-abc') .questionAnswerId('qa-xyz') .platform('ios') .asrRequestConfig({ provider: RecognitionProvider.DEEPGRAM, model: 'nova-2-general', language: 'en-US', sampleRate: 16000, encoding: 'linear16' }) .gameContext({ type: RecognitionContextTypeV1.GAME_CONTEXT as const, gameId: 'test-game', gamePhase: 'test-phase' }) .onTranscript(onTranscript) .onMetadata(onMetadata) .onError(onError) .onConnected(onConnected) .onDisconnected(onDisconnected) .highWaterMark(1000) .lowWaterMark(500) .maxBufferDurationSec(10) .chunksPerSecond(50) .logger(logger) ); expect(client).toBeDefined(); }); it('should accept builder as parameter', () => { const builder = new ConfigBuilder(); const client = createClientWithBuilder((b) => b.url('ws://localhost:3101').audioUtteranceId('test-id')); expect(client).toBeDefined(); }); }); describe('Factory Function Equivalence', () => { it('should produce equivalent clients from config and builder', () => { const config = { url: 'ws://localhost:3101/ws/v1/recognize', audioUtteranceId: 'test-id', userId: 'user-123' }; const clientFromConfig = createClient(config); const clientFromBuilder = createClientWithBuilder((builder) => builder .url('ws://localhost:3101/ws/v1/recognize') .audioUtteranceId('test-id') .userId('user-123') ); expect(clientFromConfig).toBeDefined(); expect(clientFromBuilder).toBeDefined(); }); it('should handle empty config gracefully', () => { const config = { url: 'ws://localhost:3101/ws/v1/recognize', audioUtteranceId: 'test-id' }; const client = createClient(config); expect(client).toBeDefined(); expect(typeof client.connect).toBe('function'); }); }); });