Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
146 changes: 76 additions & 70 deletions src/app/core/services/agent.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,50 +141,53 @@ describe('AgentService', () => {
});
});

it('should emit LlmResponses received from fetch', (done) => {
const fakeResponse1 = createFakeLlmResponse();
const fakeResponse2 = createFakeLlmResponse({
content: {role: 'model', parts: [{text: 'fake response 2'}]},
});
const mockBody = new ReadableStream({
start(controller) {
const encoder = new TextEncoder();
controller.enqueue(
encoder.encode(`data: ${JSON.stringify(fakeResponse1)}\n`),
);
controller.enqueue(
encoder.encode(`data: ${JSON.stringify(fakeResponse2)}\n`),
);
controller.close();
},
});
spyOn(window, 'fetch').and.resolveTo(new Response(mockBody));
const results: LlmResponse[] = [];
service.runSse(RUN_SSE_PAYLOAD).subscribe({
next: (data) => {
results.push(data);
},
complete: () => {
expect(results).toEqual([fakeResponse1, fakeResponse2]);
done();
},
});
});
it(
'should emit LlmResponses received from fetch', (done) => {
const fakeResponse1 = createFakeLlmResponse();
const fakeResponse2 = createFakeLlmResponse({
content: {role: 'model', parts: [{text: 'fake response 2'}]},
});
const mockBody = new ReadableStream({
start(controller) {
const encoder = new TextEncoder();
controller.enqueue(
encoder.encode(`data: ${JSON.stringify(fakeResponse1)}\n`),
);
controller.enqueue(
encoder.encode(`data: ${JSON.stringify(fakeResponse2)}\n`),
);
controller.close();
},
});
spyOn(window, 'fetch').and.resolveTo(new Response(mockBody));
const results: LlmResponse[] = [];
service.runSse(RUN_SSE_PAYLOAD).subscribe({
next: (data) => {
results.push(data);
},
complete: () => {
expect(results).toEqual([fakeResponse1, fakeResponse2]);
done();
},
});
});

it(
'should set loading state to false when fetch is done', (done) => {
const mockBody = new ReadableStream({
start(controller) {
controller.close();
},
});
spyOn(window, 'fetch').and.resolveTo(new Response(mockBody));
service.runSse(RUN_SSE_PAYLOAD).subscribe({
complete: () => {
expect(service.getLoadingState().value).toBeFalse();
done();
},
});
});

it('should set loading state to false when fetch is done', (done) => {
const mockBody = new ReadableStream({
start(controller) {
controller.close();
},
});
spyOn(window, 'fetch').and.resolveTo(new Response(mockBody));
service.runSse(RUN_SSE_PAYLOAD).subscribe({
complete: () => {
expect(service.getLoadingState().value).toBeFalse();
done();
},
});
});

it('should emit error if fetch fails', (done) => {
spyOn(window, 'fetch').and.rejectWith(new Error('Fetch failed'));
Expand All @@ -196,32 +199,35 @@ describe('AgentService', () => {
});
});

it('should handle incomplete JSON chunks', (done) => {
const fakeResponse = createFakeLlmResponse();
const fakeResponseJson = JSON.stringify(fakeResponse);
const mid = Math.floor(fakeResponseJson.length / 2);
const chunk1 = fakeResponseJson.substring(0, mid);
const chunk2 = fakeResponseJson.substring(mid);

const mockBody = new ReadableStream({
start(controller) {
const encoder = new TextEncoder();
controller.enqueue(encoder.encode(`data: ${chunk1}`));
controller.enqueue(encoder.encode(`${chunk2}\n`));
controller.close();
},
});
spyOn(window, 'fetch').and.resolveTo(new Response(mockBody));
const results: LlmResponse[] = [];
service.runSse(RUN_SSE_PAYLOAD).subscribe({
next: (data) => {
results.push(data);
},
complete: () => {
expect(results).toEqual([fakeResponse]);
done();
},
});
});
// BEGIN-EXTERNAL
// it('should handle incomplete JSON chunks', (done) => {
// const fakeResponse = createFakeLlmResponse();
// const fakeResponseJson = JSON.stringify(fakeResponse);
// const mid = Math.floor(fakeResponseJson.length / 2);
// const chunk1 = fakeResponseJson.substring(0, mid);
// const chunk2 = fakeResponseJson.substring(mid);

// const mockBody = new ReadableStream({
// start(controller) {
// const encoder = new TextEncoder();
// controller.enqueue(encoder.encode(`data: ${chunk1}`));
// controller.enqueue(encoder.encode(`${chunk2}\n`));
// controller.close();
// },
// });
// spyOn(window, 'fetch').and.resolveTo(new Response(mockBody));
// const results: LlmResponse[] = [];
// service.runSse(RUN_SSE_PAYLOAD).subscribe({
// next: (data) => {
// results.push(data);
// },
// complete: () => {
// expect(results).toEqual([fakeResponse]);
// done();
// },
// });
// });
// END-EXTERNAL

});
});
6 changes: 4 additions & 2 deletions src/app/core/services/audio.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
* limitations under the License.
*/

import {fakeAsync, TestBed, tick} from '@angular/core/testing';
import {TestBed} from '@angular/core/testing';

import {AUDIO_WORKLET_MODULE_PATH, AudioService} from './audio.service';
import {MockWebSocketService} from './testing/mock-websocket.service';
Expand Down Expand Up @@ -61,7 +61,9 @@ describe('AudioService', () => {
if (!navigator.mediaDevices) {
(navigator as any).mediaDevices = {};
}
spyOn(navigator.mediaDevices, 'getUserMedia').and.resolveTo(mockStream);
navigator.mediaDevices.getUserMedia =
jasmine.createSpy('getUserMedia')
.and.returnValue(Promise.resolve(mockStream));
spyOn(window, 'AudioContext').and.returnValue(mockAudioContext);
spyOn(window, 'AudioWorkletNode').and.returnValue(mockWorkletNode);
mockAudioContext.audioWorklet.addModule.and.resolveTo();
Expand Down
27 changes: 15 additions & 12 deletions src/app/core/services/download.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ describe('DownloadService', () => {
});
service = TestBed.inject(DownloadService);
safeValuesService = TestBed.inject(
SAFE_VALUES_SERVICE,
) as MockSafeValuesService;
SAFE_VALUES_SERVICE,
) as MockSafeValuesService;

mockAnchor = jasmine.createSpyObj('HTMLAnchorElement', ['click']);
createElementSpy = spyOn(document, 'createElement')
Expand All @@ -71,10 +71,11 @@ describe('DownloadService', () => {

it('should call safeValuesService.setAnchorHref', () => {
service.downloadBase64Data(base64Data, mimeType, FILE_NAME_PNG);
expect(safeValuesService.setAnchorHref).toHaveBeenCalledWith(
mockAnchor,
base64Data,
);
expect(safeValuesService.setAnchorHref)
.toHaveBeenCalledWith(
mockAnchor,
base64Data,
);
});

it('should set download attribute to filename', () => {
Expand Down Expand Up @@ -129,16 +130,18 @@ describe('DownloadService', () => {
service.downloadObjectAsJson(data, FILE_NAME_JSON);
expect(safeValuesService.createObjectUrl).toHaveBeenCalled();
expect(
safeValuesService.createObjectUrl.calls.mostRecent().args[0].type,
).toBe(OCTET_STREAM);
safeValuesService.createObjectUrl.calls.mostRecent().args[0].type,
)
.toBe(OCTET_STREAM);
});

it('should call safeValuesService.setAnchorHref with object url', () => {
service.downloadObjectAsJson(data, FILE_NAME_JSON);
expect(safeValuesService.setAnchorHref).toHaveBeenCalledWith(
mockAnchor,
blobUrl,
);
expect(safeValuesService.setAnchorHref)
.toHaveBeenCalledWith(
mockAnchor,
blobUrl,
);
});

it('should create an anchor element', () => {
Expand Down
7 changes: 6 additions & 1 deletion src/app/core/services/stream-chat.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@
*/

import {ElementRef} from '@angular/core';
import {fakeAsync, TestBed, tick} from '@angular/core/testing';
import {TestBed} from '@angular/core/testing';

import {URLUtil} from '../../../utils/url-util';
import {fakeAsync,
tick} from '../../testing/utils';

import {AUDIO_SERVICE} from './audio.service';
import {StreamChatService} from './stream-chat.service';
Expand All @@ -35,6 +39,7 @@ describe('StreamChatService', () => {


beforeEach(() => {
spyOn(URLUtil, 'getWSServerUrl').and.returnValue('localhost:9876');
mockWebSocketService = new MockWebSocketService();
mockAudioService = new MockAudioService();
mockVideoService = new MockVideoService();
Expand Down
8 changes: 5 additions & 3 deletions src/app/core/services/video.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
* limitations under the License.
*/

import {ElementRef, Renderer2, RendererFactory2,} from '@angular/core';
import {fakeAsync, flush, TestBed, tick} from '@angular/core/testing';
import {ElementRef, Renderer2, RendererFactory2} from '@angular/core';
import {TestBed} from '@angular/core/testing';

import {MockWebSocketService} from './testing/mock-websocket.service';
import {VideoService} from './video.service';
Expand Down Expand Up @@ -84,7 +84,9 @@ describe('VideoService', () => {
if (!navigator.mediaDevices) {
(navigator as any).mediaDevices = {};
}
spyOn(navigator.mediaDevices, 'getUserMedia').and.resolveTo(mockStream);
navigator.mediaDevices.getUserMedia =
jasmine.createSpy('getUserMedia')
.and.returnValue(Promise.resolve(mockStream));
spyOn(window, 'MediaRecorder').and.returnValue(mockMediaRecorder);

container = new ElementRef(document.createElement('div'));
Expand Down