fix: align ticket order entitlement model

This commit is contained in:
2026-07-30 16:09:35 +08:00
parent 614778a767
commit cb8cbb66f7
2 changed files with 42 additions and 34 deletions

View File

@@ -29,16 +29,18 @@ const adultProduct = {
{
id: 'adult-ticket',
name: '成人门票',
allocation: 120,
fulfillment: 'third_party',
quantity: 1,
unit: '张',
refundAllocation: 120,
third_party: true,
},
{
id: 'shuttle',
name: '摆渡车',
allocation: 40,
name: '观光车票',
fulfillment: 'self',
quantity: 1,
unit: '张',
refundAllocation: 40,
self: true,
},
],
}
@@ -151,14 +153,16 @@ test('creates a paid order with entitlements and credentials', () => {
assert.equal(order.status, 'paid')
assert.equal(order.paidAmount, 165)
assert.equal(order.entitlements.length, 2)
assert.match(order.gateCredential.qrToken, /^GATE-/)
assert.match(order.selfCredential.qrToken, /^SELF-/)
assert.equal(order.createdAt, '2026-07-30 10:00:00')
assert.equal(order.product, undefined)
assert.equal(order.productId, 'adult')
assert.equal(order.productName, '成人票')
assert.equal(order.id, `ORDER-${now.getTime()}`)
assert.equal(order.gateCredential.qrToken, `GATE-${order.id}`)
assert.equal(order.selfCredential.qrToken, `SELF-${order.id}`)
assert.deepEqual(order.insurance, { price: 5, amount: 5 })
assert.equal(order.logs[0].message, '订单支付成功')
assert.equal(order.orderNo, order.id)
assert.equal(order.paidAt, '2026-07-30 10:00:00')
assert.deepEqual(order.gateCredential, { status: 'issued', qrToken: `GATE-${order.orderNo}` })
assert.deepEqual(order.selfCredential, { status: 'issued', qrToken: `SELF-${order.orderNo}` })
assert.deepEqual(order.insurance, { name: '出行意外险', price: 5, quantity: 1, status: 'active' })
assert.deepEqual(order.logs[0], { time: order.paidAt, text: '订单支付成功', operator: '系统' })
const secondTraveler = { ...eligibleTraveler, id: 't-2', idNumber: '110101199101020010' }
const thirdTraveler = { ...eligibleTraveler, id: 't-3', idNumber: '110101199201020010' }
@@ -180,7 +184,7 @@ test('creates a paid order with entitlements and credentials', () => {
assert.equal(uninsuredOrder.travelers.length, 2)
assert.deepEqual(uninsuredOrder.entitlements.map((entitlement) => entitlement.quantity), [2, 2])
assert.deepEqual(uninsuredOrder.entitlements.map((entitlement) => entitlement.status), ['pending', 'pending'])
assert.equal(uninsuredOrder.insurance, undefined)
assert.equal(uninsuredOrder.insurance, null)
const insuredOrder = createPaidOrder({
product: adultProduct,
@@ -201,12 +205,14 @@ test('creates a paid order with entitlements and credentials', () => {
assert.deepEqual(insuredOrder.travelers.map((traveler) => traveler.id), ['t-1', 't-2'])
assert.deepEqual(insuredOrder.entitlements.map((entitlement) => entitlement.quantity), [2, 2])
assert.deepEqual(insuredOrder.entitlements.map((entitlement) => entitlement.refundAllocation), [120, 40])
assert.deepEqual(insuredOrder.entitlements.map((entitlement) => entitlement.usedQuantity), [0, 0])
assert.equal(calculateRefundAmount(insuredOrder, [insuredOrder.entitlements[0].id]), 240)
assert.notEqual(insuredOrder.entitlements[0], adultProduct.entitlements[0])
assert.deepEqual(adultProduct.entitlements, [
{ id: 'adult-ticket', name: '成人门票', allocation: 120, refundAllocation: 120, third_party: true },
{ id: 'shuttle', name: '摆渡车', allocation: 40, refundAllocation: 40, self: true },
{ id: 'adult-ticket', name: '成人门票', fulfillment: 'third_party', quantity: 1, unit: '张', refundAllocation: 120 },
{ id: 'shuttle', name: '观光车票', fulfillment: 'self', quantity: 1, unit: '张', refundAllocation: 40 },
])
assert.deepEqual(insuredOrder.insurance, { price: 5, amount: 10 })
assert.deepEqual(insuredOrder.insurance, { name: '出行意外险', price: 5, quantity: 2, status: 'active' })
})
test('applies refunds and pops view history without mutation', () => {
@@ -231,6 +237,7 @@ 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(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, [])