Files

125 lines
3.4 KiB
TypeScript

/**
* @jest-environment jsdom
*/
import { createViewStacks } from '../src/viewStacks';
let viewStacks;
let counter = 0;
describe('View Stacks', () => {
beforeEach(() => {
counter = 0;
viewStacks = createViewStacks();
});
it('should create a view item', () => {
const item = viewStacks.createViewItem(
'1',
() => {},
{ path: '/mockMatchedRoute' },
{ pathname: '/home' }
);
expect(item.outletId).toEqual('1');
expect(item.matchedRoute).toEqual({ path: '/mockMatchedRoute' });
expect(item.pathname).toEqual('/home');
});
it('should add a view item', () => {
const item = viewStacks.createViewItem(
'1',
() => {},
{ path: '/mockMatchedRoute' },
{ pathname: '/home' }
);
viewStacks.add(item);
const viewItem = viewStacks.findViewItemByRouteInfo({ pathname: '/home' }, '1');
expect(viewItem).toEqual(item);
});
it('should register an ion page', () => {
const item = viewStacks.createViewItem(
'1',
() => {},
{ path: '/mockMatchedRoute' },
{ pathname: '/home' }
);
viewStacks.add(item);
const ionPage = document.createElement('div');
ionPage.classList.add('ion-page');
viewStacks.registerIonPage(item, ionPage);
const viewItem = viewStacks.findViewItemByRouteInfo({ pathname: '/home' }, '1');
expect(viewItem.ionPageElement).toEqual(ionPage);
});
it('should get view item by route info', () => {
const itemA = createRegisteredViewItem(viewStacks, '1', '/home');
const itemB = createRegisteredViewItem(viewStacks, '2', '/dashboard');
const getViewItem = viewStacks.findViewItemByRouteInfo({ pathname: '/dashboard', outletId: '2' });
expect(getViewItem.id).toEqual(itemB.id);
const getViewItemAgain = viewStacks.findViewItemByRouteInfo({ pathname: '/dashboard' });
expect(getViewItemAgain.id).toEqual(itemB.id);
});
it('should get leaving view by route info', () => {
const itemA = createRegisteredViewItem(viewStacks, '1', '/home');
const itemB = createRegisteredViewItem(viewStacks, '2', '/dashboard');
const getLeavingView = viewStacks.findLeavingViewItemByRouteInfo({ pathname: '/home', lastPathname: '/dashboard', matchedRoute: { path: '/home' } });
expect(getLeavingView).toEqual(itemB);
});
it('should get children to render', () => {
const itemA = createRegisteredViewItem(viewStacks);
const itemB = createRegisteredViewItem(viewStacks);
const itemC = createRegisteredViewItem(viewStacks);
itemA.mount = itemC.mount = true;
const routes = viewStacks.getChildrenToRender(1);
expect(routes).toEqual([
itemA,
itemC
]);
});
it('should clear a stack', () => {
const itemA = createRegisteredViewItem(viewStacks, 2);
const itemB = createRegisteredViewItem(viewStacks, 2);
const viewItems = viewStacks.getViewStack(2);
expect(viewItems.length).toEqual(2);
viewStacks.clear('2');
const viewItemsAgain = viewStacks.getViewStack(2);
expect(viewItemsAgain).toEqual(undefined);
})
})
const createRegisteredViewItem = (viewStacks, outletId = '1', route = `/home/${counter++}`) => {
const item = viewStacks.createViewItem(
outletId,
() => {},
{ path: '/mockMatchedRoute' },
{ pathname: route }
);
viewStacks.add(item);
const ionPage = document.createElement('div');
ionPage.classList.add('ion-page');
viewStacks.registerIonPage(item, ionPage);
return item;
}