test: cover ticket model edge cases

This commit is contained in:
2026-07-30 16:02:31 +08:00
parent 578e186746
commit e5d8eb18f1

View File

@@ -66,6 +66,7 @@ test('exposes the ticket views', () => {
test('calculates age from a mainland ID at the visit date', () => {
assert.equal(calculateAge('110101196001010010', '2026-08-01'), 66)
assert.equal(calculateAge('110101201001020010', '2026-01-01'), 15)
assert.equal(calculateAge('not-an-id', '2026-08-01'), null)
})
test('checks traveler eligibility against an age rule', () => {
@@ -76,6 +77,10 @@ test('checks traveler eligibility against an age rule', () => {
assert.equal(isTravelerEligible(traveler, { ageRule: { min: 6, max: 17 } }, '2026-08-01'), true)
assert.equal(isTravelerEligible(traveler, { ageRule: { min: 60, max: 120 } }, '2026-08-01'), false)
assert.equal(isTravelerEligible({ idType: '护照' }, {}, '2026-08-01'), true)
assert.equal(isTravelerEligible({ idType: '护照' }, { ageRule: { min: 6, max: 17 } }, '2026-08-01'), false)
assert.equal(isTravelerEligible({ idType: '身份证', idNumber: '110101202008010010' }, { ageRule: { min: 6, max: 17 } }, '2026-08-01'), true)
assert.equal(isTravelerEligible({ idType: '身份证', idNumber: '110101200908010010' }, { ageRule: { min: 6, max: 17 } }, '2026-08-01'), true)
})
test('calculates booking totals including selected insurance', () => {
@@ -91,6 +96,17 @@ test('validates booking draft fields and selected travelers in order', () => {
const incompleteTraveler = { id: 't-1', idType: '身份证', idNumber: '' }
const childTraveler = { id: 't-1', name: '小林', idType: '身份证', idNumber: '110101201001020010' }
assert.deepEqual(draft, {
visitDate: '',
timeSlot: '',
quantity: 1,
travelerIds: [],
contactName: '',
phone: '',
insuranceSelected: false,
insurancePrice: 5,
maxQuantity: 5,
})
assert.equal(validateBooking({ product: adultProduct, draft, travelers: [] }), '请选择使用日期')
const completeDraft = {
@@ -114,6 +130,7 @@ test('validates booking draft fields and selected travelers in order', () => {
})
test('creates a paid order with entitlements and credentials', () => {
const now = new Date('2026-07-30T10:00:00+08:00')
const order = createPaidOrder({
product: adultProduct,
draft: {
@@ -126,14 +143,40 @@ test('creates a paid order with entitlements and credentials', () => {
insuranceSelected: true,
},
travelers: [eligibleTraveler],
now: new Date('2026-07-30T10:00:00+08:00'),
now,
})
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.id, `ORDER-${now.getTime()}`)
assert.equal(order.gateCredential.qrToken, `GATE-${order.id}`)
assert.equal(order.selfCredential.qrToken, `SELF-${order.id}`)
assert.equal(order.logs[0].message, '订单支付成功')
const secondTraveler = { ...eligibleTraveler, id: 't-2', idNumber: '110101199101020010' }
const uninsuredOrder = createPaidOrder({
product: adultProduct,
draft: {
...createBookingDraft(adultProduct),
visitDate: '2026-08-01',
timeSlot: '08:00—09:30',
quantity: 2,
travelerIds: ['t-1', 't-2'],
contactName: '林晓',
phone: '13800138000',
},
travelers: [eligibleTraveler, secondTraveler],
now,
})
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)
})
test('applies refunds and pops view history without mutation', () => {
@@ -158,7 +201,9 @@ 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(applyRefund(result.order, [entitlementId], '重复申请').refund.entitlementIds, [])
const repeatedRefund = applyRefund(result.order, [entitlementId, 'missing-entitlement'], '重复申请')
assert.equal(repeatedRefund.refund.amount, 0)
assert.deepEqual(repeatedRefund.refund.entitlementIds, [])
assert.deepEqual(popViewHistory(history), { view: 'booking', history: ['home', 'detail'] })
assert.deepEqual(history, ['home', 'detail', 'booking'])
assert.deepEqual(popViewHistory([]), { view: 'home', history: [] })