import { expect, test } from "@odoo/hoot"; import { click, manuallyDispatchProgrammaticEvent, press, waitFor } from "@odoo/hoot-dom"; import { animationFrame } from "@odoo/hoot-mock"; import { setupEditor } from "./_helpers/editor"; import { getContent, setSelection } from "./_helpers/selection"; import { insertText } from "./_helpers/user_actions"; import { loader } from "@web/core/emoji_picker/emoji_picker"; import { execCommand } from "./_helpers/userCommands"; test("should insert a banner with focus inside followed by a paragraph", async () => { const { el, editor } = await setupEditor("

Test[]

"); await insertText(editor, "/banner"); await animationFrame(); expect(".active .o-we-command-name").toHaveText("Banner Info"); await press("enter"); expect(getContent(el)).toBe( `

Test

💡

[]


` ); await insertText(editor, "/"); await animationFrame(); expect(".o-we-powerbox").toHaveCount(1); await insertText(editor, "banner"); await animationFrame(); expect(".o-we-powerbox").toHaveCount(0, { message: "shouldn't be possible to add a banner inside a banner", }); }); test("press 'ctrl+a' inside a banner should select all the banner content", async () => { const { el, editor } = await setupEditor("

Test[]

"); await insertText(editor, "/bannerinfo"); await press("enter"); await insertText(editor, "Test1"); await manuallyDispatchProgrammaticEvent(editor.editable, "beforeinput", { inputType: "insertParagraph", }); await insertText(editor, "Test2"); await press(["ctrl", "a"]); expect(getContent(el)).toBe( `

Test

💡
[

Test1

Test2

]


` ); }); test("remove all content should preserves the first paragraph tag inside the banner", async () => { const { el, editor } = await setupEditor("

Test[]

"); await insertText(editor, "/bannerinfo"); await press("enter"); await insertText(editor, "Test1"); await manuallyDispatchProgrammaticEvent(editor.editable, "beforeinput", { inputType: "insertParagraph", }); await insertText(editor, "Test2"); await press(["ctrl", "a"]); expect(getContent(el)).toBe( `

Test

💡
[

Test1

Test2

]


` ); await press("Backspace"); expect(getContent(el)).toBe( `

Test

💡

[]


` ); }); test("Everything gets selected with ctrl+a, including a contenteditable=false as first element", async () => { const { el, editor } = await setupEditor("

[]

"); await insertText(editor, "/bannerinfo"); await press("enter"); // Move the selection outside of the banner setSelection({ anchorNode: el.querySelectorAll("p")[1], anchorOffset: 0 }); await insertText(editor, "Test1"); await manuallyDispatchProgrammaticEvent(editor.editable, "beforeinput", { inputType: "insertParagraph", }); await insertText(editor, "Test2"); await press(["ctrl", "a"]); expect(getContent(el)).toBe( `[\u200b
💡


Test1

Test2

]`, { message: "should select everything" } ); await press("Backspace"); expect(getContent(el)).toBe( `

[]

` ); }); test("Everything gets selected with ctrl+a, including a contenteditable=false as first two elements", async () => { const { el } = await setupEditor( '
a
b

cd[]

' ); await press(["ctrl", "a"]); expect(getContent(el)).toBe( '[
a
b

cd

]' ); await press("Backspace"); expect(getContent(el)).toBe( `

[]

` ); }); test("Can change an emoji banner", async () => { const { editor } = await setupEditor("

Test[]

"); await insertText(editor, "/bannerinfo"); await press("enter"); expect("i.o_editor_banner_icon").toHaveText("💡"); await loader.loadEmoji(); await click("i.o_editor_banner_icon"); await waitFor(".o-EmojiPicker"); await click(".o-EmojiPicker .o-Emoji"); await animationFrame(); expect("i.o_editor_banner_icon").toHaveText("😀"); execCommand(editor, "historyUndo"); expect("i.o_editor_banner_icon").toHaveText("💡"); execCommand(editor, "historyRedo"); expect("i.o_editor_banner_icon").toHaveText("😀"); }); test("add banner inside empty list", async () => { const { el, editor } = await setupEditor(""); await insertText(editor, "/bannerinfo"); await press("enter"); expect(getContent(el)).toBe( `` ); }); test("add banner inside non-empty list", async () => { const { el, editor } = await setupEditor(""); await insertText(editor, "/bannerinfo"); await press("enter"); expect(getContent(el)).toBe( `` ); });