import { expect, test, describe } from "@odoo/hoot"; import { click, getActiveElement, press, queryOne, waitFor } from "@odoo/hoot-dom"; import { animationFrame, tick } from "@odoo/hoot-mock"; import { setupEditor } from "./_helpers/editor"; import { makeMockEnv, onRpc } from "@web/../tests/web_test_helpers"; import { getContent } from "./_helpers/selection"; import { insertText } from "./_helpers/user_actions"; test("Can replace an image", async () => { onRpc("/web/dataset/call_kw/ir.attachment/search_read", () => { return [ { id: 1, name: "logo", mimetype: "image/png", image_src: "/web/static/img/logo2.png", access_token: false, public: true, }, ]; }); const env = await makeMockEnv(); await setupEditor(`

`, { env }); expect("img[src='/web/static/img/logo.png']").toHaveCount(1); await click("img"); await tick(); // selectionchange await waitFor(".o-we-toolbar"); expect("button[name='replace_image']").toHaveCount(1); await click("button[name='replace_image']"); await animationFrame(); await click("img.o_we_attachment_highlight"); await animationFrame(); expect("img[src='/web/static/img/logo.png']").toHaveCount(0); expect("img[src='/web/static/img/logo2.png']").toHaveCount(1); }); test.tags("focus required"); test("Selection is collapsed after the image after replacing it", async () => { onRpc("/web/dataset/call_kw/ir.attachment/search_read", () => { return [ { id: 1, name: "logo", mimetype: "image/png", image_src: "/web/static/img/logo2.png", access_token: false, public: true, }, ]; }); const env = await makeMockEnv(); const { el } = await setupEditor( `

abcdef

`, { env } ); await click("img"); await waitFor(".o-we-toolbar"); expect("button[name='replace_image']").toHaveCount(1); await click("button[name='replace_image']"); await animationFrame(); await click("img.o_we_attachment_highlight"); await animationFrame(); expect(getContent(el).replace(//, "")).toBe("

abc[]def

"); }); test.tags("focus required"); test("Can insert an image, and selection should be collapsed after it", async () => { onRpc("/web/dataset/call_kw/ir.attachment/search_read", () => { return [ { id: 1, name: "logo", mimetype: "image/png", image_src: "/web/static/img/logo2.png", access_token: false, public: true, }, ]; }); const env = await makeMockEnv(); const { editor, el } = await setupEditor("

a[]bc

", { env }); await insertText(editor, "/image"); await animationFrame(); expect(".o-we-powerbox").toHaveCount(1); await press("Enter"); await animationFrame(); await click("img.o_we_attachment_highlight"); await animationFrame(); expect("img[src='/web/static/img/logo2.png']").toHaveCount(1); expect(getContent(el).replace(//, "")).toBe("

a[]bc

"); }); test("press escape to close media dialog", async () => { onRpc("/web/dataset/call_kw/ir.attachment/search_read", () => { return []; }); const env = await makeMockEnv(); const { editor, el } = await setupEditor("

a[]bc

", { env }); insertText(editor, "/image"); await waitFor(".o-we-powerbox"); await press("Enter"); await animationFrame(); expect(getActiveElement()).toBe(queryOne(".modal .o_select_media_dialog .o_we_search")); await press("escape"); await animationFrame(); expect(".modal .o_select_media_dialog").toHaveCount(0); expect(getContent(el)).toBe("

a[]bc

"); }); describe("Powerbox search keywords", () => { test("Image and Icon are keywords for the Media command", async () => { const { editor } = await setupEditor("

[]

"); insertText(editor, "/"); for (const word of ["image", "icon"]) { insertText(editor, word); await animationFrame(); expect(".active .o-we-command-name").toHaveText("Media"); // delete the keyword to try the next one for (let i = 0; i < word.length; i++) { press("backspace"); } } }); });