@@ -2,6 +2,7 @@ import { describe, expect, it } from 'bun:test'
22
33import {
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