import { App, Component, mount, onMounted, useRef, useState } from "../../src/index"; import { logStep, makeTestFixture, nextAppError, nextTick, snapshotEverything } from "../helpers"; import { xml } from "../../src/index"; snapshotEverything(); let fixture: HTMLElement; beforeEach(() => { fixture = makeTestFixture(); }); describe("refs", () => { test("basic use", async () => { class Test extends Component { static template = xml`
`; button = useRef("div"); } const test = await mount(Test, fixture); expect(test.button.el).toBe(fixture.firstChild); }); test("refs are properly bound in slots", async () => { class Dialog extends Component { static template = xml``; } class Parent extends Component { static template = xml`
`; static components = { Dialog }; state = useState({ val: 0 }); button = useRef("myButton"); doSomething() { this.state.val++; } } const parent = await mount(Parent, fixture); expect(fixture.innerHTML).toBe( '
0
' ); parent.button.el!.click(); await nextTick(); expect(fixture.innerHTML).toBe( '
1
' ); }); test("can use 2 refs with same name in a t-if/t-else situation", async () => { class Test extends Component { static template = xml`
`; state = useState({ value: true }); ref = useRef("coucou"); } const test = await mount(Test, fixture); expect(fixture.innerHTML).toBe("
"); expect(test.ref.el!.tagName).toBe("DIV"); test.state.value = false; await nextTick(); expect(fixture.innerHTML).toBe(""); expect(test.ref.el!.tagName).toBe("SPAN"); test.state.value = true; await nextTick(); expect(fixture.innerHTML).toBe("
"); expect(test.ref.el!.tagName).toBe("DIV"); }); test("throws if there are 2 same refs at the same time", async () => { const consoleWarn = console.warn; console.warn = jest.fn(); class Test extends Component { static template = xml`
`; state = useState({ value: true }); ref = useRef("coucou"); } const app = new App(Test, { test: true }); const mountProm = expect(app.mount(fixture)).rejects.toThrowError( "Cannot have 2 elements with same ref name at the same time" ); await expect(nextAppError(app)).resolves.toThrow( "Cannot have 2 elements with same ref name at the same time" ); await mountProm; expect(console.warn).toBeCalledTimes(1); console.warn = consoleWarn; }); test("refs and recursive templates", async () => { class Test extends Component { static components = {}; static template = xml`

`; root = useRef("root"); setup() { onMounted(() => logStep(this.root.el!.outerHTML)); } } Test.components = { Test }; const tree = { value: "a", child: { value: "b", child: null } }; await mount(Test, fixture, { props: { tree } }); expect(fixture.innerHTML).toBe("

a

b

"); expect(["

b

", "

a

b

"]).toBeLogged(); }); });