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
`);
});