mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-15 01:03:03 +08:00
159 lines
4.6 KiB
TypeScript
159 lines
4.6 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);
|
|
});
|
|
|
|
it('should unmount orphaned views', () => {
|
|
const itemA = createRegisteredViewItem(viewStacks, 1, '/home/1', true);
|
|
const itemB = createRegisteredViewItem(viewStacks, 1, '/home/2', true);
|
|
const itemC = createRegisteredViewItem(viewStacks, 1, '/home/3', true);
|
|
const itemD = createRegisteredViewItem(viewStacks, 1, '/home/4', true);
|
|
|
|
viewStacks.unmountLeavingViews(1, itemA, -3);
|
|
|
|
expect(itemB.mount).toEqual(false);
|
|
expect(itemB.ionPageElement).toEqual(undefined);
|
|
expect(itemB.ionRoute).toEqual(false);
|
|
|
|
expect(itemC.mount).toEqual(false);
|
|
expect(itemC.ionPageElement).toEqual(undefined);
|
|
expect(itemC.ionRoute).toEqual(false);
|
|
});
|
|
|
|
it('should remount intermediary views', () => {
|
|
const itemA = createRegisteredViewItem(viewStacks);
|
|
const itemB = createRegisteredViewItem(viewStacks);
|
|
const itemC = createRegisteredViewItem(viewStacks);
|
|
const itemD = createRegisteredViewItem(viewStacks);
|
|
|
|
viewStacks.mountIntermediaryViews(1, itemA, 3);
|
|
|
|
expect(itemB.mount).toEqual(true);
|
|
expect(itemC.mount).toEqual(true);
|
|
});
|
|
})
|
|
|
|
const createRegisteredViewItem = (viewStacks, outletId = '1', route = `/home/${counter++}`, mount = false) => {
|
|
const item = viewStacks.createViewItem(
|
|
outletId,
|
|
() => {},
|
|
{ path: '/mockMatchedRoute' },
|
|
{ pathname: route }
|
|
);
|
|
|
|
viewStacks.add(item);
|
|
|
|
if (mount) {
|
|
const ionPage = document.createElement('div');
|
|
ionPage.classList.add('ion-page');
|
|
|
|
viewStacks.registerIonPage(item, ionPage);
|
|
|
|
item.mount = true;
|
|
item.ionRoute = true;
|
|
}
|
|
|
|
return item;
|
|
}
|