import React from 'react';
import { Page, RouteList, Router, RouterContext, Location, useLocation, ROOT_MAIN } from '..';
import { act, render, cleanup } from '@testing-library/react';
import { noop, delay } from './tools';
import { ConfigProvider, Root, View, Panel, Epic, Tabbar } from '@vkontakte/vkui';
describe('VKUI', () => {
beforeEach(() => {
window.history.replaceState({}, '', '/#');
});
const getViewProps = (viewId: string, location: Location, defPanel: string) => {
return {
id: viewId,
activePanel: location.getViewActivePanel(viewId) || defPanel,
history: location.getViewHistory(viewId),
};
};
test('VKUI integration stress test', async (done) => {
// scrollTo is not implemented
Object.defineProperty(global.window, 'scrollTo', { value: noop });
const PAGE_MAIN = '/';
const PAGE_ABOUT = '/about';
const PAGE_ABOUT_NEXT = '/about/next';
const PAGE_INFO = '/info';
const PANEL_MAIN = 'panel_main';
const PANEL_ABOUT = 'panel_about';
const PANEL_ABOUT_NEXT = 'panel_about_next';
const PANEL_INFO = 'panel_info';
const VIEW_MAIN = 'view_main';
const VIEW_ABOUT = 'view_about';
const VIEW_INFO = 'view_info';
const list: RouteList = {
[PAGE_MAIN]: new Page(PANEL_MAIN, VIEW_MAIN),
[PAGE_ABOUT]: new Page(PANEL_ABOUT, VIEW_ABOUT),
[PAGE_ABOUT_NEXT]: new Page(PANEL_ABOUT_NEXT, VIEW_ABOUT),
[PAGE_INFO]: new Page(PANEL_INFO, VIEW_INFO),
};
const Main: React.FC = () => {
const location = useLocation(true);
return (
{PANEL_MAIN}
{PANEL_ABOUT}
{PANEL_ABOUT_NEXT}
{PANEL_INFO}
);
};
const router = new Router(list);
router.start();
const component = render(
,
,
);
const updateAct = async (count: number, callback: () => void) => {
await act(() => {
return new Promise((resolve, reject) => {
let updates = 0;
const update = () => {
updates = updates + 1;
if (updates >= count) {
router.off('update', update);
setTimeout(resolve, 20);
}
};
router.on('update', update);
setTimeout(() => {
reject(new Error('Update timeout'));
}, 2E3);
try {
callback();
} catch (e) {
reject(e);
}
});
});
};
const expectPanel = async (panel: string) => {
expect(await component.findByTestId(panel)).toBeTruthy();
};
await expectPanel(PANEL_MAIN);
await updateAct(2, () => {
router.pushPage(PAGE_INFO);
router.pushPageAfterPreviews(PAGE_MAIN, PAGE_ABOUT);
});
await expectPanel(PANEL_ABOUT);
await updateAct(1, () => {
router.popPage();
});
await expectPanel(PANEL_MAIN);
await updateAct(3, () => {
router.pushPage(PAGE_ABOUT);
router.pushPage(PAGE_ABOUT_NEXT);
router.pushPageAfterPreviews(PAGE_MAIN, PAGE_INFO);
});
await expectPanel(PANEL_INFO);
await updateAct(1, () => {
router.popPage();
});
await expectPanel(PANEL_MAIN);
await updateAct(2, () => {
router.pushPage(PAGE_INFO);
router.pushPageAfterPreviews(PAGE_MAIN, PAGE_INFO);
});
await expectPanel(PANEL_INFO);
for (let i = 3; i > 0; --i) {
await updateAct(1, () => {
router.pushPageAfterPreviews(PAGE_MAIN, PAGE_ABOUT);
});
await expectPanel(PANEL_ABOUT);
}
await updateAct(1, () => {
router.popPage();
});
await expectPanel(PANEL_MAIN);
await updateAct(3, () => {
router.pushPage(PAGE_ABOUT);
router.pushPage(PAGE_ABOUT_NEXT);
router.pushPage(PAGE_INFO);
});
await expectPanel(PANEL_INFO);
await updateAct(1, () => {
router.popPageTo(-3);
});
await expectPanel(PANEL_MAIN);
await updateAct(3, () => {
router.pushPage(PAGE_INFO);
router.pushPage(PAGE_ABOUT_NEXT);
router.pushPage(PAGE_ABOUT);
});
await expectPanel(PANEL_ABOUT);
await updateAct(1, () => {
router.popPageTo(-3);
});
await expectPanel(PANEL_MAIN);
await updateAct(3, () => {
router.pushPage(PAGE_ABOUT_NEXT);
router.pushPage(PAGE_ABOUT);
router.pushPage(PAGE_INFO);
});
await expectPanel(PANEL_INFO);
await updateAct(1, () => {
router.popPageTo(-3);
});
await expectPanel(PANEL_MAIN);
await delay();
cleanup();
done();
});
test('VKUI Epic', async (done) => {
// scrollTo is not implemented
Object.defineProperty(global.window, 'scrollTo', { value: noop });
const PAGE_MAIN = '/';
const PAGE_ABOUT = '/about';
const PAGE_ABOUT_NEXT = '/about/next';
const PANEL_MAIN = 'panel_main';
const PANEL_ABOUT = 'panel_about';
const PANEL_ABOUT_NEXT = 'panel_about_next';
const VIEW_MAIN = 'view_main';
const VIEW_ABOUT = 'view_about';
const ROOT_ABOUT = 'root_about';
const list: RouteList = {
[PAGE_MAIN]: new Page(PANEL_MAIN, VIEW_MAIN),
[PAGE_ABOUT]: new Page(PANEL_ABOUT, VIEW_ABOUT, ROOT_ABOUT),
[PAGE_ABOUT_NEXT]: new Page(PANEL_ABOUT_NEXT, VIEW_ABOUT, ROOT_ABOUT),
};
const Main: React.FC = () => {
const location = useLocation(true);
return (
} activeStory={location.getRootId()}>
{PANEL_MAIN}
{PANEL_ABOUT}
{PANEL_ABOUT_NEXT}
);
};
const router = new Router(list);
router.start();
const component = render(
,
,
);
const expectPanel = async (panel: string) => {
expect(await component.findByTestId(panel)).toBeTruthy();
};
await expectPanel(PANEL_MAIN);
act(() => {
router.pushPage(PAGE_ABOUT);
});
await expectPanel(PANEL_ABOUT);
act(() => {
router.pushPage(PAGE_ABOUT_NEXT);
});
await expectPanel(PANEL_ABOUT_NEXT);
cleanup();
done();
});
});