import test from "ava"; import {ContainerFactory, Make} from "../container"; import {ViewManager} from "./view-manager"; import {EventBus} from "../event"; import {DeadRouteEvent, MountViewEvent, RefreshViewEvent, UmountViewEvent} from "./events"; import {AbstractView} from "./view"; import {GetString, ToString} from "../utils"; import {IView} from "./types"; import {Runtime} from "../runtime"; import {JSDOM} from "jsdom"; import {TemplateManager} from "../template"; import {Html} from "../dom"; import {Component} from "../component"; @ToString('boo') class SomeView extends AbstractView { public canHandle(path: string): boolean { return path === '/path'; } } @ToString('bar') class SomeSomeView extends AbstractView { public canHandle(path: string): boolean { return path === '/some-some'; } } test('ViewManager: Common Events', test => { const container = ContainerFactory.container(); const viewManager = container.create(ViewManager); const eventBus = container.create(EventBus); const templateManager = container.create(TemplateManager); container.register(Runtime, function () { return this.instance || (this.instance = new Runtime(new JSDOM('
').window)); }); const runtime = container.create(Runtime); templateManager.bind(runtime.html()); container.register(SomeView, Make.service(SomeView)); container.register(SomeSomeView, Make.service(SomeSomeView)); viewManager.register(SomeView); viewManager.register(SomeSomeView); let deadEvent = null; let routedView = null; let routedPath = null; let refresh = null; let umount = null; eventBus.listener(DeadRouteEvent).add((event: DeadRouteEvent) => { deadEvent = event.getPath(); }); eventBus.listener(MountViewEvent).add((event: MountViewEvent) => { routedView = event.getView(); routedPath = event.getPath(); }); eventBus.listener(RefreshViewEvent).add((event: RefreshViewEvent) => { refresh = event.getView(); }); eventBus.listener(UmountViewEvent).add((event: UmountViewEvent) => { umount = event.getView(); }); viewManager.routeTo('nope'); test.is(deadEvent, 'nope'); const view = viewManager.routeTo('/path'); test.is(routedView, view); test.is(routedPath, '/path'); test.truthy(view); test.is(view, viewManager.routeTo('/path')); test.is(refresh, view); test.is(GetString(view), 'boo'); test.truthy((view).html); test.true((view).isRendered()); test.truthy((view).html.getElement().parentElement); test.is(runtime.require('main').getElement(), runtime.require('main').getElement()); test.is(((view).html).getElement().outerHTML, '
'); test.is(runtime.require('body').getElement().outerHTML, '
'); test.truthy(viewManager.routeTo('/some-some')); test.is(umount, view); eventBus.listener(UmountViewEvent).add((event: UmountViewEvent) => { event.cancel(); }, 1000); test.truthy(viewManager.routeTo('/path')); test.is(viewManager.routeTo('/path'), container.create(SomeSomeView)); }); test('View: Types', test => { test.false(IView.canHandle('/')); test.truthy(IView.mount()); test.truthy(IView.umount()); });