UNPKG

evanesce

Version:

Evanesce disappears your web application framework for desired routes by managing AOT page builds on dependency change.

257 lines (256 loc) 13.3 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const express_1 = __importDefault(require("express")); const index_1 = require("./index"); const setup = () => { const onRouteRebuild = jest.fn(); const products = [ { id: '1', slug: 'fibity-foo', label: 'Fibity Foo', quantity: 1 }, { id: '2', slug: 'bibity-bar', label: 'Bibity Bar', quantity: 2 } ]; const signalKeys = [ 'customerServiceReviews', { key: 'reviews', keys: products.map((product) => product.id) }, { key: 'products', keys: products.map((product) => product.id) } ]; const app = (0, express_1.default)(); const router = { get: jest.fn() }; const { evanesceRouter, signals } = (0, index_1.evanesceExpress)({ app, router, signalKeys, onRouteRebuild }); const homePageController = jest.fn((_req, _res) => { return 'home page html'; }); const productPageController = jest.fn((req, _res) => { return `product page html for ${products.find((p) => p.slug === req.params.slug).label}`; }); evanesceRouter.get('/', homePageController, [ signals.customerServiceReviews, signals.products ]); evanesceRouter.get('/product/:slug', productPageController, [ (product) => signals.products.nested[product.id], (product) => signals.reviews.nested[product.id] ], products); return { products, signals, router, homePageController, productPageController, onRouteRebuild }; }; describe('Usage test / end-to-end test / integration test)', () => { afterEach(() => { jest.clearAllMocks(); }); describe('express router handling', () => { test('configured (used for dev usage)', () => { const { router } = setup(); expect(router.get.mock.calls.length).toBe(2); expect(router.get.mock.calls[0][0]).toEqual('/'); expect(router.get.mock.calls[1][0]).toEqual('/product/:slug'); }); test('home page request', async () => { const { router, homePageController } = setup(); let homePageControllerRouteCallback = router.get.mock.calls[0][1]; let reqMock = { params: {} }; let resMock = { send: jest.fn() }; await homePageControllerRouteCallback(reqMock, resMock); expect(homePageController.mock.calls[0][0]).toEqual(reqMock); expect(Object.keys(homePageController.mock.calls[0][1]).length).toEqual(1); expect(homePageController.mock.calls[0][1].render.name).toEqual('bound render'); expect(resMock.send.mock.calls[0][0]).toEqual('home page html'); }); test('Fibity Foo product page request', async () => { const { router, productPageController } = setup(); let productPageControllerRouteCallback = router.get.mock.calls[1][1]; let reqMock = { params: { slug: 'fibity-foo' } }; let resMock = { send: jest.fn() }; await productPageControllerRouteCallback(reqMock, resMock); expect(productPageController.mock.calls[0][0]).toEqual(reqMock); expect(Object.keys(productPageController.mock.calls[0][1]).length).toEqual(1); expect(productPageController.mock.calls[0][1].render.name).toEqual('bound render'); expect(resMock.send.mock.calls[0][0]).toEqual('product page html for Fibity Foo'); }); test('Bibity Bar product page request', async () => { const { router, productPageController } = setup(); let productPageControllerRouteCallback = router.get.mock.calls[1][1]; let reqMock = { params: { slug: 'bibity-bar' } }; let resMock = { send: jest.fn() }; await productPageControllerRouteCallback(reqMock, resMock); expect(productPageController.mock.calls[0][0]).toEqual(reqMock); expect(Object.keys(productPageController.mock.calls[0][1]).length).toEqual(1); expect(productPageController.mock.calls[0][1].render.name).toEqual('bound render'); expect(resMock.send.mock.calls[0][0]).toEqual('product page html for Bibity Bar'); }); }); describe('customerServiceReview signal', () => { test('triggering build', async () => { const { signals, homePageController, onRouteRebuild } = setup(); await signals.customerServiceReviews.rebuildDependencies(); expect(homePageController.mock.calls[0][0]).toEqual({ params: {} }); expect(Object.keys(homePageController.mock.calls[0][1]).length).toEqual(1); expect(homePageController.mock.calls[0][1].render.name).toEqual('bound render'); expect(onRouteRebuild.mock.calls.length).toBe(1); expect(onRouteRebuild.mock.calls[0][0]).toEqual({ route: '/', html: 'home page html' }); }); }); describe('reviews signal', () => { test('triggering build', async () => { const { signals, homePageController, productPageController, onRouteRebuild } = setup(); await signals.reviews.rebuildDependencies(); expect(homePageController.mock.calls.length).toBe(0); expect(productPageController.mock.calls.length).toBe(2); expect(productPageController.mock.calls[0][0]).toMatchObject({ params: { slug: 'fibity-foo' } }); expect(Object.keys(productPageController.mock.calls[0][1]).length).toEqual(1); expect(productPageController.mock.calls[0][1].render.name).toEqual('bound render'); expect(productPageController.mock.calls[1][0]).toMatchObject({ params: { slug: 'bibity-bar' } }); expect(Object.keys(productPageController.mock.calls[1][1]).length).toEqual(1); expect(productPageController.mock.calls[1][1].render.name).toEqual('bound render'); expect(onRouteRebuild.mock.calls.length).toBe(2); expect(onRouteRebuild.mock.calls[0][0]).toEqual({ route: '/product/fibity-foo', html: 'product page html for Fibity Foo' }); expect(onRouteRebuild.mock.calls[1][0]).toEqual({ route: '/product/bibity-bar', html: 'product page html for Bibity Bar' }); }); test('Fibity Foo product signal triggering build', async () => { const { products, signals, homePageController, productPageController, onRouteRebuild } = setup(); await signals.reviews.nested[products[0].id].rebuildDependencies(); expect(homePageController.mock.calls.length).toBe(0); expect(productPageController.mock.calls.length).toBe(1); expect(productPageController.mock.calls[0][0]).toMatchObject({ params: { slug: 'fibity-foo' } }); expect(Object.keys(productPageController.mock.calls[0][1]).length).toEqual(1); expect(productPageController.mock.calls[0][1].render.name).toEqual('bound render'); expect(onRouteRebuild.mock.calls.length).toBe(1); expect(onRouteRebuild.mock.calls[0][0]).toEqual({ route: '/product/fibity-foo', html: 'product page html for Fibity Foo' }); }); test('Bibity Bar signal triggering build', async () => { const { products, signals, homePageController, productPageController, onRouteRebuild } = setup(); await signals.reviews.nested[products[1].id].rebuildDependencies(); expect(homePageController.mock.calls.length).toBe(0); expect(productPageController.mock.calls.length).toBe(1); expect(productPageController.mock.calls[0][0]).toMatchObject({ params: { slug: 'bibity-bar' } }); expect(Object.keys(productPageController.mock.calls[0][1]).length).toEqual(1); expect(productPageController.mock.calls[0][1].render.name).toEqual('bound render'); expect(onRouteRebuild.mock.calls.length).toBe(1); expect(onRouteRebuild.mock.calls[0][0]).toEqual({ route: '/product/bibity-bar', html: 'product page html for Bibity Bar' }); }); }); describe('products signal', () => { test('triggering build', async () => { const { signals, homePageController, productPageController, onRouteRebuild } = setup(); await signals.products.rebuildDependencies(); expect(homePageController.mock.calls.length).toBe(1); expect(homePageController.mock.calls[0][0]).toMatchObject({ params: {} }); expect(Object.keys(homePageController.mock.calls[0][1]).length).toEqual(1); expect(homePageController.mock.calls[0][1].render.name).toEqual('bound render'); expect(productPageController.mock.calls.length).toBe(2); expect(productPageController.mock.calls[0][0]).toMatchObject({ params: { slug: 'fibity-foo' } }); expect(Object.keys(productPageController.mock.calls[0][1]).length).toEqual(1); expect(productPageController.mock.calls[0][1].render.name).toEqual('bound render'); expect(productPageController.mock.calls[1][0]).toMatchObject({ params: { slug: 'bibity-bar' } }); expect(Object.keys(productPageController.mock.calls[1][1]).length).toEqual(1); expect(productPageController.mock.calls[1][1].render.name).toEqual('bound render'); expect(onRouteRebuild.mock.calls.length).toBe(3); expect(onRouteRebuild.mock.calls[0][0]).toEqual({ route: '/', html: 'home page html' }); expect(onRouteRebuild.mock.calls[1][0]).toEqual({ route: '/product/fibity-foo', html: 'product page html for Fibity Foo' }); expect(onRouteRebuild.mock.calls[2][0]).toEqual({ route: '/product/bibity-bar', html: 'product page html for Bibity Bar' }); }); test('Fibity Foo product signal triggering build', async () => { const { products, signals, homePageController, productPageController, onRouteRebuild } = setup(); await signals.products.nested[products[0].id].rebuildDependencies(); expect(homePageController.mock.calls.length).toBe(1); expect(homePageController.mock.calls[0][0]).toMatchObject({ params: {} }); expect(Object.keys(homePageController.mock.calls[0][1]).length).toEqual(1); expect(homePageController.mock.calls[0][1].render.name).toEqual('bound render'); expect(productPageController.mock.calls.length).toBe(1); expect(productPageController.mock.calls[0][0]).toMatchObject({ params: { slug: 'fibity-foo' } }); expect(Object.keys(productPageController.mock.calls[0][1]).length).toEqual(1); expect(productPageController.mock.calls[0][1].render.name).toEqual('bound render'); expect(onRouteRebuild.mock.calls.length).toBe(2); expect(onRouteRebuild.mock.calls[0][0]).toEqual({ route: '/product/fibity-foo', html: 'product page html for Fibity Foo' }); expect(onRouteRebuild.mock.calls[1][0]).toEqual({ route: '/', html: 'home page html' }); }); test('Bibity Bar signal triggering build', async () => { const { products, signals, homePageController, productPageController, onRouteRebuild } = setup(); await signals.products.nested[products[1].id].rebuildDependencies(); expect(homePageController.mock.calls.length).toBe(1); expect(homePageController.mock.calls[0][0]).toMatchObject({ params: {} }); expect(Object.keys(homePageController.mock.calls[0][1]).length).toEqual(1); expect(homePageController.mock.calls[0][1].render.name).toEqual('bound render'); expect(productPageController.mock.calls.length).toBe(1); expect(productPageController.mock.calls[0][0]).toMatchObject({ params: { slug: 'bibity-bar' } }); expect(Object.keys(productPageController.mock.calls[0][1]).length).toEqual(1); expect(productPageController.mock.calls[0][1].render.name).toEqual('bound render'); expect(onRouteRebuild.mock.calls.length).toBe(2); expect(onRouteRebuild.mock.calls[0][0]).toEqual({ route: '/product/bibity-bar', html: 'product page html for Bibity Bar' }); expect(onRouteRebuild.mock.calls[1][0]).toEqual({ route: '/', html: 'home page html' }); }); }); });