From e5d8eb18f144d4bebcb5c968b197d80ff55315da Mon Sep 17 00:00:00 2001 From: zoujing Date: Thu, 30 Jul 2026 16:02:31 +0800 Subject: [PATCH] test: cover ticket model edge cases --- src/pages-service/tickets/model.test.mjs | 49 +++++++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/pages-service/tickets/model.test.mjs b/src/pages-service/tickets/model.test.mjs index 3f87eec..f447e7a 100644 --- a/src/pages-service/tickets/model.test.mjs +++ b/src/pages-service/tickets/model.test.mjs @@ -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: [] })