databag/net/web/test/App.test.js

135 lines
4.0 KiB
JavaScript
Raw Normal View History

2023-01-12 01:00:48 +00:00
import React, { useState, useEffect, useContext } from 'react';
import {render, act, screen, waitFor, fireEvent} from '@testing-library/react'
2023-01-12 01:00:48 +00:00
import * as fetchUtil from 'api/fetchUtil';
import { AppContext, AppContextProvider } from 'context/AppContext';
import { AccountContextProvider } from 'context/AccountContext';
import { ProfileContextProvider } from 'context/ProfileContext';
import { CardContextProvider } from 'context/CardContext';
import { ChannelContextProvider } from 'context/ChannelContext';
import { StoreContextProvider } from 'context/StoreContext';
import { UploadContextProvider } from 'context/UploadContext';
2024-03-08 00:43:36 +00:00
import { SettingsContextProvider } from 'context/SettingsContext';
2023-04-14 22:49:24 +00:00
import { RingContextProvider } from 'context/RingContext';
2023-01-12 01:00:48 +00:00
import { ConversationContextProvider } from 'context/ConversationContext';
2023-01-12 05:54:26 +00:00
let mockWebsocket;
2023-01-12 01:00:48 +00:00
function MockWebsocket(url) {
2023-01-12 05:54:26 +00:00
this.url = url;
};
2023-01-12 01:00:48 +00:00
let appContext = null;
function AppView() {
const [renderCount, setRenderCount] = useState(0);
const app = useContext(AppContext);
appContext = app;
useEffect(() => {
setRenderCount(renderCount + 1);
}, [app.state]);
return (
<div>
<span data-testid="count">{ renderCount }</span>
<span data-testid="status">{ app.state.status }</span>
2023-01-12 01:00:48 +00:00
</div>
);
}
function AppTestApp() {
return (
<UploadContextProvider>
<ChannelContextProvider>
<CardContextProvider>
<ProfileContextProvider>
<StoreContextProvider>
<AccountContextProvider>
2023-04-14 22:49:24 +00:00
<RingContextProvider>
2024-03-08 00:43:36 +00:00
<SettingsContextProvider>
2023-04-14 22:49:24 +00:00
<AppContextProvider>
<AppView />
</AppContextProvider>
2024-03-08 00:43:36 +00:00
</SettingsContextProvider>
2023-04-14 22:49:24 +00:00
</RingContextProvider>
2023-01-12 01:00:48 +00:00
</AccountContextProvider>
</StoreContextProvider>
</ProfileContextProvider>
</CardContextProvider>
</ChannelContextProvider>
</UploadContextProvider>
);
}
const realCreateWebsocket = fetchUtil.createWebsocket;
const realFetchWithTimeout = fetchUtil.fetchWithTimeout;
const realFetchWithCustomTimeout = fetchUtil.fetchWithCustomTimeout;
beforeEach(() => {
2023-01-12 01:00:48 +00:00
const mockCreateWebsocket = jest.fn().mockImplementation((url) => {
2023-01-12 05:54:26 +00:00
mockWebsocket = new MockWebsocket(url);
return mockWebsocket;
2023-01-12 01:00:48 +00:00
});
const mockFetch = jest.fn().mockImplementation((url, options) => {
const params = url.split('/');
if (params[1] === 'account' && options.method === 'POST') {
return Promise.resolve({
json: () => Promise.resolve({ guid: '01ab', appToken: 'aacc', created: 2, pushSupported: false })
2023-01-12 01:00:48 +00:00
});
}
else {
2023-01-12 01:00:48 +00:00
return Promise.resolve({
json: () => Promise.resolve([])
2023-01-12 01:00:48 +00:00
});
}
});
fetchUtil.createWebsocket = mockCreateWebsocket;
fetchUtil.fetchWithTimeout = mockFetch;
fetchUtil.fetchWithCustomTimeout = mockFetch;
});
afterEach(() => {
fetchUtil.createWebsocket = realCreateWebsocket;
fetchUtil.fetchWithTimeout = realFetchWithTimeout;
fetchUtil.fetchWithCustomTimeout = realFetchWithCustomTimeout;
});
test('testing app sync', async () => {
render(<AppTestApp />);
await waitFor(async () => {
expect(appContext).not.toBe(null);
});
await act(async () => {
appContext.actions.login('testlogin', 'testpassword');
2023-01-12 05:54:26 +00:00
expect(mockWebsocket?.onmessage).not.toBe(null);
expect(mockWebsocket?.onclose).not.toBe(null);
});
await waitFor(async () => {
expect(screen.getByTestId('status').textContent).toBe('connecting');
});
await act(async () => {
mockWebsocket.onmessage({ data: JSON.stringify({ account: 1, profile: 1, card: 1, channel: 1 }) });
});
await waitFor(async () => {
expect(screen.getByTestId('status').textContent).toBe('connected');
});
await act(async () => {
2023-01-12 14:01:32 +00:00
mockWebsocket.onclose('test close');
await new Promise(r => setTimeout(r, 1000));
2023-01-12 01:00:48 +00:00
});
await waitFor(async () => {
2023-01-12 05:54:26 +00:00
expect(screen.getByTestId('status').textContent).toBe('connecting');
2023-01-12 01:00:48 +00:00
});
2023-01-12 01:00:48 +00:00
});