
describe('Page', function() {

    describe('open', () => {
        it('must replace the content of document.body', async () => {
            const context = new BrowsingContext();
            const Page = await context.importScripts(['instrumentation.js', 'components/base.js', 'pages/page.js'], 'Page');

            class SomePage extends Page {
                constructor() { super('some page'); }
            };

            const somePage = new SomePage;

            const document = context.document;
            document.body.innerHTML = '<p>hello, world</p>';
            expect(document.querySelector('p')).not.to.be(null);
            expect(document.querySelector('page-component')).to.be(null);

            somePage.open();

            expect(document.querySelector('p')).to.be(null);
            expect(document.querySelector('page-component')).to.be(somePage.element());
        });

        it('must update the document title', async () => {
            const context = new BrowsingContext();
            const Page = await context.importScripts(['instrumentation.js', 'components/base.js', 'pages/page.js'], 'Page');

            class SomePage extends Page {
                constructor() { super('some page'); }
            };

            const somePage = new SomePage;

            const document = context.document;
            expect(document.title).to.be('');
            somePage.open();
            expect(document.title).to.be('some page');
        });

        it('must enqueue itself to render', async () => {
            const context = new BrowsingContext();
            const [Page, ComponentBase] = await context.importScripts(['instrumentation.js', 'components/base.js', 'pages/page.js'], 'Page', 'ComponentBase');

            let renderCount = 0;
            class SomePage extends Page {
                constructor() { super('some page'); }
                render() { renderCount++; }
            };

            expect(renderCount).to.be(0);
            const somePage = new SomePage;
            await waitForComponentsToRender(context);
            expect(renderCount).to.be(0);

            somePage.open();
            await waitForComponentsToRender(context);
            expect(renderCount).to.be(1);
        });

        it('must update the current page of the router', async () => {
            const context = new BrowsingContext();
            const [Page, PageRouter, ComponentBase] = await context.importScripts(
                ['instrumentation.js', 'components/base.js', 'pages/page.js', 'pages/page-router.js'],
                'Page', 'PageRouter', 'ComponentBase');

            class SomePage extends Page {
                constructor() { super('some page'); }
                routeName() { return 'some-page'; }
            };

            const router = new PageRouter;
            const somePage = new SomePage;
            router.addPage(somePage);
            expect(router.currentPage()).to.be(null);
            somePage.open();
            expect(router.currentPage()).to.be(somePage);
        });
    });

    describe('enqueueToRender', () => {
        it('must not enqueue itself to render if the router is set and the current page is not itself', async () => {
            const context = new BrowsingContext();
            const [Page, PageRouter, ComponentBase] = await context.importScripts(
                ['instrumentation.js', 'components/base.js', 'pages/page.js', 'pages/page-router.js'],
                'Page', 'PageRouter', 'ComponentBase');

            let someRenderCount = 0;
            class SomePage extends Page {
                constructor() { super('some page'); }
                render() { someRenderCount++; }
                routeName() { return 'some-page'; }
            };

            let anotherRenderCount = 0;
            class AnotherPage extends Page {
                constructor() { super('another page'); }
                render() { anotherRenderCount++; }
                routeName() { return 'another-page'; }
            };

            const router = new PageRouter;
            const somePage = new SomePage;
            const anotherPage = new AnotherPage;
            router.addPage(somePage);
            router.addPage(anotherPage);
            router.setDefaultPage(somePage);
            router.route();
            await waitForComponentsToRender(context);
            expect(someRenderCount).to.be(1);
            expect(anotherRenderCount).to.be(0);

            anotherPage.open();
            await waitForComponentsToRender(context);
            expect(someRenderCount).to.be(1);
            expect(anotherRenderCount).to.be(1);

            somePage.enqueueToRender();
            anotherPage.enqueueToRender();
            await waitForComponentsToRender(context);
            expect(someRenderCount).to.be(1);
            expect(anotherRenderCount).to.be(2);
        });
    });

});
