From 52a29ed00a298940c1e9c12e39e6695e00b60ce0 Mon Sep 17 00:00:00 2001 From: Paul Armstrong Date: Fri, 12 Feb 2021 16:30:14 -0800 Subject: [PATCH] test(web): routes/Camera --- web/src/routes/CameraMap.jsx | 48 +++++++++---------- web/src/routes/__tests__/Camera.test.jsx | 60 ++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 24 deletions(-) create mode 100644 web/src/routes/__tests__/Camera.test.jsx diff --git a/web/src/routes/CameraMap.jsx b/web/src/routes/CameraMap.jsx index fe8c8210c..1e3d32760 100644 --- a/web/src/routes/CameraMap.jsx +++ b/web/src/routes/CameraMap.jsx @@ -29,8 +29,8 @@ export default function CameraMasks({ camera, url }) { Array.isArray(motionMask) ? motionMask.map((mask) => getPolylinePoints(mask)) : motionMask - ? [getPolylinePoints(motionMask)] - : [] + ? [getPolylinePoints(motionMask)] + : [] ); const [zonePoints, setZonePoints] = useState( @@ -44,8 +44,8 @@ export default function CameraMasks({ camera, url }) { [name]: Array.isArray(objectFilters[name].mask) ? objectFilters[name].mask.map((mask) => getPolylinePoints(mask)) : objectFilters[name].mask - ? [getPolylinePoints(objectFilters[name].mask)] - : [], + ? [getPolylinePoints(objectFilters[name].mask)] + : [], }), {} ) @@ -128,11 +128,11 @@ ${motionMaskPoints.map((mask, i) => ` - ${polylinePointsToPolyline(mask)}`) const handleCopyZones = useCallback(async () => { await window.navigator.clipboard.writeText(` zones: ${Object.keys(zonePoints) - .map( - (zoneName) => ` ${zoneName}: + .map( + (zoneName) => ` ${zoneName}: coordinates: ${polylinePointsToPolyline(zonePoints[zoneName])}` - ) - .join('\n')}`); + ) + .join('\n')}`); }, [zonePoints]); // Object methods @@ -164,14 +164,14 @@ ${Object.keys(zonePoints) await window.navigator.clipboard.writeText(` objects: filters: ${Object.keys(objectMaskPoints) - .map((objectName) => - objectMaskPoints[objectName].length - ? ` ${objectName}: + .map((objectName) => + objectMaskPoints[objectName].length + ? ` ${objectName}: mask: ${polylinePointsToPolyline(objectMaskPoints[objectName])}` - : '' - ) - .filter(Boolean) - .join('\n')}`); + : '' + ) + .filter(Boolean) + .join('\n')}`); }, [objectMaskPoints]); const handleAddToObjectMask = useCallback( @@ -360,15 +360,15 @@ function EditableMask({ onChange, points, scale, snap, width, height }) { {!scaledPoints ? null : scaledPoints.map(([x, y], i) => ( - - ))} + + ))}
{ + let mockUsePersistence, mockSetOptions; + + beforeEach(() => { + mockSetOptions = jest.fn(); + mockUsePersistence = jest.spyOn(Context, 'usePersistence').mockImplementation(() => [{}, mockSetOptions]); + jest.spyOn(Api, 'useConfig').mockImplementation(() => ({ + data: { cameras: { front: { name: 'front', objects: { track: ['taco', 'cat', 'dog'] } } } }, + })); + jest.spyOn(Api, 'useApiHost').mockImplementation(() => 'http://base-url.local:5000'); + jest.spyOn(AutoUpdatingCameraImage, 'default').mockImplementation(({ searchParams }) => { + return
{searchParams.toString()}
; + }); + }); + + test('reads camera feed options from persistence', async () => { + mockUsePersistence.mockReturnValue([ + { + bbox: true, + timestamp: false, + zones: true, + mask: false, + motion: true, + regions: false, + }, + mockSetOptions, + ]); + render(); + fireEvent.click(screen.queryByText('Show Options')); + expect(screen.queryByTestId('mock-image')).toHaveTextContent( + 'bbox=1×tamp=0&zones=1&mask=0&motion=1®ions=0' + ); + }); + + test('updates camera feed options to persistence', async () => { + mockUsePersistence + .mockReturnValueOnce([{}, mockSetOptions]) + .mockReturnValueOnce([{ bbox: true }, mockSetOptions]) + .mockReturnValueOnce([{ bbox: true, timestamp: true }, mockSetOptions]); + + render(); + + fireEvent.click(screen.queryByText('Show Options')); + fireEvent.change(screen.queryByTestId('bbox-input'), { target: { checked: true } }); + fireEvent.change(screen.queryByTestId('timestamp-input'), { target: { checked: true } }); + fireEvent.click(screen.queryByText('Hide Options')); + + expect(mockSetOptions).toHaveBeenCalledWith({ bbox: true, timestamp: true }); + expect(screen.queryByTestId('mock-image')).toHaveTextContent('bbox=1×tamp=1'); + }); +});