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"; import { unformat } from "./_helpers/format"; 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(unformat(getContent(el))).toBe( unformat( `

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("should insert a banner with DIV as basecontainer and focus inside it", async () => { const { el, editor } = await setupEditor("
Test[]
", { config: { baseContainer: "DIV" }, }); await insertText(editor, "/banner"); await animationFrame(); expect(".active .o-we-command-name").toHaveText("Banner Info"); await press("enter"); expect(unformat(getContent(el))).toBe( unformat( `
Test
💡
[]

` ) ); }); 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(unformat(getContent(el))).toBe( unformat( `

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(unformat(getContent(el))).toBe( unformat( `

Test

💡

[Test1

Test2]


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

Test

💡

[]


` ) ); }); test("Inserting a banner at the top of the editable also inserts a paragraph above it", async () => { const { el, editor } = await setupEditor("

[]

"); await insertText(editor, "/bannerinfo"); await press("enter"); expect(unformat(getContent(el))).toBe( unformat( `


💡

[]


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


[]

` ); await press(["ctrl", "a"]); await animationFrame(); expect(getContent(el)).toBe( `[
💡


]

` ); }); test("Everything gets selected with ctrl+a, including a banner", 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")[2], 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( `

[

💡


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(unformat(getContent(el))).toBe( unformat( `` ) ); }); test("add banner inside non-empty list", async () => { const { el, editor } = await setupEditor(""); await insertText(editor, "/bannerinfo"); await press("enter"); expect(unformat(getContent(el))).toBe( unformat( `` ) ); });