diff --git a/jest.config.js b/jest.config.js index 95e94116..7dbaf123 100644 --- a/jest.config.js +++ b/jest.config.js @@ -3,6 +3,6 @@ module.exports = { transform: { "^.+\\.ts?$": "ts-jest" }, - testRegex: "(/tests/.*|(\\.|/)(test|spec))\\.(ts|js)x?$", + testRegex: "(/tests/.*(test|spec))\\.ts?$", moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"] }; diff --git a/web/static/src/ts/services/router.ts b/web/static/src/ts/services/router.ts index 631d64d7..eb9674a4 100644 --- a/web/static/src/ts/services/router.ts +++ b/web/static/src/ts/services/router.ts @@ -9,7 +9,7 @@ function clearSlashes(s: string): string { return s.replace(/\/$/, "").replace(/^\//, ""); } -type RouterEvent = "query_changed"; +export type RouterEvent = "query_changed"; export interface IRouter { navigate(query: Query): void; diff --git a/web/static/tests/core/widget.test.ts b/web/static/tests/core/widget.test.ts index 6d71908c..7c016f19 100644 --- a/web/static/tests/core/widget.test.ts +++ b/web/static/tests/core/widget.test.ts @@ -1,6 +1,5 @@ -import { QWeb } from "../../src/ts/core/qweb_vdom"; -import { idGenerator } from "../../src/ts/core/utils"; import { WEnv, Widget } from "../../src/ts/core/widget"; +import { makeTestWEnv, makeTestFixture } from "../helpers"; //------------------------------------------------------------------------------ // Setup and helpers @@ -15,12 +14,8 @@ let fixture: HTMLElement; let env: WEnv; beforeEach(() => { - fixture = document.createElement("div"); - document.body.appendChild(fixture); - env = { - qweb: new QWeb(), - getID: idGenerator() - }; + fixture = makeTestFixture(); + env = makeTestWEnv(); }); afterEach(() => { diff --git a/web/static/tests/helpers.ts b/web/static/tests/helpers.ts new file mode 100644 index 00000000..8582597d --- /dev/null +++ b/web/static/tests/helpers.ts @@ -0,0 +1,71 @@ +import { QWeb } from "../src/ts/core/qweb_vdom"; +import { idGenerator } from "../src/ts/core/utils"; +import { WEnv } from "../src/ts/core/widget"; +import { Env } from "../src/ts/env"; +import { IAjax, RPC } from "../src/ts/services/ajax"; +import { + IActionManager, + ActionEvent, + ActionWidget +} from "../src/ts/services/action_manager"; +import { Callback } from "../src/ts/core/event_bus"; +import { IRouter, Query, RouterEvent } from "../src/ts/services/router"; + +export function makeTestFixture() { + let fixture = document.createElement("div"); + document.body.appendChild(fixture); + return fixture; +} + +export function makeTestWEnv(): WEnv { + return { + qweb: new QWeb(), + getID: idGenerator() + }; +} + +export function makeTestEnv(): Env { + const ajax = new MockAjax(); + const actionManager = new MockActionManager(); + const router = new MockRouter(); + let { qweb, getID } = makeTestWEnv(); + return { + qweb, + getID, + ajax, + actionManager, + router, + rpc: ajax.rpc, + debug: false, + menus: [] + }; +} + +class MockAjax implements IAjax { + async rpc(rpc: RPC) { + return true; + } +} + +class MockActionManager implements IActionManager { + doAction(actionID: number) {} + on(event: ActionEvent, owner: any, callback: Callback) {} + getCurrentAction(): ActionWidget | null { + return null; + } +} + +class MockRouter implements IRouter { + navigate(query: Query) {} + on(event: RouterEvent, owner: any, callback: Callback) {} + getQuery(): Query { + return {}; + } + formatURL(path: string, query: Query): string { + return ""; + } +} + +export function normalize(str: string): string { + return str.replace(/\s+/g, ""); +} diff --git a/web/static/tests/widgets/navbar.test.ts b/web/static/tests/widgets/navbar.test.ts new file mode 100644 index 00000000..5e997cf8 --- /dev/null +++ b/web/static/tests/widgets/navbar.test.ts @@ -0,0 +1,50 @@ +import { Env } from "../../src/ts/env"; +import { makeTestEnv, makeTestFixture, normalize } from "../helpers"; +import { Navbar } from "../../src/ts/widgets/navbar"; + +//------------------------------------------------------------------------------ +// Setup and helpers +//------------------------------------------------------------------------------ + +let fixture: HTMLElement; +let env: Env; + +beforeEach(() => { + fixture = makeTestFixture(); + env = makeTestEnv(); +}); + +afterEach(() => { + fixture.remove(); +}); + +//------------------------------------------------------------------------------ +// Tests +//------------------------------------------------------------------------------ + +test("can be rendered", async () => { + const navbar = new Navbar(env); + await navbar.mount(fixture); + expect(normalize(fixture.innerHTML)).toBe( + normalize(` +
`) + ); +}); + +test("can render one menu item", async () => { + env.menus.push({ title: "menu", actionID: 4 }); + const navbar = new Navbar(env); + await navbar.mount(fixture); + expect(normalize(fixture.innerHTML)).toBe( + normalize(` + `) + ); +});