import { describe, expect, test } from "@odoo/hoot"; import { press, queryOne } from "@odoo/hoot-dom"; import { animationFrame } from "@odoo/hoot-mock"; import { defineMailModels } from "@mail/../tests/mail_test_helpers"; import { contains, mountWithCleanup } from "@web/../tests/web_test_helpers"; import { PdfManager } from "@documents/owl/components/pdf_manager/pdf_manager"; defineMailModels(); describe.current.tags("desktop"); class PdfManagerForTest extends PdfManager { async _loadAssets() {} async _getPdf() { return { getPage: (number) => ({ number }), numPages: 6, }; } async _isBlankPage(page, canvas) { return false; } async _renderCanvas(page, { width, height }) { const canvas = document.createElement("canvas"); canvas.width = width; canvas.height = height; return canvas; } } function mountPdfManager() { return mountWithCleanup(PdfManagerForTest, { props: { documents: [ { id: 1, name: "yop", mimetype: "application/pdf", available_embedded_actions_ids: [1, 2], }, { id: 2, name: "blip", mimetype: "application/pdf", available_embedded_actions_ids: [1], }, ], embeddedActions: [ { id: 1, name: "Action1" }, { id: 2, name: "Action2" }, ], onProcessDocuments: async () => {}, close: () => {}, }, }); } test(`Pdf Manager basic rendering`, async () => { await mountPdfManager(); expect(".o_documents_pdf_manager_top_bar").toHaveCount(1, { message: "There should be one top bar", }); expect(".o_documents_pdf_page_viewer").toHaveCount(1, { message: "There should be one page viewer", }); expect(".o_pdf_manager_button:eq(0)").toHaveText("Split", { message: "There should be a split button", }); expect(".o_pdf_manager_button:eq(2)").toHaveText("Add File", { message: "There should be a ADD FILE button", }); expect(".o_pdf_manager_button:eq(3)").toHaveText("Action1", { message: "There should be a Action1 button", }); expect(".o_pdf_manager_button:eq(4)").toHaveText("Action2", { message: "There should be a Action2 button", }); expect(".o_pdf_separator_selected").toHaveCount(1, { message: "There should be one active separator", }); expect(".o_pdf_page").toHaveCount(12, { message: "There should be 12 pages" }); expect(".o_documents_pdf_button_wrapper").toHaveCount(12, { message: "There should be 12 button wrappers", }); expect(".o_pdf_group_name_wrapper").toHaveCount(2, { message: "There should be 2 name plates", }); }); test(`Pdf Manager: page interactions`, async () => { await mountPdfManager(); expect(".o_pdf_separator_selected").toHaveCount(1, { message: "There should be one active separator", }); await contains(".o_page_splitter_wrapper:eq(1)").click(); expect(".o_pdf_separator_selected").toHaveCount(2, { message: "There should be 2 active separator", }); expect(".o_pdf_page_selected").toHaveCount(12, { message: "There should be 12 selected pages", }); await contains(".o_documents_pdf_page_selector:eq(3)").click(); expect(".o_pdf_page_selected").toHaveCount(11, { mesage: "There should be 11 selected pages" }); }); test(`Pdf Manager: drag & drop`, async () => { await mountPdfManager(); expect(".o_pdf_separator_selected").toHaveCount(1, { message: "There should be one active separator", }); expect(".o_documents_pdf_page_frame:eq(6) .o_pdf_name_display").toHaveCount(1, { message: "The seventh page should have a name plate", }); await contains(".o_documents_pdf_canvas_wrapper:eq(11)").dragAndDrop( ".o_documents_pdf_canvas_wrapper:eq(0)", null, { dataTransfer: new DataTransfer(), } ); expect(".o_pdf_separator_selected").toHaveCount(1, { message: "There should be one active separator", }); expect(".o_documents_pdf_page_frame:eq(6) .o_pdf_name_display").toHaveCount(0, { message: "The seventh page shouldn't have a name plate", }); expect(".o_documents_pdf_page_frame:eq(7) .o_pdf_name_display").toHaveCount(1, { message: "The eight page should have a name plate", }); }); test(`Pdf Manager: select/Unselect all pages`, async () => { await mountPdfManager(); await contains(".o_documents_pdf_page_viewer").click(); expect(".o_pdf_page_selected").toHaveCount(0, { message: "There should be no page selected" }); await press(["ctrl", "a"]); await animationFrame(); expect(".o_pdf_page_selected").toHaveCount(12, { message: "There should be 12 pages selected", }); await press(["ctrl", "a"]); await animationFrame(); expect(".o_pdf_page_selected").toHaveCount(0, { message: "There should be no page selected" }); }); test(`Pdf Manager: select pages with mouse area selection`, async () => { await mountPdfManager(); await press(["ctrl", "a"]); await animationFrame(); expect(".o_pdf_page_selected").toHaveCount(0, { message: "There should be no page selected" }); const viewer = queryOne(".o_documents_pdf_manager"); const { top, left, width, height } = viewer.getBoundingClientRect(); const { drop, moveTo } = await contains(".o_documents_pdf_manager").drag({ position: { x: left, y: top }, }); const position = { x: left + width, y: top + height }; // 2 test events are needed to trigger the changes in the DOM. Due to rerendering of state variables await moveTo({ position }); await drop({ position }); expect(".o_pdf_page_selected").toHaveCount(12, { message: "There should be 12 pages selected", }); }); test("Pdf Manager: puts separators on active pages by pressing control+s", async () => { await mountPdfManager(); await contains(".o_documents_pdf_page_viewer").click(); expect(".o_pdf_page_selected").toHaveCount(0, { message: "There should be no page selected" }); await press(["ctrl", "a"]); await animationFrame(); expect(".o_pdf_page_selected").toHaveCount(12, { message: "There should be 12 pages selected", }); await press(["ctrl", "s"]); await animationFrame(); expect(".o_pdf_separator_selected").toHaveCount(11, { message: "There should be 11 active separators", }); }); test(`Pdf Manager: click on page bottom area selects the page`, async () => { await mountPdfManager(); await contains(".o_documents_pdf_page_viewer").click(); expect(".o_pdf_page_selected").toHaveCount(0, { message: "There should be no page selected" }); await contains(".o_bottom_selection").click(); expect(".o_pdf_page_selected").toHaveCount(1, { message: "There should be one page selected" }); }); test(`Pdf Manager: click on page selector selects the page`, async () => { await mountPdfManager(); await contains(".o_documents_pdf_page_viewer").click(); expect(".o_pdf_page_selected").toHaveCount(0, { message: "There should be no page selected" }); await contains(".o_documents_pdf_page_selector").click(); expect(".o_pdf_page_selected").toHaveCount(1, { message: "There should be one page selected" }); }); test(`Pdf Manager: arrow navigation`, async () => { await mountPdfManager(); await contains(".o_documents_pdf_page_viewer").click(); expect(".o_pdf_page_selected").toHaveCount(0, { message: "There should be no page selected" }); await press("arrowRight"); await animationFrame(); expect(".o_documents_pdf_page_frame:eq(0) .o_pdf_page_focused").toHaveCount(1, { message: "The first page should be focused", }); await press("arrowRight"); await animationFrame(); expect(".o_documents_pdf_page_frame:eq(1) .o_pdf_page_focused").toHaveCount(1, { message: "The first page should be focused", }); }); test(`Pdf Manager: arrow navigation + shift page activation`, async () => { await mountPdfManager(); await contains(".o_documents_pdf_page_viewer").click(); expect(".o_pdf_page_selected").toHaveCount(0, { message: "There should be no page selected" }); await press(["shift", "arrowRight"]); await animationFrame(); expect(".o_documents_pdf_page_frame:eq(0) .o_pdf_page_focused").toHaveCount(1, { message: "The first page should be focused", }); await press(["shift", "arrowRight"]); await animationFrame(); expect(".o_documents_pdf_page_frame:eq(1) .o_pdf_page_focused").toHaveCount(1, { message: "The second page should be focused", }); await press(["shift", "arrowRight"]); await animationFrame(); expect(".o_documents_pdf_page_frame:eq(2) .o_pdf_page_focused").toHaveCount(1, { message: "The third page should be focused", }); expect(".o_pdf_page_selected").toHaveCount(3, { message: "3 pages should be selected" }); await press(["shift", "arrowLeft"]); await press(["shift", "arrowLeft"]); await animationFrame(); expect(".o_documents_pdf_page_frame:eq(0) .o_pdf_page_focused").toHaveCount(1, { message: "The first page should be focused", }); expect(".o_pdf_page_selected").toHaveCount(1, { message: "One page should be selected" }); }); test(`Pdf Manager: ctrl+shift+arrow shortcut multiple activation`, async () => { await mountPdfManager(); await contains(".o_documents_pdf_page_viewer").click(); expect(".o_pdf_page_selected").toHaveCount(0, { message: "There should be no page selected" }); await press("arrowRight"); await press(["shift", "ctrl", "arrowRight"]); await animationFrame(); expect(".o_pdf_page_selected").toHaveCount(6, { message: "There should be 6 pages selected" }); }); test(`Pdf Manager: ctrl+arrow shortcut navigation between groups`, async () => { await mountPdfManager(); await contains(".o_documents_pdf_page_viewer").click(); expect(".o_pdf_page_selected").toHaveCount(0, { message: "There should be no page selected" }); await press("arrowRight"); await press(["ctrl", "arrowRight"]); await animationFrame(); expect(".o_documents_pdf_page_frame:eq(6) .o_pdf_page_focused").toHaveCount(1, { message: "The seventh page should be focused", }); }); test(`Pdf Manager: click on group name should select all the group`, async () => { await mountPdfManager(); await contains(".o_documents_pdf_page_viewer").click(); expect(".o_pdf_page_selected").toHaveCount(0, { message: "There should be no page selected" }); await contains(".o_pdf_name_display").click(); expect(".o_pdf_page_selected").toHaveCount(6, { message: "6 pages should be selected" }); }); test(`Pdf Manager: page preview behaviour`, async () => { await mountPdfManager(); await contains(".o_documents_pdf_page_viewer").click(); expect(".o_pdf_page_selected").toHaveCount(0, { message: "There should be no page selected" }); await contains(".o_documents_pdf_canvas_wrapper").click(); expect(".o_pdf_page_preview").toHaveCount(1, { message: "The previewer should be open" }); expect(".o_page_index").toHaveText("1/12", { message: "Index of the first page should be displayed", }); expect(".o_page_name").toHaveText("yop-p1", { message: "Name of the group should be displayed", }); await press("arrowRight"); await animationFrame(); expect(".o_page_index").toHaveText("2/12", { message: "Index of the second page should be displayed", }); expect(".o_page_name").toHaveText("yop-p2", { message: "Name of the group should be displayed", }); });