@volley/recognition-client-sdk
Version:
Recognition Service TypeScript/Node.js Client SDK
216 lines (187 loc) • 6.49 kB
text/typescript
/**
* 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');
});
});
});