// @vitest-environment jsdom import { beforeEach, describe, expect, it, vi } from "vitest"; const mocks = vi.hoisted(() => ({ swalFire: vi.fn(), swalShowValidationMessage: vi.fn(), swalClose: vi.fn(), setColumn: vi.fn(), showEditObjectFieldForm: vi.fn(), authenticatedRequest: vi.fn(), })); vi.mock("sweetalert2", () => ({ default: { fire: mocks.swalFire, showValidationMessage: mocks.swalShowValidationMessage, close: mocks.swalClose, }, })); vi.mock("@/components/session/authenticatedRequest.vue", () => ({ authenticatedRequest: mocks.authenticatedRequest, })); vi.mock("@/components/session/token/SessionUser/Objects/ObjectsGlobal.vue", () => ({ ObjectsGlobal: { set: { column: mocks.setColumn, }, showEditObjectFieldForm: mocks.showEditObjectFieldForm, showCreateObjectForm: vi.fn(), showDeleteObjectForm: vi.fn(), add: { object: vi.fn() }, get: { objects: vi.fn(), object: vi.fn() }, delete: { object: vi.fn() }, language: { field: () => "Rediger arkiveret", save: "Gem", cancel: "Annuller", clear: "Ryd", }, }, })); vi.mock("@/components/session/token/SessionUser.vue", () => ({ SessionUser: { functions: { parseErrorMessage: vi.fn(() => "error"), redirectTo: { superUser: vi.fn() }, currency: { toLocal: (value) => String(value) }, }, objects: { global: { language: { no_data: "Ingen data", }, }, }, }, })); vi.mock("@/i18n", () => ({ default: { global: { t: (key) => key, }, }, })); vi.mock("@/services/economicTransferQueue.js", () => ({ buildCollectedInvoiceEconomicPayload: vi.fn(() => ({})), enqueueEconomicTransferJob: vi.fn(), fetchEconomicTransferJobStatus: vi.fn(), retryEconomicTransferJob: vi.fn(), })); vi.mock("@/components/displays/modals/PickCustomerInvoiceCollectionModal.vue", () => ({ default: { name: "PickCustomerInvoiceCollectionModalStub", template: "
", }, })); import { CollectedOrderInvoices } from "@/components/session/token/SessionUser/Objects/CollectedOrderInvoices.vue"; describe("CollectedOrderInvoices closed_at edit modal", () => { beforeEach(() => { document.body.innerHTML = ""; mocks.swalFire.mockReset(); mocks.swalShowValidationMessage.mockReset(); mocks.swalClose.mockReset(); mocks.setColumn.mockReset(); mocks.showEditObjectFieldForm.mockReset(); mocks.authenticatedRequest.mockReset(); }); it("opens dedicated closed_at modal, normalizes date value, and saves API date", async () => { const onAfterSubmit = vi.fn(); mocks.setColumn.mockResolvedValue({}); mocks.swalFire.mockImplementation(async (options) => { document.body.innerHTML = options.html; options.didOpen?.(); const input = document.getElementById("collected-order-invoice-closed-at-input"); input.value = "2026-04-08"; await options.preConfirm(); return { isConfirmed: true }; }); await CollectedOrderInvoices.showEditObjectFieldForm(14560, "closed_at", "2026-04-08 11:43:01", onAfterSubmit); expect(mocks.swalFire).toHaveBeenCalledTimes(1); const modalOptions = mocks.swalFire.mock.calls[0][0]; expect(modalOptions.html).toContain('type="date"'); expect(modalOptions.html).toContain('value="2026-04-08"'); expect(mocks.setColumn).toHaveBeenCalledTimes(1); const setColumnArgs = mocks.setColumn.mock.calls[0]; expect(setColumnArgs[0]).toBe("/collected-invoices"); expect(setColumnArgs[1]).toBe(14560); expect(setColumnArgs[2]).toBe("closed_at"); expect(setColumnArgs[3]).toBe("2026-04-08"); expect(onAfterSubmit).toHaveBeenCalledTimes(1); }); it("supports clearing closed_at and saves null", async () => { const onAfterSubmit = vi.fn(); mocks.setColumn.mockResolvedValue({}); mocks.swalFire.mockImplementation(async (options) => { document.body.innerHTML = options.html; options.didOpen?.(); const clearButton = document.getElementById("collected-order-invoice-closed-at-clear-button"); clearButton.click(); await options.preConfirm(); return { isConfirmed: true }; }); await CollectedOrderInvoices.showEditObjectFieldForm(14561, "closed_at", "2026-04-08 11:43:01", onAfterSubmit); expect(mocks.setColumn).toHaveBeenCalledTimes(1); expect(mocks.setColumn.mock.calls[0][3]).toBeNull(); expect(onAfterSubmit).toHaveBeenCalledTimes(1); expect(mocks.swalShowValidationMessage).not.toHaveBeenCalled(); }); it("falls back to generic object editor for non-closed_at columns", async () => { const onAfterSubmit = vi.fn(); mocks.showEditObjectFieldForm.mockResolvedValue({}); await CollectedOrderInvoices.showEditObjectFieldForm(11, "name", "Invoice name", onAfterSubmit); expect(mocks.showEditObjectFieldForm).toHaveBeenCalledTimes(1); expect(mocks.showEditObjectFieldForm).toHaveBeenCalledWith( CollectedOrderInvoices, 11, "name", "Invoice name", onAfterSubmit ); expect(mocks.swalFire).not.toHaveBeenCalled(); }); });