Skip to content

Commit 89283fc

Browse files
committed
Update tests
1 parent 1a70132 commit 89283fc

9 files changed

+202
-13
lines changed

assets/demo.webp

-32.8 KB
Loading

test/core/VitalLens.browser.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ jest.mock('../../src/core/VitalLensController.browser', () => ({
66
startVideoStream: jest.fn(),
77
pauseVideoStream: jest.fn(),
88
stopVideoStream: jest.fn(),
9+
setInferenceEnabled: jest.fn(),
10+
reset: jest.fn(),
911
processVideoFile: jest.fn(async () => ({
1012
message: 'Processed file successfully.',
1113
})),
@@ -78,4 +80,16 @@ describe('VitalLens (Browser)', () => {
7880
vitalLens.close();
7981
expect(vitalLens['controller'].dispose).toHaveBeenCalled();
8082
});
83+
84+
test('should call setInferenceEnabled on the controller', () => {
85+
vitalLens.setInferenceEnabled(true);
86+
expect(vitalLens['controller'].setInferenceEnabled).toHaveBeenCalledWith(
87+
true
88+
);
89+
});
90+
91+
test('should call reset on the controller', () => {
92+
vitalLens.reset();
93+
expect(vitalLens['controller'].reset).toHaveBeenCalled();
94+
});
8195
});

test/core/VitalLens.node.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ jest.mock('../../src/core/VitalLensController.node', () => ({
66
startVideoStream: jest.fn(),
77
pauseVideoStream: jest.fn(),
88
stopVideoStream: jest.fn(),
9+
setInferenceEnabled: jest.fn(),
10+
reset: jest.fn(),
911
processVideoFile: jest.fn(async () => ({
1012
message: 'Processed file successfully.',
1113
})),
@@ -64,4 +66,16 @@ describe('VitalLens (Node)', () => {
6466
vitalLens.close();
6567
expect(vitalLens['controller'].dispose).toHaveBeenCalled();
6668
});
69+
70+
test('should call setInferenceEnabled on the controller', () => {
71+
vitalLens.setInferenceEnabled(true);
72+
expect(vitalLens['controller'].setInferenceEnabled).toHaveBeenCalledWith(
73+
true
74+
);
75+
});
76+
77+
test('should call reset on the controller', () => {
78+
vitalLens.reset();
79+
expect(vitalLens['controller'].reset).toHaveBeenCalled();
80+
});
6781
});

test/core/VitalLensController.browser.test.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,19 @@ describe('VitalLensController (Browser)', () => {
151151
expect(
152152
controller['frameIteratorFactory']!.createStreamFrameIterator
153153
).toHaveBeenCalledWith(mockStream, mockVideoElement);
154-
expect(StreamProcessor).toHaveBeenCalled();
154+
expect(StreamProcessor).toHaveBeenCalledWith(
155+
mockOptions,
156+
expect.any(Function), // getConfig
157+
expect.any(Object), // frameIterator
158+
expect.any(Object), // bufferManager
159+
expect.any(Object), // faceDetectionWorker
160+
expect.any(Object), // methodHandler
161+
expect.any(Object), // bufferedResultsConsumer
162+
expect.any(Function), // onPredict
163+
expect.any(Function), // onNoFace
164+
expect.any(Function), // onStreamReset (NEW)
165+
expect.any(Function) // onFaceDetected (NEW)
166+
);
155167
});
156168
});
157169
});

test/core/VitalLensController.node.test.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ describe('VitalLensController (Node)', () => {
9090
const dummyOnPredict = jest.fn();
9191
const dummyOnNoFace = jest.fn();
9292
const dummyOnStreamReset = jest.fn();
93+
const dummyOnFaceDetected = jest.fn();
9394

9495
const streamProcessor = (controller as any).createStreamProcessor(
9596
dummyOptions,
@@ -101,7 +102,8 @@ describe('VitalLensController (Node)', () => {
101102
dummyBufferedResultsConsumer,
102103
dummyOnPredict,
103104
dummyOnNoFace,
104-
dummyOnStreamReset
105+
dummyOnStreamReset,
106+
dummyOnFaceDetected
105107
);
106108
expect(StreamProcessor).toHaveBeenCalledWith(
107109
dummyOptions,
@@ -113,7 +115,8 @@ describe('VitalLensController (Node)', () => {
113115
dummyBufferedResultsConsumer,
114116
dummyOnPredict,
115117
dummyOnNoFace,
116-
dummyOnStreamReset
118+
dummyOnStreamReset,
119+
dummyOnFaceDetected
117120
);
118121
expect(streamProcessor).toBeInstanceOf(StreamProcessor);
119122
});

test/core/VitalLensController.shared.test.ts

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,16 @@ class TestVitalLensController extends VitalLensControllerBase {
6262
methodHandler: MethodHandler,
6363
bufferedResultsConsumer: BufferedResultsConsumer | null,
6464
onPredict: (result: VitalLensResult) => Promise<void>,
65-
onNoFace: () => Promise<void>
65+
onNoFace: () => Promise<void>,
66+
onFaceDetected?: (face: any) => void
6667
): IStreamProcessor {
6768
return {
6869
init: jest.fn(),
6970
start: jest.fn(),
7071
isProcessing: jest.fn(),
7172
stop: jest.fn(),
73+
setInferenceEnabled: jest.fn(),
74+
reset: jest.fn(),
7275
};
7376
}
7477
}
@@ -176,6 +179,10 @@ describe('VitalLensControllerBase', () => {
176179
mockStreamProcessor = {
177180
isProcessing: jest.fn().mockReturnValue(false),
178181
start: jest.fn(),
182+
setInferenceEnabled: jest.fn(),
183+
reset: jest.fn(),
184+
stop: jest.fn(),
185+
init: jest.fn(),
179186
};
180187
controller['streamProcessor'] = mockStreamProcessor as IStreamProcessor;
181188

@@ -188,6 +195,10 @@ describe('VitalLensControllerBase', () => {
188195
mockStreamProcessor = {
189196
isProcessing: jest.fn().mockReturnValue(true),
190197
start: jest.fn(),
198+
setInferenceEnabled: jest.fn(),
199+
reset: jest.fn(),
200+
stop: jest.fn(),
201+
init: jest.fn(),
191202
};
192203
controller['streamProcessor'] = mockStreamProcessor as IStreamProcessor;
193204

@@ -201,7 +212,11 @@ describe('VitalLensControllerBase', () => {
201212
// Create a mock stream processor that is processing
202213
mockStreamProcessor = {
203214
isProcessing: jest.fn().mockReturnValue(true),
215+
start: jest.fn(),
216+
setInferenceEnabled: jest.fn(),
217+
reset: jest.fn(),
204218
stop: jest.fn(),
219+
init: jest.fn(),
205220
};
206221
controller['streamProcessor'] = mockStreamProcessor as IStreamProcessor;
207222
controller['vitalsEstimateManager'].resetAll = jest.fn();
@@ -215,7 +230,11 @@ describe('VitalLensControllerBase', () => {
215230
// Create a mock stream processor that is not processing
216231
mockStreamProcessor = {
217232
isProcessing: jest.fn().mockReturnValue(false),
233+
start: jest.fn(),
234+
setInferenceEnabled: jest.fn(),
235+
reset: jest.fn(),
218236
stop: jest.fn(),
237+
init: jest.fn(),
219238
};
220239
controller['streamProcessor'] = mockStreamProcessor as IStreamProcessor;
221240
controller['vitalsEstimateManager'].resetAll = jest.fn();
@@ -232,7 +251,12 @@ describe('VitalLensControllerBase', () => {
232251
test('should stop the streamProcessor (if exists) and reset vitalsEstimateManager', () => {
233252
// Create a mock stream processor that is processing
234253
mockStreamProcessor = {
254+
isProcessing: jest.fn().mockReturnValue(true),
235255
stop: jest.fn(),
256+
start: jest.fn(),
257+
setInferenceEnabled: jest.fn(),
258+
reset: jest.fn(),
259+
init: jest.fn(),
236260
};
237261
controller['streamProcessor'] = mockStreamProcessor as IStreamProcessor;
238262
controller['vitalsEstimateManager'].resetAll = jest.fn();
@@ -448,4 +472,46 @@ describe('VitalLensControllerBase', () => {
448472
expect(controller['isProcessing']()).toBe(false);
449473
});
450474
});
475+
476+
describe('setInferenceEnabled', () => {
477+
test('should call setInferenceEnabled on streamProcessor if it exists', () => {
478+
const mockProc = {
479+
isProcessing: jest.fn(),
480+
start: jest.fn(),
481+
stop: jest.fn(),
482+
init: jest.fn(),
483+
setInferenceEnabled: jest.fn(),
484+
reset: jest.fn(),
485+
};
486+
controller['streamProcessor'] = mockProc as unknown as IStreamProcessor;
487+
488+
controller.setInferenceEnabled(true);
489+
expect(mockProc.setInferenceEnabled).toHaveBeenCalledWith(true);
490+
});
491+
});
492+
493+
describe('reset', () => {
494+
test('should call reset on streamProcessor if it exists', () => {
495+
const mockProc = {
496+
isProcessing: jest.fn(),
497+
start: jest.fn(),
498+
stop: jest.fn(),
499+
init: jest.fn(),
500+
setInferenceEnabled: jest.fn(),
501+
reset: jest.fn(),
502+
};
503+
controller['streamProcessor'] = mockProc as unknown as IStreamProcessor;
504+
505+
controller.reset();
506+
expect(mockProc.reset).toHaveBeenCalled();
507+
});
508+
509+
test('should cleanup bufferManager if streamProcessor does not exist', () => {
510+
controller['streamProcessor'] = null;
511+
controller['bufferManager'].cleanup = jest.fn();
512+
513+
controller.reset();
514+
expect(controller['bufferManager'].cleanup).toHaveBeenCalled();
515+
});
516+
});
451517
});

test/processing/StreamProcessor.browser.test.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ describe('StreamProcessor (Browser)', () => {
4242
const dummyBufferedResultsConsumer = {} as any;
4343
const dummyOnPredict = jest.fn(async (result) => {});
4444
const dummyOnNoFace = jest.fn(async () => {});
45+
const dummyOnStreamReset = jest.fn();
46+
const dummyOnFaceDetected = jest.fn();
4547

4648
// Minimal BufferManager mock.
4749
const fakeBufferManager: BufferManager = {
@@ -104,7 +106,9 @@ describe('StreamProcessor (Browser)', () => {
104106
dummyMethodHandler,
105107
dummyBufferedResultsConsumer,
106108
dummyOnPredict,
107-
dummyOnNoFace
109+
dummyOnNoFace,
110+
dummyOnStreamReset,
111+
dummyOnFaceDetected
108112
);
109113
});
110114

@@ -119,7 +123,9 @@ describe('StreamProcessor (Browser)', () => {
119123
dummyMethodHandler,
120124
dummyBufferedResultsConsumer,
121125
dummyOnPredict,
122-
dummyOnNoFace
126+
dummyOnNoFace,
127+
dummyOnStreamReset,
128+
dummyOnFaceDetected
123129
);
124130
expect(() =>
125131
(proc as any).triggerFaceDetection(mockFrame as unknown as Frame, 1)
@@ -276,4 +282,24 @@ describe('StreamProcessor (Browser)', () => {
276282
expect(fakeBufferManager.addBuffer).not.toHaveBeenCalled();
277283
});
278284
});
285+
286+
describe('onFaceDetected', () => {
287+
it('should call onFaceDetected callback on valid detection', () => {
288+
const event = new MessageEvent('message', {
289+
data: {
290+
id: 1,
291+
detections: [{ x0: 10, y0: 10, x1: 50, y1: 50, confidence: 0.99 }],
292+
probeInfo: { width: 640, height: 480 },
293+
timestamp: 1.0,
294+
},
295+
});
296+
297+
(processor as any).handleFaceDetectionResult(event);
298+
299+
expect(dummyOnFaceDetected).toHaveBeenCalledWith({
300+
coordinates: [10, 10, 50, 50],
301+
confidence: 0.99,
302+
});
303+
});
304+
});
279305
});

0 commit comments

Comments
 (0)