feat(plan): entry CRUD with past-date lock and audit-data return
This commit is contained in:
@@ -5,6 +5,9 @@ import {
|
||||
resolveGrid,
|
||||
listPlanUsers,
|
||||
assertNotPastDate,
|
||||
createEntry,
|
||||
updateEntry,
|
||||
deleteEntry,
|
||||
} from "../services/plan.service";
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -213,3 +216,140 @@ describe("plan.service.assertNotPastDate", () => {
|
||||
expect(result).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// createEntry
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
describe("plan.service.createEntry", () => {
|
||||
it("creates an entry and returns { data, oldData: null }", async () => {
|
||||
const result = await createEntry(
|
||||
{
|
||||
user_id: adminUserId,
|
||||
date_from: "2099-07-01",
|
||||
date_to: "2099-07-05",
|
||||
category: "work",
|
||||
note: `${N}new entry`,
|
||||
},
|
||||
adminUserId,
|
||||
false,
|
||||
);
|
||||
expect("data" in result).toBe(true);
|
||||
if ("data" in result) {
|
||||
expect(result.data.note).toBe(`${N}new entry`);
|
||||
expect(result.oldData).toBeNull();
|
||||
}
|
||||
});
|
||||
|
||||
it("rejects a past date without force", async () => {
|
||||
const result = await createEntry(
|
||||
{
|
||||
user_id: adminUserId,
|
||||
date_from: "2000-01-01",
|
||||
date_to: "2000-01-02",
|
||||
category: "work",
|
||||
note: `${N}past`,
|
||||
},
|
||||
adminUserId,
|
||||
false,
|
||||
);
|
||||
expect("error" in result).toBe(true);
|
||||
if ("error" in result) expect(result.status).toBe(403);
|
||||
});
|
||||
|
||||
it("allows a past date with force", async () => {
|
||||
const result = await createEntry(
|
||||
{
|
||||
user_id: adminUserId,
|
||||
date_from: "2000-01-01",
|
||||
date_to: "2000-01-02",
|
||||
category: "work",
|
||||
note: `${N}past forced`,
|
||||
},
|
||||
adminUserId,
|
||||
true,
|
||||
);
|
||||
expect("data" in result).toBe(true);
|
||||
});
|
||||
|
||||
it("rejects when date_to < date_from", async () => {
|
||||
const result = await createEntry(
|
||||
{
|
||||
user_id: adminUserId,
|
||||
date_from: "2099-07-10",
|
||||
date_to: "2099-07-05",
|
||||
category: "work",
|
||||
note: `${N}invalid range`,
|
||||
},
|
||||
adminUserId,
|
||||
false,
|
||||
);
|
||||
expect("error" in result).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// updateEntry
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
describe("plan.service.updateEntry", () => {
|
||||
it("updates the note and returns the old data", async () => {
|
||||
const created = await createEntry(
|
||||
{
|
||||
user_id: adminUserId,
|
||||
date_from: "2099-08-01",
|
||||
date_to: "2099-08-03",
|
||||
category: "work",
|
||||
note: `${N}original`,
|
||||
},
|
||||
adminUserId,
|
||||
false,
|
||||
);
|
||||
if (!("data" in created)) throw new Error("setup failed");
|
||||
|
||||
const updated = await updateEntry(
|
||||
created.data.id,
|
||||
{ note: `${N}updated` },
|
||||
adminUserId,
|
||||
false,
|
||||
);
|
||||
expect("data" in updated).toBe(true);
|
||||
if ("data" in updated) {
|
||||
expect(updated.data.note).toBe(`${N}updated`);
|
||||
expect((updated.oldData as any).note).toBe(`${N}original`);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// deleteEntry
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
describe("plan.service.deleteEntry", () => {
|
||||
it("soft-deletes the row and returns the old data", async () => {
|
||||
const created = await createEntry(
|
||||
{
|
||||
user_id: adminUserId,
|
||||
date_from: "2099-09-01",
|
||||
date_to: "2099-09-01",
|
||||
category: "work",
|
||||
note: `${N}to delete`,
|
||||
},
|
||||
adminUserId,
|
||||
false,
|
||||
);
|
||||
if (!("data" in created)) throw new Error("setup failed");
|
||||
|
||||
const result = await deleteEntry(created.data.id, adminUserId, false);
|
||||
expect("data" in result).toBe(true);
|
||||
if ("data" in result) {
|
||||
expect(result.data).toEqual({ ok: true });
|
||||
expect((result.oldData as any).note).toBe(`${N}to delete`);
|
||||
}
|
||||
|
||||
const stillThere = await prisma.work_plan_entries.findUnique({
|
||||
where: { id: created.data.id },
|
||||
});
|
||||
expect(stillThere?.is_deleted).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user