import { makeTestFixture, snapshotEverything, nextTick } from "../helpers"; import { mount, Component, useState, xml } from "../../src/index"; snapshotEverything(); let fixture: HTMLElement; beforeEach(() => { fixture = makeTestFixture(); }); describe("event handling", () => { test("can set handler on sub component", async () => { class Child extends Component { static template = xml`
simple vnode
`; } class Parent extends Component { static template = xml``; static components = { Child }; state = useState({ value: 1 }); inc() { this.state.value++; } } await mount(Parent, fixture); expect(fixture.innerHTML).toBe("
simple vnode
1"); fixture.querySelector("div")!.click(); await nextTick(); expect(fixture.innerHTML).toBe("
simple vnode
2"); }); test("handler receive the event as argument", async () => { class Child extends Component { static template = xml`
simple vnode
`; } class Parent extends Component { static template = xml``; static components = { Child }; state = useState({ value: 1 }); inc(ev: any) { this.state.value++; expect(ev.type).toBe("click"); } } await mount(Parent, fixture); expect(fixture.innerHTML).toBe("
simple vnode
1"); fixture.querySelector("div")!.click(); await nextTick(); expect(fixture.innerHTML).toBe("
simple vnode
2"); }); test("support for callable expression in event handler", async () => { class Counter extends Component { static template = xml`
`; state = useState({ value: "" }); obj = { onInput: (ev: any) => (this.state.value = ev.target.value) }; } const counter = await mount(Counter, fixture); await nextTick(); expect(fixture.innerHTML).toBe(`
`); const input = (counter.el).getElementsByTagName("input")[0]; input.value = "test"; input.dispatchEvent(new Event("input", { bubbles: true })); await nextTick(); expect(fixture.innerHTML).toBe(`
test
`); }); test.skip("t-on with prevent and/or stop modifiers", async () => { /* expect.assertions(7); qweb.addTemplate( "test", `
` ); let owner = { onClickPrevented(e) { expect(e.defaultPrevented).toBe(true); expect(e.cancelBubble).toBe(false); }, onClickStopped(e) { expect(e.defaultPrevented).toBe(false); expect(e.cancelBubble).toBe(true); }, onClickPreventedAndStopped(e) { expect(e.defaultPrevented).toBe(true); expect(e.cancelBubble).toBe(true); }, }; const node = renderToDOM(qweb, "test", owner, { handlers: [] }); const buttons = (node).getElementsByTagName("button"); buttons[0].click(); buttons[1].click(); buttons[2].click();*/ }); test.skip("t-on with self modifier", async () => { /*expect.assertions(2); qweb.addTemplate( "test", `
` ); let steps: string[] = []; let owner = { onClick(e) { steps.push("onClick"); }, onClickSelf(e) { steps.push("onClickSelf"); }, }; const node = renderToDOM(qweb, "test", owner, { handlers: [] }); const buttons = (node).getElementsByTagName("button"); const spans = (node).getElementsByTagName("span"); spans[0].click(); spans[1].click(); buttons[0].click(); buttons[1].click(); expect(steps).toEqual(["onClick", "onClick", "onClickSelf"]);*/ }); test.skip("t-on with self and prevent modifiers (order matters)", async () => { /*expect.assertions(2); qweb.addTemplate( "test", `
` ); let steps: boolean[] = []; let owner = { onClick() {}, }; const node = renderToDOM(qweb, "test", owner, { handlers: [] }); (node).addEventListener("click", function (e) { steps.push(e.defaultPrevented); }); const button = (node).getElementsByTagName("button")[0]; const span = (node).getElementsByTagName("span")[0]; span.click(); button.click(); expect(steps).toEqual([false, true]);*/ }); test.skip("t-on with prevent and self modifiers (order matters)", async () => { /*expect.assertions(2); qweb.addTemplate( "test", `
` ); let steps: boolean[] = []; let owner = { onClick() {}, }; const node = renderToDOM(qweb, "test", owner, { handlers: [] }); (node).addEventListener("click", function (e) { steps.push(e.defaultPrevented); }); const button = (node).getElementsByTagName("button")[0]; const span = (node).getElementsByTagName("span")[0]; span.click(); button.click(); expect(steps).toEqual([true, true]);*/ }); test.skip("t-on with prevent modifier in t-foreach", async () => { /*expect.assertions(5); qweb.addTemplate( "test", `` ); const steps: string[] = []; const owner = { projects: [ { id: 1, name: "Project 1" }, { id: 2, name: "Project 2" }, ], onEdit(projectId, ev) { expect(ev.defaultPrevented).toBe(true); steps.push(projectId); }, }; const node = renderToDOM(qweb, "test", owner, { handlers: [] }); expect(node.outerHTML).toBe( `` ); const links = node.querySelectorAll("a")!; links[0].click(); links[1].click(); expect(steps).toEqual([1, 2]);*/ }); test.skip("t-on with empty handler (only modifiers)", () => { /*expect.assertions(2); qweb.addTemplate( "test", `
` ); const node = renderToDOM(qweb, "test", {}, { handlers: [] }); node.addEventListener("click", (e) => { expect(e.defaultPrevented).toBe(true); }); const button = (node).getElementsByTagName("button")[0]; button.click();*/ }); test.skip("t-on combined with t-esc", async () => { /*expect.assertions(3); qweb.addTemplate("test", `
`); const steps: string[] = []; const owner = { text: "Click here", onClick() { steps.push("onClick"); }, }; const node = renderToDOM(qweb, "test", owner, { handlers: [] }); expect(node.outerHTML).toBe(`
`); node.querySelector("button")!.click(); expect(steps).toEqual(["onClick"]);*/ }); test.skip("t-on combined with t-raw", async () => { /*expect.assertions(3); qweb.addTemplate("test", `
`); const steps: string[] = []; const owner = { html: "Click here", onClick() { steps.push("onClick"); }, }; const node = renderToDOM(qweb, "test", owner, { handlers: [] }); expect(node.outerHTML).toBe(`
`); node.querySelector("button")!.click(); expect(steps).toEqual(["onClick"]);*/ }); test.skip("t-on with .capture modifier", () => { /*expect.assertions(2); qweb.addTemplate( "test", `
` ); const steps: string[] = []; const owner = { onCapture() { steps.push("captured"); }, doSomething() { steps.push("normal"); }, }; const node = renderToDOM(qweb, "test", owner, { handlers: [] }); const button = (node).getElementsByTagName("button")[0]; button.click(); expect(steps).toEqual(["captured", "normal"]);*/ }); });