Files
owl/tests/router/route_component.test.ts
T

131 lines
4.2 KiB
TypeScript
Raw Normal View History

2019-07-16 16:33:20 +02:00
import { Component } from "../../src/component/component";
2019-10-11 14:52:09 +02:00
import { RouterEnv } from "../../src/router/router";
import { RouteComponent } from "../../src/router/route_component";
2019-07-16 16:33:20 +02:00
import { makeTestEnv, makeTestFixture, nextTick } from "../helpers";
2019-10-11 14:52:09 +02:00
import { TestRouter } from "./test_router";
2019-07-16 16:33:20 +02:00
describe("RouteComponent", () => {
2019-07-16 16:33:20 +02:00
let fixture: HTMLElement;
let env: RouterEnv;
let router: TestRouter | null = null;
2019-07-16 16:33:20 +02:00
beforeEach(() => {
fixture = makeTestFixture();
env = <RouterEnv>makeTestEnv();
2019-10-31 13:31:10 +01:00
Component.env = env;
2019-07-16 16:33:20 +02:00
});
afterEach(() => {
fixture.remove();
if (router) {
router.destroy();
}
router = null;
2019-07-16 16:33:20 +02:00
});
test("can render simple cases", async () => {
env.qweb.addTemplates(`
<templates>
<div t-name="App">
<RouteComponent />
2019-07-16 16:33:20 +02:00
</div>
<span t-name="About">About</span>
<span t-name="Users">Users</span>
</templates>
`);
class About extends Component {}
class Users extends Component {}
class App extends Component {
static components = { RouteComponent };
2019-07-16 16:33:20 +02:00
}
const routes = [
{ name: "about", path: "/about", component: About },
2020-04-21 15:08:53 +02:00
{ name: "users", path: "/users", component: Users },
2019-07-16 16:33:20 +02:00
];
2019-07-25 13:24:57 +02:00
router = new TestRouter(env, routes, { mode: "history" });
await router.navigate({ to: "about" });
2019-10-14 15:09:17 +02:00
const app = new App();
2019-07-16 16:33:20 +02:00
await app.mount(fixture);
expect(fixture.innerHTML).toBe("<div><span>About</span></div>");
await router.navigate({ to: "users" });
2019-07-16 16:33:20 +02:00
await nextTick();
expect(fixture.innerHTML).toBe("<div><span>Users</span></div>");
2019-09-12 09:45:32 +02:00
expect(env.qweb.templates[RouteComponent.template].fn.toString()).toMatchSnapshot();
2019-07-16 16:33:20 +02:00
});
test("can render parameterized route", async () => {
env.qweb.addTemplates(`
<templates>
<div t-name="App">
<RouteComponent />
2019-07-16 16:33:20 +02:00
</div>
<span t-name="Book">Book <t t-esc="props.title"/></span>
</templates>
`);
class Book extends Component {}
class App extends Component {
static components = { RouteComponent };
2019-07-16 16:33:20 +02:00
}
const routes = [{ name: "book", path: "/book/{{title}}", component: Book }];
router = new TestRouter(env, routes, { mode: "history" });
await router.navigate({ to: "book", params: { title: "1984" } });
2019-10-14 15:09:17 +02:00
const app = new App();
2019-07-16 16:33:20 +02:00
await app.mount(fixture);
expect(fixture.innerHTML).toBe("<div><span>Book 1984</span></div>");
});
test("can render parameterized route with suffixes", async () => {
env.qweb.addTemplates(`
<templates>
<div t-name="App">
<RouteComponent />
2019-07-16 16:33:20 +02:00
</div>
<span t-name="Book">Book <t t-esc="props.title"/>|<t t-esc="incVal"/></span>
</templates>
`);
class Book extends Component {
get incVal() {
return this.props.val + 1;
}
2019-07-16 16:33:20 +02:00
}
class App extends Component {
static components = { RouteComponent };
2019-07-16 16:33:20 +02:00
}
const routes = [{ name: "book", path: "/book/{{title}}/{{val.number}}", component: Book }];
router = new TestRouter(env, routes, { mode: "history" });
await router.navigate({ to: "book", params: { title: "1984", val: "123" } });
2019-10-14 15:09:17 +02:00
const app = new App();
2019-07-16 16:33:20 +02:00
await app.mount(fixture);
expect(fixture.innerHTML).toBe("<div><span>Book 1984|124</span></div>");
});
test("can render parameterized route where params are not separated by slashes", async () => {
env.qweb.addTemplates(`
<templates>
<div t-name="App">
<RouteComponent />
</div>
<span t-name="Book">Book <t t-esc="props.title"/>|<t t-esc="props.val"/></span>
</templates>
`);
class Book extends Component {}
class App extends Component {
static components = { RouteComponent };
}
const routes = [
{ name: "book", path: "/#title={{title}}&val={{val.number}}", component: Book },
];
router = new TestRouter(env, routes, { mode: "hash" });
await router.navigate({ to: "book", params: { title: "1984", val: "123" } });
const app = new App();
await app.mount(fixture);
expect(fixture.innerHTML).toBe("<div><span>Book 1984|123</span></div>");
});
2019-07-16 16:33:20 +02:00
});