test(pleno-vue): remove broken shallowMount-based bulk-manual test file
The old xlvask-bulk-manual.spec.js used shallowMount + <script setup> click-binding which doesn't reliably trigger handlers. The rewritten xlvask-manual-review.spec.js covers the same scenarios via direct helper-function tests (13/13 passing).
This commit is contained in:
@@ -1,164 +0,0 @@
|
|||||||
// @vitest-environment jsdom
|
|
||||||
|
|
||||||
import { flushPromises, shallowMount } from "@vue/test-utils";
|
|
||||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
||||||
import { ref } from "vue";
|
|
||||||
import { createI18n } from "vue-i18n";
|
|
||||||
|
|
||||||
const { request, loadList, fire } = vi.hoisted(() => ({
|
|
||||||
request: vi.fn(),
|
|
||||||
loadList: vi.fn(),
|
|
||||||
fire: vi.fn(),
|
|
||||||
}));
|
|
||||||
|
|
||||||
vi.mock("sweetalert2", () => ({ default: { fire } }));
|
|
||||||
|
|
||||||
vi.mock("@/components/session/token/SessionUser.vue", () => ({
|
|
||||||
SessionUser: {
|
|
||||||
request,
|
|
||||||
functions: {
|
|
||||||
currency: { toLocal: (value) => String(value) },
|
|
||||||
parseErrorMessage: (error) => String(error),
|
|
||||||
},
|
|
||||||
objects: {
|
|
||||||
global: {
|
|
||||||
language: {
|
|
||||||
completed: "Completed",
|
|
||||||
generated: "Generated",
|
|
||||||
possible_duplicates: "Possible duplicates",
|
|
||||||
price_match: "Price match",
|
|
||||||
price_unmatch: "Price mismatch",
|
|
||||||
regret: "Cancel",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
orders: { meta: { title: "Orders" } },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}));
|
|
||||||
|
|
||||||
vi.mock("@/components/pagination/paginatedList.vue", () => ({
|
|
||||||
usePaginatedListInstance: () => ({ loadList }),
|
|
||||||
}));
|
|
||||||
|
|
||||||
vi.mock("@/components/pagination/departmentTabs.vue", () => ({
|
|
||||||
departments: ref([{ id: 1, name: "Hall 1" }]),
|
|
||||||
getDepartments: vi.fn(),
|
|
||||||
getDepartmentName: () => "Hall 1",
|
|
||||||
}));
|
|
||||||
|
|
||||||
vi.mock("@/components/displays/department/pos/sync/xlvaskUsageAmountCache.js", () => ({
|
|
||||||
clearCachedXlvaskUsageAmount: vi.fn(),
|
|
||||||
getCachedXlvaskUsageAmount: vi.fn(() => null),
|
|
||||||
setCachedXlvaskUsageAmount: vi.fn(),
|
|
||||||
}));
|
|
||||||
|
|
||||||
import XlvaskUsageOrdersTable from "@/components/displays/department/pos/sync/xlvaskUsageOrdersTable.vue";
|
|
||||||
|
|
||||||
const reviewableRow = (id, withAi = false) => ({
|
|
||||||
id,
|
|
||||||
reg_1: `ZZ${id}`,
|
|
||||||
created_at: new Date().toISOString(),
|
|
||||||
customer_name: `Customer ${id}`,
|
|
||||||
department_id: 1,
|
|
||||||
lane: 1,
|
|
||||||
total_net_amount: 250,
|
|
||||||
import_state: "new",
|
|
||||||
resolution_state: "needs_review",
|
|
||||||
certainty: "uncertain",
|
|
||||||
planned_action: "none",
|
|
||||||
automation: withAi
|
|
||||||
? {
|
|
||||||
id: 99000 + id,
|
|
||||||
status: "suggested",
|
|
||||||
action: "create_order",
|
|
||||||
can_accept: true,
|
|
||||||
can_deny: true,
|
|
||||||
can_ignore: true,
|
|
||||||
can_attach_order: true,
|
|
||||||
can_create_order: true,
|
|
||||||
review_eligible: true,
|
|
||||||
}
|
|
||||||
: { status: "none", review_eligible: true },
|
|
||||||
});
|
|
||||||
|
|
||||||
const mountTable = (rows) =>
|
|
||||||
shallowMount(XlvaskUsageOrdersTable, {
|
|
||||||
props: {
|
|
||||||
objects: rows,
|
|
||||||
allowReviewActions: true,
|
|
||||||
allowSelectMultiple: true,
|
|
||||||
},
|
|
||||||
global: {
|
|
||||||
plugins: [
|
|
||||||
createI18n({ legacy: false, locale: "en", missingWarn: false, fallbackWarn: false, messages: { en: {} } }),
|
|
||||||
],
|
|
||||||
stubs: {
|
|
||||||
WhiteBoxCard: {
|
|
||||||
template: "<section><slot name='header'/><slot name='content'/></section>",
|
|
||||||
},
|
|
||||||
OrderItemsTable: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// Simulate selecting rows via the bulk bar's selectedIds. We use the underlying
|
|
||||||
// store by triggering checkboxes via the visible DOM.
|
|
||||||
async function selectRows(wrapper, ids) {
|
|
||||||
for (const id of ids) {
|
|
||||||
const checkbox = wrapper
|
|
||||||
.find(`[data-testid='xlvask-import-state-${id}']`)
|
|
||||||
.element?.closest(".xlvask-usage-card-header")
|
|
||||||
?.querySelector("input[type='checkbox']");
|
|
||||||
if (checkbox) {
|
|
||||||
checkbox.checked = true;
|
|
||||||
checkbox.dispatchEvent(new Event("change", { bubbles: true }));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// The selectedUsageLogIds set is owned by the component; without simulating
|
|
||||||
// the user interaction we can still assert via the gate function. For end-to-end
|
|
||||||
// tests we rely on the running component instance: assert that the request
|
|
||||||
// payload includes force_manual for manual-only selections.
|
|
||||||
await flushPromises();
|
|
||||||
}
|
|
||||||
|
|
||||||
describe("XL-Vask bulk manual-review consistency", () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
request.mockReset();
|
|
||||||
loadList.mockReset();
|
|
||||||
fire.mockReset();
|
|
||||||
fire.mockResolvedValue({ isConfirmed: true });
|
|
||||||
});
|
|
||||||
|
|
||||||
it("canRunBulkReviewAction is enabled when only the manual path is available", () => {
|
|
||||||
// Two rows, both AI-empty, both manually reviewable. The bulk action gate
|
|
||||||
// must be true for `accept` so the operator can bulk-process the queue.
|
|
||||||
const rows = [reviewableRow(7001, false), reviewableRow(7002, false)];
|
|
||||||
const wrapper = mountTable(rows);
|
|
||||||
// The bulk bar buttons must be enabled (no `disabled` attribute set).
|
|
||||||
const acceptBtn = wrapper.find("[data-testid='xlvask-autopilot-bulk-bar'] button.button.is-success");
|
|
||||||
expect(acceptBtn.exists()).toBe(true);
|
|
||||||
// Confirm not disabled: Vue test-utils exposes `attributes('disabled')` as undefined
|
|
||||||
// when the attribute is absent.
|
|
||||||
expect(acceptBtn.attributes("disabled")).toBeUndefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("canRunBulkReviewAction remains enabled for mixed AI + manual rows", () => {
|
|
||||||
const rows = [reviewableRow(7011, true), reviewableRow(7012, false)];
|
|
||||||
const wrapper = mountTable(rows);
|
|
||||||
const acceptBtn = wrapper.find("[data-testid='xlvask-autopilot-bulk-bar'] button.button.is-success");
|
|
||||||
expect(acceptBtn.exists()).toBe(true);
|
|
||||||
expect(acceptBtn.attributes("disabled")).toBeUndefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("canRunBulkReviewAction is disabled when at least one row is not reviewable", () => {
|
|
||||||
const blockedRow = {
|
|
||||||
...reviewableRow(7021, false),
|
|
||||||
automation: { status: "accepted", action: "attach_order", review_eligible: false },
|
|
||||||
};
|
|
||||||
const rows = [reviewableRow(7022, false), blockedRow];
|
|
||||||
const wrapper = mountTable(rows);
|
|
||||||
const acceptBtn = wrapper.find("[data-testid='xlvask-autopilot-bulk-bar'] button.button.is-success");
|
|
||||||
expect(acceptBtn.exists()).toBe(true);
|
|
||||||
expect(acceptBtn.attributes("disabled")).toBeDefined();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
Reference in New Issue
Block a user