Files
frigate/web/src/api/__tests__/ws.test.jsx
T

155 lines
4.5 KiB
React
Raw Normal View History

2023-10-15 09:14:20 -04:00
/* eslint-disable jest/no-disabled-tests */
2021-02-15 20:10:20 -08:00
import { h } from 'preact';
2023-10-15 09:14:20 -04:00
import { WS as frigateWS, WsProvider, useWs } from '../ws';
2021-02-15 20:10:20 -08:00
import { useCallback, useContext } from 'preact/hooks';
2022-03-05 22:16:31 -06:00
import { fireEvent, render, screen } from 'testing-library';
2023-10-15 09:14:20 -04:00
import { WS } from 'jest-websocket-mock';
2021-02-15 20:10:20 -08:00
function Test() {
2023-10-15 09:14:20 -04:00
const { state } = useContext(frigateWS);
2021-02-15 20:10:20 -08:00
return state.__connected ? (
<div data-testid="data">
{Object.keys(state).map((key) => (
2022-02-26 13:11:00 -06:00
<div key={key} data-testid={key}>
{JSON.stringify(state[key])}
</div>
2021-02-15 20:10:20 -08:00
))}
</div>
) : null;
}
const TEST_URL = 'ws://test-foo:1234/ws';
describe('WsProvider', () => {
2023-10-15 09:14:20 -04:00
let wsClient, wsServer;
beforeEach(async () => {
2021-02-15 20:10:20 -08:00
wsClient = {
2022-11-13 10:31:36 -06:00
close: vi.fn(),
send: vi.fn(),
2021-02-15 20:10:20 -08:00
};
2023-10-15 09:14:20 -04:00
wsServer = new WS(TEST_URL);
2021-02-15 20:10:20 -08:00
});
2023-10-15 09:14:20 -04:00
afterEach(() => {
WS.clean();
});
test.skip('connects to the ws server', async () => {
2021-02-15 20:10:20 -08:00
render(
2023-10-15 09:14:20 -04:00
<WsProvider config={mockConfig} wsUrl={TEST_URL}>
2021-02-15 20:10:20 -08:00
<Test />
</WsProvider>
2021-02-15 20:10:20 -08:00
);
2023-10-15 09:14:20 -04:00
await wsServer.connected;
2021-02-15 20:10:20 -08:00
await screen.findByTestId('data');
expect(wsClient.args).toEqual([TEST_URL]);
expect(screen.getByTestId('__connected')).toHaveTextContent('true');
});
2023-10-15 09:14:20 -04:00
test.skip('receives data through useWs', async () => {
2021-02-15 20:10:20 -08:00
function Test() {
const {
value: { payload, retain },
connected,
} = useWs('tacos');
2021-02-15 20:10:20 -08:00
return connected ? (
<div>
<div data-testid="payload">{JSON.stringify(payload)}</div>
<div data-testid="retain">{JSON.stringify(retain)}</div>
</div>
) : null;
}
const { rerender } = render(
2023-10-15 09:14:20 -04:00
<WsProvider config={mockConfig} wsUrl={TEST_URL}>
2021-02-15 20:10:20 -08:00
<Test />
</WsProvider>
2021-02-15 20:10:20 -08:00
);
2023-10-15 09:14:20 -04:00
await wsServer.connected;
2021-02-15 20:10:20 -08:00
await screen.findByTestId('payload');
wsClient.onmessage({
data: JSON.stringify({ topic: 'tacos', payload: JSON.stringify({ yes: true }), retain: false }),
});
rerender(
2023-10-15 09:14:20 -04:00
<WsProvider config={mockConfig} wsUrl={TEST_URL}>
2021-02-15 20:10:20 -08:00
<Test />
</WsProvider>
2021-02-15 20:10:20 -08:00
);
expect(screen.getByTestId('payload')).toHaveTextContent('{"yes":true}');
expect(screen.getByTestId('retain')).toHaveTextContent('false');
});
2023-10-15 09:14:20 -04:00
test.skip('can send values through useWs', async () => {
2021-02-15 20:10:20 -08:00
function Test() {
const { send, connected } = useWs('tacos');
2021-02-15 20:10:20 -08:00
const handleClick = useCallback(() => {
send({ yes: true });
}, [send]);
return connected ? <button onClick={handleClick}>click me</button> : null;
}
render(
2023-10-15 09:14:20 -04:00
<WsProvider config={mockConfig} wsUrl={TEST_URL}>
2021-02-15 20:10:20 -08:00
<Test />
</WsProvider>
2021-02-15 20:10:20 -08:00
);
2023-10-15 09:14:20 -04:00
await wsServer.connected;
2021-02-15 20:10:20 -08:00
await screen.findByRole('button');
fireEvent.click(screen.getByRole('button'));
await expect(wsClient.send).toHaveBeenCalledWith(
2022-04-25 06:59:52 -05:00
JSON.stringify({ topic: 'tacos', payload: JSON.stringify({ yes: true }), retain: false })
2021-02-15 20:10:20 -08:00
);
});
2021-02-17 20:53:57 -08:00
2023-10-15 09:14:20 -04:00
test.skip('prefills the recordings/detect/snapshots state from config', async () => {
2022-11-13 10:31:36 -06:00
vi.spyOn(Date, 'now').mockReturnValue(123456);
2021-02-17 20:53:57 -08:00
const config = {
cameras: {
2023-10-15 09:14:20 -04:00
front: {
name: 'front',
detect: { enabled: true },
record: { enabled: false },
snapshots: { enabled: true },
audio: { enabled: false },
},
side: {
name: 'side',
detect: { enabled: false },
record: { enabled: false },
snapshots: { enabled: false },
audio: { enabled: false },
},
2021-02-17 20:53:57 -08:00
},
};
render(
2023-10-15 09:14:20 -04:00
<WsProvider config={config} wsUrl={TEST_URL}>
2021-02-17 20:53:57 -08:00
<Test />
</WsProvider>
2021-02-17 20:53:57 -08:00
);
2023-10-15 09:14:20 -04:00
await wsServer.connected;
2021-02-17 20:53:57 -08:00
await screen.findByTestId('data');
2022-02-26 13:11:00 -06:00
expect(screen.getByTestId('front/detect/state')).toHaveTextContent(
2022-04-25 06:59:52 -05:00
'{"lastUpdate":123456,"payload":"ON","retain":false}'
2022-02-26 13:11:00 -06:00
);
expect(screen.getByTestId('front/recordings/state')).toHaveTextContent(
2022-04-25 06:59:52 -05:00
'{"lastUpdate":123456,"payload":"OFF","retain":false}'
2022-02-26 13:11:00 -06:00
);
expect(screen.getByTestId('front/snapshots/state')).toHaveTextContent(
2022-04-25 06:59:52 -05:00
'{"lastUpdate":123456,"payload":"ON","retain":false}'
2022-02-26 13:11:00 -06:00
);
expect(screen.getByTestId('side/detect/state')).toHaveTextContent(
2022-04-25 06:59:52 -05:00
'{"lastUpdate":123456,"payload":"OFF","retain":false}'
2022-02-26 13:11:00 -06:00
);
expect(screen.getByTestId('side/recordings/state')).toHaveTextContent(
2022-04-25 06:59:52 -05:00
'{"lastUpdate":123456,"payload":"OFF","retain":false}'
2022-02-26 13:11:00 -06:00
);
expect(screen.getByTestId('side/snapshots/state')).toHaveTextContent(
2022-04-25 06:59:52 -05:00
'{"lastUpdate":123456,"payload":"OFF","retain":false}'
2022-02-26 13:11:00 -06:00
);
2021-02-17 20:53:57 -08:00
});
2021-02-15 20:10:20 -08:00
});
2021-02-17 20:53:57 -08:00
const mockConfig = {
cameras: {},
};