Skip to content

Commit a9940ea

Browse files
committed
test(billing): add unit tests for findValidPaymentMethod function
- 11 new tests covering empty array, single valid/invalid, mixed lists - Tests for first valid selection, order preservation, link vs card priority - Verifies non-mutation of input array - Total: 36 tests for auto-topup-helpers (was 25, now 36)
1 parent abfedd8 commit a9940ea

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed

packages/billing/src/__tests__/auto-topup-helpers.test.ts

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { describe, expect, it } from 'bun:test'
22

33
import {
44
filterValidPaymentMethods,
5+
findValidPaymentMethod,
56
isValidPaymentMethod,
67
} from '../auto-topup-helpers'
78

@@ -271,4 +272,128 @@ describe('auto-topup-helpers', () => {
271272
expect(original[1].id).toBe('pm_expired')
272273
})
273274
})
275+
276+
describe('findValidPaymentMethod', () => {
277+
it('should return undefined for empty array', () => {
278+
const result = findValidPaymentMethod([])
279+
expect(result).toBeUndefined()
280+
})
281+
282+
it('should return the payment method when single valid card exists', () => {
283+
const validCard = createCardPaymentMethod('pm_valid', 2099, 12)
284+
285+
const result = findValidPaymentMethod([validCard])
286+
287+
expect(result).toBeDefined()
288+
expect(result?.id).toBe('pm_valid')
289+
})
290+
291+
it('should return the payment method when single valid link exists', () => {
292+
const validLink = createLinkPaymentMethod('pm_link')
293+
294+
const result = findValidPaymentMethod([validLink])
295+
296+
expect(result).toBeDefined()
297+
expect(result?.id).toBe('pm_link')
298+
})
299+
300+
it('should return undefined when single payment method is invalid', () => {
301+
const expiredCard = createCardPaymentMethod('pm_expired', 2020, 1)
302+
303+
const result = findValidPaymentMethod([expiredCard])
304+
305+
expect(result).toBeUndefined()
306+
})
307+
308+
it('should return undefined when all payment methods are invalid', () => {
309+
const expiredCard1 = createCardPaymentMethod('pm_expired_1', 2020, 1)
310+
const expiredCard2 = createCardPaymentMethod('pm_expired_2', 2015, 6)
311+
const sepa = createPaymentMethodWithType('pm_sepa', 'sepa_debit')
312+
313+
const result = findValidPaymentMethod([expiredCard1, expiredCard2, sepa])
314+
315+
expect(result).toBeUndefined()
316+
})
317+
318+
it('should return the first valid payment method from a mixed list', () => {
319+
const expiredCard = createCardPaymentMethod('pm_expired', 2020, 1)
320+
const validCard = createCardPaymentMethod('pm_valid', 2099, 12)
321+
const validLink = createLinkPaymentMethod('pm_link')
322+
323+
const result = findValidPaymentMethod([expiredCard, validCard, validLink])
324+
325+
expect(result).toBeDefined()
326+
expect(result?.id).toBe('pm_valid')
327+
})
328+
329+
it('should return the first valid when multiple valid payment methods exist', () => {
330+
const validCard1 = createCardPaymentMethod('pm_card_1', 2099, 12)
331+
const validCard2 = createCardPaymentMethod('pm_card_2', 2050, 6)
332+
const validLink = createLinkPaymentMethod('pm_link')
333+
334+
const result = findValidPaymentMethod([validCard1, validCard2, validLink])
335+
336+
expect(result).toBeDefined()
337+
expect(result?.id).toBe('pm_card_1')
338+
})
339+
340+
it('should return link if it appears before valid cards', () => {
341+
const validLink = createLinkPaymentMethod('pm_link')
342+
const validCard = createCardPaymentMethod('pm_card', 2099, 12)
343+
344+
const result = findValidPaymentMethod([validLink, validCard])
345+
346+
expect(result).toBeDefined()
347+
expect(result?.id).toBe('pm_link')
348+
})
349+
350+
it('should skip invalid methods at the start and return first valid', () => {
351+
const expiredCard1 = createCardPaymentMethod('pm_expired_1', 2020, 1)
352+
const expiredCard2 = createCardPaymentMethod('pm_expired_2', 2019, 6)
353+
const sepa = createPaymentMethodWithType('pm_sepa', 'sepa_debit')
354+
const validCard = createCardPaymentMethod('pm_valid', 2099, 12)
355+
const validLink = createLinkPaymentMethod('pm_link')
356+
357+
const result = findValidPaymentMethod([
358+
expiredCard1,
359+
expiredCard2,
360+
sepa,
361+
validCard,
362+
validLink,
363+
])
364+
365+
expect(result).toBeDefined()
366+
expect(result?.id).toBe('pm_valid')
367+
})
368+
369+
it('should return the only valid payment method even if last in list', () => {
370+
const expiredCard1 = createCardPaymentMethod('pm_expired_1', 2020, 1)
371+
const expiredCard2 = createCardPaymentMethod('pm_expired_2', 2019, 6)
372+
const sepa = createPaymentMethodWithType('pm_sepa', 'sepa_debit')
373+
const validLink = createLinkPaymentMethod('pm_link')
374+
375+
const result = findValidPaymentMethod([
376+
expiredCard1,
377+
expiredCard2,
378+
sepa,
379+
validLink,
380+
])
381+
382+
expect(result).toBeDefined()
383+
expect(result?.id).toBe('pm_link')
384+
})
385+
386+
it('should not mutate the original array', () => {
387+
const validCard = createCardPaymentMethod('pm_valid', 2099, 12)
388+
const expiredCard = createCardPaymentMethod('pm_expired', 2020, 1)
389+
const original = [expiredCard, validCard]
390+
const originalLength = original.length
391+
392+
findValidPaymentMethod(original)
393+
394+
expect(original).toHaveLength(originalLength)
395+
expect(original[0].id).toBe('pm_expired')
396+
expect(original[1].id).toBe('pm_valid')
397+
})
398+
})
274399
})

0 commit comments

Comments
 (0)