fix: harden ticket model edge cases

This commit is contained in:
zoujing committed 2026-07-30 16:15:37 +08:00
1 parent cb8cbb66f7
commit 516a9431f0
2 files changed
+26 -5

No files matched your search

+19 -2
View File
@@ -125,6 +125,7 @@ test('validates booking draft fields and selected travelers in order', () => {
assert.equal(validateBooking({ product: adultProduct, draft: { ...completeDraft, timeSlot: '' }, travelers: [eligibleTraveler] }), '请选择使用场次')
assert.equal(validateBooking({ product: adultProduct, draft: { ...completeDraft, quantity: 0 }, travelers: [eligibleTraveler] }), '购买数量无效')
assert.equal(validateBooking({ product: adultProduct, draft: { ...completeDraft, maxQuantity: 0 }, travelers: [eligibleTraveler] }), '购买数量无效')
assert.equal(validateBooking({ product: adultProduct, draft: { ...completeDraft, travelerIds: [] }, travelers: [eligibleTraveler] }), '请选择足够数量的出行人')
assert.equal(validateBooking({ product: adultProduct, draft: { ...completeDraft, quantity: 2, travelerIds: ['t-1', 't-1'] }, travelers: [eligibleTraveler] }), '请选择足够数量的出行人')
assert.equal(validateBooking({ product: adultProduct, draft: completeDraft, travelers: [incompleteTraveler] }), '请完善出行人实名信息')
@@ -213,6 +214,15 @@ test('creates a paid order with entitlements and credentials', () => {
{ id: 'shuttle', name: '观光车票', fulfillment: 'self', quantity: 1, unit: '张', refundAllocation: 40 },
])
assert.deepEqual(insuredOrder.insurance, { name: '出行意外险', price: 5, quantity: 2, status: 'active' })
const zeroQuantityOrder = createPaidOrder({
product: { ...adultProduct, entitlements: [{ ...adultProduct.entitlements[0], quantity: 0 }] },
draft: { ...createBookingDraft(adultProduct), quantity: 2 },
travelers: [],
now,
})
assert.equal(zeroQuantityOrder.entitlements[0].quantity, 0)
})
test('applies refunds and pops view history without mutation', () => {
@@ -230,6 +240,7 @@ test('applies refunds and pops view history without mutation', () => {
})
const entitlementId = order.entitlements[0].id
const history = ['home', 'detail', 'booking']
const originalOrder = structuredClone(order)
assert.equal(calculateRefundAmount(order, [entitlementId]), 120)
@@ -237,10 +248,16 @@ test('applies refunds and pops view history without mutation', () => {
assert.equal(result.order.status, 'refunding')
assert.equal(result.refund.amount, 120)
assert.equal(result.order.entitlements[0].status, 'refunding')
assert.deepEqual(order, originalOrder)
assert.notEqual(result.order.entitlements, order.entitlements)
assert.notEqual(result.order.logs, order.logs)
assert.deepEqual(result.order.logs.at(-1), { time: '2026-07-30 10:01:00', text: '已申请退款', operator: '用户' })
const repeatedRefund = applyRefund(result.order, [entitlementId, 'missing-entitlement'], '重复申请')
assert.equal(repeatedRefund.refund.amount, 0)
assert.deepEqual(repeatedRefund.refund.entitlementIds, [])
assert.equal(repeatedRefund.order, result.order)
assert.equal(repeatedRefund.refund, null)
const emptyRefund = applyRefund(order, [], '空申请')
assert.equal(emptyRefund.order, order)
assert.equal(emptyRefund.refund, null)
assert.deepEqual(popViewHistory(history), { view: 'booking', history: ['home', 'detail'] })
assert.deepEqual(history, ['home', 'detail', 'booking'])
assert.deepEqual(popViewHistory([]), { view: 'home', history: [] })