feat(assignments): partial return schema, concurrency guard, domain error

This commit is contained in:
2026-06-25 21:02:46 +02:00
parent 9b023ee558
commit e4bd76a353
6 changed files with 365 additions and 88 deletions
@@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest"
import {
buildCreateAssignmentSchema,
buildReturnAssignmentSchema,
buildUpdateAssignmentSchema,
} from "@/schemas/assignment.schema"
@@ -96,3 +97,90 @@ describe("assignment schema localization", () => {
}
})
})
describe("return assignment schema", () => {
it("accepts a partial return payload with optional notes", () => {
const result = buildReturnAssignmentSchema(schemaCopy).safeParse({
id: "assignment-1",
returns: [
{
assignmentLineId: "line-1",
quantity: 2,
notes: "Slightly damaged",
},
],
})
expect(result.success).toBe(true)
if (result.success) {
expect(result.data.id).toBe("assignment-1")
expect(result.data.returns).toHaveLength(1)
expect(result.data.returns?.[0]).toMatchObject({
assignmentLineId: "line-1",
quantity: 2,
notes: "Slightly damaged",
})
}
})
it("rejects a non-integer quantity", () => {
const result = buildReturnAssignmentSchema(schemaCopy).safeParse({
id: "assignment-1",
returns: [
{
assignmentLineId: "line-1",
quantity: 1.5,
},
],
})
expect(result.success).toBe(false)
if (!result.success) {
expect(
result.error.issues.some((issue) => issue.path.includes("quantity")),
).toBe(true)
}
})
it("rejects a quantity less than or equal to zero", () => {
const zeroResult = buildReturnAssignmentSchema(schemaCopy).safeParse({
id: "assignment-1",
returns: [{ assignmentLineId: "line-1", quantity: 0 }],
})
expect(zeroResult.success).toBe(false)
if (!zeroResult.success) {
expect(
zeroResult.error.issues.some((issue) =>
issue.path.includes("quantity"),
),
).toBe(true)
}
const negativeResult = buildReturnAssignmentSchema(schemaCopy).safeParse({
id: "assignment-1",
returns: [{ assignmentLineId: "line-1", quantity: -1 }],
})
expect(negativeResult.success).toBe(false)
if (!negativeResult.success) {
expect(
negativeResult.error.issues.some((issue) =>
issue.path.includes("quantity"),
),
).toBe(true)
}
})
it("keeps the legacy full-return shape valid", () => {
const result = buildReturnAssignmentSchema(schemaCopy).safeParse({
id: "assignment-1",
})
expect(result.success).toBe(true)
if (result.success) {
expect(result.data.id).toBe("assignment-1")
expect(result.data.returns).toBeUndefined()
}
})
})