import { describe, expect, test } from "@odoo/hoot"; import { click, queryAll, queryAllTexts, queryOne, select } from "@odoo/hoot-dom"; import { animationFrame, tick } from "@odoo/hoot-mock"; import { setupEditor } from "./_helpers/editor"; import { getContent, setSelection } from "./_helpers/selection"; import { QWebPlugin } from "@html_editor/others/qweb_plugin"; import { MAIN_PLUGINS } from "@html_editor/plugin_sets"; import { dispatchClean } from "./_helpers/dispatch"; const config = { Plugins: [...MAIN_PLUGINS, QWebPlugin] }; describe("qweb picker", () => { test("switch selected value to t-else value", async () => { const { el, editor } = await setupEditor( `
yesno
`, { config } ); expect(getContent(el)).toBe( `
yesno
` ); await click(queryOne(`[data-oe-t-group-active="true"]`)); await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); expect(queryAllTexts(".o-we-qweb-picker option")).toEqual(["if: test", "else"]); expect(".o-we-qweb-picker select option:selected").toHaveText("if: test"); await click(".o-we-qweb-picker select"); await select("0,1"); // t-else await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); expect(".o-we-qweb-picker select option:selected").toHaveText("else"); expect(getContent(el)).toBe( `
yesno
` ); dispatchClean(editor); expect(getContent(el)).toBe(`
yesno
`); }); test("plugin's dom markers are not savable", async () => { const resources = { handleNewRecords: () => { expect.step("handleNewRecords"); }, }; await setupEditor(`
yesno
`, { config: { ...config, resources }, }); expect.verifySteps([]); }); test("switch selected value to the same value ", async () => { const { el } = await setupEditor(`
yesno
`, { config, }); expect(getContent(el)).toBe( `
yesno
` ); await click(queryOne(`[data-oe-t-group-active="true"]`)); await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); expect(queryAllTexts(".o-we-qweb-picker option")).toEqual(["if: test", "else"]); expect(".o-we-qweb-picker select option:selected").toHaveText("if: test"); await click(".o-we-qweb-picker select"); await select("0,0"); // t-if await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); expect(".o-we-qweb-picker select option:selected").toHaveText("if: test"); expect(getContent(el)).toBe( `
yesno
` ); }); test("switch selected value between each value", async () => { const { el } = await setupEditor( `
ifelifelif 3else
`, { config } ); expect(getContent(el)).toBe( `
ifelifelif 3else
` ); await click(queryOne(`[data-oe-t-group-active="true"]`)); await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); expect(queryAllTexts(".o-we-qweb-picker option")).toEqual([ "if: test", "elif: test2", "elif: test3", "else", ]); expect(".o-we-qweb-picker select option:selected").toHaveText("if: test"); await click(".o-we-qweb-picker select"); await select("0,1"); // t-elif test2 await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); expect(".o-we-qweb-picker select option:selected").toHaveText("elif: test2"); expect(getContent(el)).toBe( `
ifelifelif 3else
` ); await click(".o-we-qweb-picker select"); await select("0,2"); // t-elif test2 await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); expect(".o-we-qweb-picker select option:selected").toHaveText("elif: test3"); expect(getContent(el)).toBe( `
ifelifelif 3else
` ); await click(".o-we-qweb-picker select"); await select("0,3"); // t-else await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); expect(".o-we-qweb-picker select option:selected").toHaveText("else"); expect(getContent(el)).toBe( `
ifelifelif 3else
` ); }); test("switch selected value with multi group", async () => { const { el } = await setupEditor( `
yesnohellobye
`, { config } ); expect(getContent(el)).toBe( `
yesnohellobye
` ); expect('[data-oe-t-group-active="true"]').toHaveCount(2); await click(queryOne(`[data-oe-t-group="1"][data-oe-t-group-active="true"]`)); await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); expect(queryAllTexts(".o-we-qweb-picker option")).toEqual(["if: test2", "else"]); expect(".o-we-qweb-picker select option:selected").toHaveText("if: test2"); await click(".o-we-qweb-picker select"); await select("0,1"); // t-else await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); expect(".o-we-qweb-picker select option:selected").toHaveText("else"); expect(getContent(el)).toBe( `
yesnohellobye
` ); }); test("click outside to close it", async () => { const { el } = await setupEditor(`
yesno
`, { config, }); expect(getContent(el)).toBe( `
yesno
` ); // Open picker await click(queryOne(`[data-oe-t-group-active="true"]`)); await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); // Click outside to close the picker await click(el.querySelector("div")); await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(0); }); test("select value on branch node multi level", async () => { const { el } = await setupEditor( `
Sub ifSub ElseElse
`, { config, } ); expect(getContent(el)).toBe( `
Sub ifSub ElseElse
` ); // Open picker on sub condition await click(queryAll(`[data-oe-t-group-active="true"]`)[1]); await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); expect(".o-we-qweb-picker select").toHaveCount(2); expect(queryAllTexts(".o-we-qweb-picker select:first option")).toEqual([ "if: test", "else", ]); expect(".o-we-qweb-picker select:first option:selected").toHaveText("if: test"); expect(queryAllTexts(".o-we-qweb-picker select:last option")).toEqual([ "if: sub-test", "else", ]); expect(".o-we-qweb-picker select:last option:selected").toHaveText("if: sub-test"); // Select t-else on sub condition await click(".o-we-qweb-picker select:last"); await select("1,1"); // sub t-else await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); expect(".o-we-qweb-picker select").toHaveCount(2); expect(queryAllTexts(".o-we-qweb-picker select:first option")).toEqual([ "if: test", "else", ]); expect(".o-we-qweb-picker select:first option:selected").toHaveText("if: test"); expect(queryAllTexts(".o-we-qweb-picker select:last option")).toEqual([ "if: sub-test", "else", ]); expect(".o-we-qweb-picker select:last option:selected").toHaveText("else"); // Select t-else on main condition await click(".o-we-qweb-picker select:first"); await select("0,1"); // t-else await animationFrame(); expect(".o-we-qweb-picker").toHaveCount(1); expect(".o-we-qweb-picker select").toHaveCount(1); expect(".o-we-qweb-picker select option:selected").toHaveText("else"); expect(queryAllTexts(".o-we-qweb-picker select option")).toEqual(["if: test", "else"]); }); }); test("select text inside t-out", async () => { const { el } = await setupEditor(`
Hello
`, { config, }); expect(getContent(el)).toBe( `
Hello
` ); setSelection({ anchorNode: el.querySelector("t[t-out]").childNodes[0], anchorOffset: 1 }); await tick(); expect(getContent(el)).toBe( `
[Hello]
` ); }); test("select text inside t-esc", async () => { const { el } = await setupEditor(`
Hello
`, { config, }); expect(getContent(el)).toBe( `
Hello
` ); setSelection({ anchorNode: el.querySelector("t[t-esc]").childNodes[0], anchorOffset: 1 }); await tick(); expect(getContent(el)).toBe( `
[Hello]
` ); }); test("select text inside t-field", async () => { const { el } = await setupEditor(`
Hello
`, { config, }); expect(getContent(el)).toBe( `
Hello
` ); setSelection({ anchorNode: el.querySelector("t[t-field]").childNodes[0], anchorOffset: 1 }); await tick(); expect(getContent(el)).toBe( `
[Hello]
` ); }); test("cleaning removes content editable", async () => { const { el, editor } = await setupEditor( `
Hello Hello Hello Hello
`, { config, } ); expect(getContent(el)).toBe(`
Hello Hello Hello Hello
`); expect(editor.getContent()).toBe(`
Hello Hello Hello Hello
`); });