import ApiAIAssistant from '../../../../src/services/ApiAiAssistant'; import MetricsManager from '../../../../src/metrics/MetricsManager'; import LoggerProxy from '../../../../src/logger-proxy'; import {HTTP_METHODS, WebexSDK} from '../../../../src/types'; jest.mock('../../../../src/metrics/MetricsManager'); jest.mock('../../../../src/logger-proxy'); describe('ApiAIAssistant', () => { let apiAIAssistant: ApiAIAssistant; let mockWebex: WebexSDK; let mockMetricsManager: jest.Mocked; beforeEach(() => { jest.clearAllMocks(); mockWebex = { credentials: { getOrgId: jest.fn().mockReturnValue('test-org-id'), }, request: jest.fn(), internal: { services: { get: jest.fn().mockReturnValue('https://api.wxcc-us1.cisco.com'), }, newMetrics: { submitBehavioralEvent: jest.fn(), submitOperationalEvent: jest.fn(), submitBusinessEvent: jest.fn(), }, }, ready: true, once: jest.fn(), } as unknown as WebexSDK; mockMetricsManager = { trackEvent: jest.fn(), timeEvent: jest.fn(), } as unknown as jest.Mocked; (MetricsManager.getInstance as jest.Mock).mockReturnValue(mockMetricsManager); apiAIAssistant = new ApiAIAssistant(mockWebex); }); it('should send transcript start event successfully', async () => { (mockWebex.request as jest.Mock).mockResolvedValue({body: {ok: true}}); const result = await apiAIAssistant.sendEvent( 'test-agent-id', 'interaction-1', 'CUSTOM_EVENT', 'GET_TRANSCRIPTS', 'START' ); expect(mockWebex.request).toHaveBeenCalledWith({ uri: 'https://api-ai-assistant.produs1.ciscoccservice.com/event', method: HTTP_METHODS.POST, addAuthHeader: true, body: { agentId: 'test-agent-id', orgId: 'test-org-id', eventType: 'CUSTOM_EVENT', eventName: 'GET_TRANSCRIPTS', eventDetails: { data: expect.objectContaining({ interactionId: 'interaction-1', action: 'START', }), }, }, }); expect(result).toEqual({ok: true}); }); it('should fetch historic transcripts with mapped base URL', async () => { const responseBody = {interactionId: 'interaction-1', data: []}; (mockWebex.request as jest.Mock).mockResolvedValue({body: responseBody}); apiAIAssistant.setAIFeatureFlags({realtimeTranscripts: {enable: true}} as any); const result = await apiAIAssistant.fetchHistoricTranscripts('test-agent-id', 'interaction-1'); expect(mockWebex.request).toHaveBeenCalledWith({ uri: 'https://api-ai-assistant.produs1.ciscoccservice.com/transcripts/list', method: HTTP_METHODS.POST, addAuthHeader: true, body: { agentId: 'test-agent-id', orgId: 'test-org-id', interactionId: 'interaction-1', }, }); expect(result).toEqual(responseBody as any); }); it('should fail when base URL mapping is not available', async () => { (mockWebex.internal.services.get as jest.Mock).mockReturnValue('https://unknown-host.invalid'); let failed = false; try { await apiAIAssistant.sendEvent( 'test-agent-id', 'interaction-1', 'CUSTOM_EVENT', 'GET_TRANSCRIPTS', 'STOP' ); } catch (_error) { failed = true; } expect(failed).toBe(true); expect(LoggerProxy.error).toHaveBeenCalled(); }); });