Files
EpicNext-Cms/src/features/catalog/components/packages/package-editor-helpers.test.ts
T
Simo 047cd9f3dd
CI / check (push) Successful in 52s
CI / deploy (push) Successful in 1m23s
CI / publish-container (push) Failing after 27s
feat(catalog): add saved packages, preview and bulk price editing
2026-09-09 20:04:10 +02:00

128 lines
3.3 KiB
TypeScript

import { expect, it } from "vitest";
import type {
PackageOffer,
PackageSnapshot,
} from "@/features/catalog/domain/packages";
import {
packageBulkPrices,
packageChanges,
packagePublicationIsCurrent,
} from "./package-editor-helpers";
const offer: PackageOffer = {
id: 1,
pageId: 10,
catalogName: "Chair",
itemIds: "42",
costCredits: 100,
costPoints: 20,
pointsType: 5,
amount: 1,
};
it("previews only selected draft offers and preserves furniture references without mutating the snapshot", () => {
const rows = [offer, { ...offer, id: 2, costCredits: 200 }];
const result = packageBulkPrices(rows, [1], {
costCredits: { mode: "percent", value: -25 },
});
expect(result).toEqual([
{ before: offer, after: { ...offer, costCredits: 75 } },
]);
expect(rows[0].costCredits).toBe(100);
expect(rows[1].costCredits).toBe(200);
expect(result[0].after.itemIds).toBe("42");
expect(result[0].after.pageId).toBe(10);
});
it("supports absolute and additive prices, rejecting invalid selection and negative results", () => {
expect(
packageBulkPrices([offer], [1], {
costPoints: { mode: "set", value: 7 },
})[0].after.costPoints,
).toBe(7);
expect(
packageBulkPrices([offer], [1], {
costCredits: { mode: "add", value: 5 },
})[0].after.costCredits,
).toBe(105);
expect(() =>
packageBulkPrices([offer], [1], {
costCredits: { mode: "add", value: -101 },
}),
).toThrow();
expect(() =>
packageBulkPrices([offer], [2], { costCredits: { mode: "set", value: 1 } }),
).toThrow();
expect(() =>
packageBulkPrices([offer], [], { costCredits: { mode: "set", value: 1 } }),
).toThrow();
expect(() =>
packageBulkPrices([offer], [1, 1], {
costCredits: { mode: "set", value: 1 },
}),
).toThrow();
});
it("binds publication eligibility to the saved version and rejects dirty or conflicting reviews", () => {
const saved = { status: "draft" as const, version: 3 };
const review = {
version: 3,
fingerprint: "a".repeat(64),
changedPages: 1,
changedOffers: 1,
conflicts: [],
};
expect(packagePublicationIsCurrent(saved, review, false)).toBe(true);
expect(
packagePublicationIsCurrent(saved, { ...review, version: 4 }, false),
).toBe(false);
expect(packagePublicationIsCurrent(saved, review, true)).toBe(false);
expect(
packagePublicationIsCurrent(
saved,
{ ...review, conflicts: ["Changed live data"] },
false,
),
).toBe(false);
expect(
packagePublicationIsCurrent(
{ ...saved, status: "published" },
review,
false,
),
).toBe(false);
});
it("shows precise category and offer changes against the original snapshot", () => {
const original: PackageSnapshot = {
pages: [
{
id: 10,
parentId: -1,
caption: "Rooms",
enabled: "1",
visible: "1",
iconImage: 1,
minRank: 1,
clubOnly: "0",
vipOnly: "0",
orderNum: 1,
pageLayout: "default_3x3",
},
],
offers: [offer],
};
const draft: PackageSnapshot = {
pages: [{ ...original.pages[0], caption: "Chairs", visible: "0" }],
offers: [{ ...offer, costCredits: 50 }],
};
expect(
packageChanges(original, draft).map((row) => [
row.field,
row.before,
row.after,
]),
).toEqual([
["caption", "Rooms", "Chairs"],
["visible", "1", "0"],
["costCredits", "100", "50"],
]);
expect(packageChanges(original, original)).toEqual([]);
});