11require 'test_helper'
22
3+ # Updated to v1.135.0
34class CreditCardMethodsTest < Test ::Unit ::TestCase
45 include ActiveMerchant ::Billing ::CreditCardMethods
56
@@ -9,19 +10,43 @@ class CreditCard
910
1011 def maestro_card_numbers
1112 %w[
12- 5000000000000000 5099999999999999 5600000000000000
13- 5899999999999999 6000000000000000 6999999999999999
14- 6761999999999999 6763000000000000 5038999999999999
13+ 5612590000000000 5817500000000000 5818000000000000
14+ 6390000000000000 6390700000000000 6390990000000000
15+ 6761999999999999 6763000000000000 6799999999999999
16+ 5000330000000000 5811499999999999 5010410000000000
17+ 5010630000000000 5892440000000000 5016230000000000
1518 ]
1619 end
1720
1821 def non_maestro_card_numbers
1922 %w[
2023 4999999999999999 5100000000000000 5599999999999999
21- 5900000000000000 5999999999999999 7000000000000000
24+ 5612709999999999 5817520000000000 5818019999999999
25+ 5912600000000000 6000009999999999 7000000000000000
2226 ]
2327 end
2428
29+ def maestro_bins
30+ %w[ 500032 500057 501015 501016 501018 501020 501021 501023 501024 501025 501026 501027 501028 501029
31+ 501038 501039 501040 501041 501043 501045 501047 501049 501051 501053 501054 501055 501056 501057
32+ 501058 501060 501061 501062 501063 501066 501067 501072 501075 501083 501087 501623
33+ 501800 501089 501091 501092 501095 501104 501105 501107 501108 501500 501879
34+ 502000 502113 502301 503175 503645 503800
35+ 503670 504310 504338 504363 504533 504587 504620 504639 504656 504738 504781 504910
36+ 507001 507002 507004 507082 507090 560014 560565 561033 572402 572610 572626 576904 578614
37+ 585274 585697 586509 588729 588792 589244 589300 589407 589471 589605 589633 589647 589671
38+ 590043 590206 590263 590265
39+ 590278 590361 590362 590379 590393 590590 591235 591420 591481 591620 591770 591948 591994 592024
40+ 592161 592184 592186 592201 592384 592393 592528 592566 592704 592735 592879 592884 593074 593264
41+ 593272 593355 593496 593556 593589 593666 593709 593825 593963 593994 594184 594409 594468 594475
42+ 594581 594665 594691 594710 594874 594968 595355 595364 595532 595547 595561 595568 595743 595929
43+ 596245 596289 596399 596405 596590 596608 596645 596646 596791 596808 596815 596846 597077 597094
44+ 597143 597370 597410 597765 597855 597862 598053 598054 598395 598585 598793 598794 598815 598835
45+ 598838 598880 598889 599000 599069 599089 599148 599191 599310 599741 599742 599867
46+ 601070 604983 601638 606126
47+ 630400 636380 636422 636502 636639 637046 637756 639130 639229 690032 ]
48+ end
49+
2550 def test_should_be_able_to_identify_valid_expiry_months
2651 assert_false valid_month? ( -1 )
2752 assert_false valid_month? ( 13 )
@@ -47,11 +72,11 @@ def test_should_be_able_to_identify_valid_start_years
4772 end
4873
4974 def test_valid_start_year_can_handle_strings
50- assert valid_start_year? ( " 2009" )
75+ assert valid_start_year? ( ' 2009' )
5176 end
5277
5378 def test_valid_month_can_handle_strings
54- assert valid_month? ( "1" )
79+ assert valid_month? ( '1' )
5580 end
5681
5782 def test_valid_expiry_year_can_handle_strings
@@ -99,67 +124,268 @@ def test_should_detect_electron_dk_as_visa
99124
100125 def test_should_detect_diners_club
101126 assert_equal 'diners_club' , CreditCard . brand? ( '36148010000000' )
127+ assert_equal 'diners_club' , CreditCard . brand? ( '3000000000000004' )
102128 end
103129
104130 def test_should_detect_diners_club_dk
105131 assert_equal 'diners_club' , CreditCard . brand? ( '30401000000000' )
106132 end
107133
134+ def test_should_detect_jcb_cards
135+ assert_equal 'jcb' , CreditCard . brand? ( '3528000000000000' )
136+ assert_equal 'jcb' , CreditCard . brand? ( '3580000000000000' )
137+ assert_equal 'jcb' , CreditCard . brand? ( '3088000000000017' )
138+ assert_equal 'jcb' , CreditCard . brand? ( '3094000000000017' )
139+ assert_equal 'jcb' , CreditCard . brand? ( '3096000000000000' )
140+ assert_equal 'jcb' , CreditCard . brand? ( '3102000000000017' )
141+ assert_equal 'jcb' , CreditCard . brand? ( '3112000000000000' )
142+ assert_equal 'jcb' , CreditCard . brand? ( '3120000000000017' )
143+ assert_equal 'jcb' , CreditCard . brand? ( '3158000000000000' )
144+ assert_equal 'jcb' , CreditCard . brand? ( '3159000000000017' )
145+ assert_equal 'jcb' , CreditCard . brand? ( '3337000000000000' )
146+ assert_equal 'jcb' , CreditCard . brand? ( '3349000000000017' )
147+ end
148+
108149 def test_should_detect_maestro_dk_as_maestro
109150 assert_equal 'maestro' , CreditCard . brand? ( '6769271000000000' )
110151 end
111152
112153 def test_should_detect_maestro_cards
113- assert_equal 'maestro' , CreditCard . brand? ( '5020100000000000 ' )
154+ assert_equal 'maestro' , CreditCard . brand? ( '675675000000000 ' )
114155
115156 maestro_card_numbers . each { |number | assert_equal 'maestro' , CreditCard . brand? ( number ) }
157+ maestro_bins . each { |bin | assert_equal 'maestro' , CreditCard . brand? ( "#{ bin } 0000000000" ) }
116158 non_maestro_card_numbers . each { |number | assert_not_equal 'maestro' , CreditCard . brand? ( number ) }
117159 end
118160
119161 def test_should_detect_mastercard
120- assert_equal 'master' , CreditCard . brand? ( '6771890000000000 ' )
162+ assert_equal 'master' , CreditCard . brand? ( '2720890000000000 ' )
121163 assert_equal 'master' , CreditCard . brand? ( '5413031000000000' )
164+ assert_equal 'master' , CreditCard . brand? ( '6052721000000000' )
165+ assert_equal 'master' , CreditCard . brand? ( '6062821000000000' )
166+ assert_equal 'master' , CreditCard . brand? ( '6370951000000000' )
167+ assert_equal 'master' , CreditCard . brand? ( '6375681000000000' )
168+ assert_equal 'master' , CreditCard . brand? ( '6375991000000000' )
169+ assert_equal 'master' , CreditCard . brand? ( '6376091000000000' )
122170 end
123171
124172 def test_should_detect_forbrugsforeningen
125173 assert_equal 'forbrugsforeningen' , CreditCard . brand? ( '6007221000000000' )
126174 end
127175
128- def test_should_detect_laser_card
129- # 16 digits
130- assert_equal 'laser' , CreditCard . brand? ( '6304985028090561' )
176+ def test_should_detect_sodexo_card
177+ assert_equal 'sodexo' , CreditCard . brand? ( '6060694495764400' )
178+ end
131179
132- # 18 digits
133- assert_equal 'laser' , CreditCard . brand? ( '630498502809056151' )
180+ def test_should_detect_alia_card
181+ assert_equal 'alia' , CreditCard . brand? ( '5049970000000000' )
182+ assert_equal 'alia' , CreditCard . brand? ( '5058780000000000' )
183+ assert_equal 'alia' , CreditCard . brand? ( '6010300000000000' )
184+ assert_equal 'alia' , CreditCard . brand? ( '6010730000000000' )
185+ assert_equal 'alia' , CreditCard . brand? ( '5058740000000000' )
186+ end
134187
135- # 19 digits
136- assert_equal 'laser' , CreditCard . brand? ( '6304985028090561515' )
188+ def test_should_detect_mada_card
189+ assert_equal 'mada' , CreditCard . brand? ( '5043000000000000' )
190+ assert_equal 'mada' , CreditCard . brand? ( '5852650000000000' )
191+ assert_equal 'mada' , CreditCard . brand? ( '5888500000000000' )
192+ assert_equal 'mada' , CreditCard . brand? ( '6361200000000000' )
193+ assert_equal 'mada' , CreditCard . brand? ( '9682040000000000' )
194+ end
137195
138- # 17 digits
139- assert_not_equal 'laser' , CreditCard . brand? ( '63049850280905615' )
196+ def test_alia_number_not_validated
197+ 10 . times do
198+ number = rand ( 5058740000000001 ..5058749999999999 ) . to_s
199+ assert_equal 'alia' , CreditCard . brand? ( number )
200+ assert CreditCard . valid_number? ( number )
201+ end
202+ end
140203
141- # 15 digits
142- assert_not_equal 'laser' , CreditCard . brand? ( '630498502809056' )
204+ def test_should_detect_confiable_card
205+ assert_equal 'confiable' , CreditCard . brand? ( '5607180000000000' )
206+ end
143207
144- # Alternate format
145- assert_equal 'laser' , CreditCard . brand? ( '6706950000000000000' )
208+ def test_should_detect_bp_plus_card
209+ assert_equal 'bp_plus' , CreditCard . brand? ( '70501 501021600 378' )
210+ assert_equal 'bp_plus' , CreditCard . brand? ( '70502 111111111 111' )
211+ assert_equal 'bp_plus' , CreditCard . brand? ( '7050 15605297 00114' )
212+ assert_equal 'bp_plus' , CreditCard . brand? ( '7050 15546992 00062' )
213+ end
146214
147- # Alternate format (16 digits)
148- assert_equal 'laser' , CreditCard . brand? ( '6706123456789012' )
215+ def test_should_validate_bp_plus_card
216+ assert_true CreditCard . valid_number? ( '70501 501021600 378' )
217+ assert_true CreditCard . valid_number? ( '7050 15605297 00114' )
218+ assert_true CreditCard . valid_number? ( '7050 15546992 00062' )
219+ assert_true CreditCard . valid_number? ( '7050 16150146 00110' )
220+ assert_true CreditCard . valid_number? ( '7050 16364764 00070' )
149221
150- # New format (16 digits)
151- assert_equal 'laser' , CreditCard . brand? ( '6709123456789012' )
222+ # numbers with invalid formats
223+ assert_false CreditCard . valid_number? ( '7050_15546992_00062' )
224+ assert_false CreditCard . valid_number? ( '70501 55469920 0062' )
225+ assert_false CreditCard . valid_number? ( '70 501554699 200062' )
152226
153- # Ulster bank (Ireland) with 12 digits
154- assert_equal 'laser' , CreditCard . brand? ( '677117111234' )
227+ # numbers that are luhn-invalid
228+ assert_false CreditCard . valid_number? ( '70502 111111111 111' )
229+ assert_false CreditCard . valid_number? ( '7050 16364764 00071' )
230+ assert_false CreditCard . valid_number? ( '7050 16364764 00072' )
155231 end
156232
157- def test_should_detect_sodexo_card
158- assert_equal 'sodexo' , CreditCard . brand? ( '60606944957644' )
233+ def test_confiable_number_not_validated
234+ 10 . times do
235+ number = rand ( 5607180000000001 ..5607189999999999 ) . to_s
236+ assert_equal 'confiable' , CreditCard . brand? ( number )
237+ assert CreditCard . valid_number? ( number )
238+ end
239+ end
240+
241+ def test_should_detect_maestro_no_luhn_card
242+ assert_equal 'maestro_no_luhn' , CreditCard . brand? ( '5010800000000000' )
243+ assert_equal 'maestro_no_luhn' , CreditCard . brand? ( '5010810000000000' )
244+ assert_equal 'maestro_no_luhn' , CreditCard . brand? ( '5010820000000000' )
245+ assert_equal 'maestro_no_luhn' , CreditCard . brand? ( '501082000000' )
246+ assert_equal 'maestro_no_luhn' , CreditCard . brand? ( '5010820000000000000' )
247+ end
248+
249+ def test_maestro_no_luhn_number_not_validated
250+ 10 . times do
251+ number = rand ( 5010800000000001 ..5010829999999999 ) . to_s
252+ assert_equal 'maestro_no_luhn' , CreditCard . brand? ( number )
253+ assert CreditCard . valid_number? ( number )
254+ end
255+ end
256+
257+ def test_should_detect_olimpica_card
258+ assert_equal 'olimpica' , CreditCard . brand? ( '6368530000000000' )
259+ end
260+
261+ def test_should_detect_sodexo_no_luhn_card
262+ number1 = '5058645584812145'
263+ number2 = '5058655584812145'
264+ assert_equal 'sodexo' , CreditCard . brand? ( number1 )
265+ assert CreditCard . valid_number? ( number1 )
266+ assert_equal 'sodexo' , CreditCard . brand? ( number2 )
267+ assert CreditCard . valid_number? ( number2 )
268+ end
269+
270+ def test_should_validate_sodexo_no_luhn_card
271+ assert_true CreditCard . valid_number? ( '5058645584812145' )
272+ assert_false CreditCard . valid_number? ( '5058665584812110' )
273+ end
274+
275+ def test_should_detect_passcard_card
276+ assert_equal 'passcard' , CreditCard . brand? ( '6280260025383009' )
277+ assert_equal 'passcard' , CreditCard . brand? ( '6280260025383280' )
278+ assert_equal 'passcard' , CreditCard . brand? ( '6280260025383298' )
279+ assert_equal 'passcard' , CreditCard . brand? ( '6280260025383306' )
280+ assert_equal 'passcard' , CreditCard . brand? ( '6280260025383314' )
281+ end
282+
283+ def test_should_validate_passcard_card
284+ assert_true CreditCard . valid_number? ( '6280260025383009' )
285+ # numbers with invalid formats
286+ assert_false CreditCard . valid_number? ( '6280_26002538_0005' )
287+ # numbers that are luhn-invalid
288+ assert_false CreditCard . valid_number? ( '6280260025380991' )
289+ end
290+
291+ def test_should_detect_edenred_card
292+ assert_equal 'edenred' , CreditCard . brand? ( '6374830000000823' )
293+ assert_equal 'edenred' , CreditCard . brand? ( '6374830000000799' )
294+ assert_equal 'edenred' , CreditCard . brand? ( '6374830000000807' )
295+ assert_equal 'edenred' , CreditCard . brand? ( '6374830000000815' )
296+ assert_equal 'edenred' , CreditCard . brand? ( '6374830000000823' )
297+ end
298+
299+ def test_should_validate_edenred_card
300+ assert_true CreditCard . valid_number? ( '6374830000000369' )
301+ # numbers with invalid formats
302+ assert_false CreditCard . valid_number? ( '6374 8300000 00369' )
303+ # numbers that are luhn-invalid
304+ assert_false CreditCard . valid_number? ( '6374830000000111' )
305+ end
306+
307+ def test_should_detect_anda_card
308+ assert_equal 'anda' , CreditCard . brand? ( '6031998427187914' )
309+ end
310+
311+ # Creditos directos a.k.a tarjeta d
312+ def test_should_detect_tarjetad_card
313+ assert_equal 'tarjeta-d' , CreditCard . brand? ( '6018282227431033' )
314+ end
315+
316+ def test_should_detect_creditel_card
317+ assert_equal 'creditel' , CreditCard . brand? ( '6019330047539016' )
159318 end
160319
161320 def test_should_detect_vr_card
162- assert_equal 'vr' , CreditCard . brand? ( '63703644957644' )
321+ assert_equal 'vr' , CreditCard . brand? ( '6370364495764400' )
322+ assert_equal 'vr' , CreditCard . brand? ( '6274160000000001' )
323+ end
324+
325+ def test_should_detect_elo_card
326+ assert_equal 'elo' , CreditCard . brand? ( '5090510000000000' )
327+ assert_equal 'elo' , CreditCard . brand? ( '5067530000000000' )
328+ assert_equal 'elo' , CreditCard . brand? ( '6277800000000000' )
329+ assert_equal 'elo' , CreditCard . brand? ( '6509550000000000' )
330+ assert_equal 'elo' , CreditCard . brand? ( '5090890000000000' )
331+ assert_equal 'elo' , CreditCard . brand? ( '5092570000000000' )
332+ assert_equal 'elo' , CreditCard . brand? ( '5094100000000000' )
333+ end
334+
335+ def test_should_detect_alelo_card
336+ assert_equal 'alelo' , CreditCard . brand? ( '5067490000000010' )
337+ assert_equal 'alelo' , CreditCard . brand? ( '5067700000000028' )
338+ assert_equal 'alelo' , CreditCard . brand? ( '5067600000000036' )
339+ assert_equal 'alelo' , CreditCard . brand? ( '5067600000000044' )
340+ assert_equal 'alelo' , CreditCard . brand? ( '5099920000000000' )
341+ assert_equal 'alelo' , CreditCard . brand? ( '5067630000000000' )
342+ assert_equal 'alelo' , CreditCard . brand? ( '5098870000000000' )
343+ end
344+
345+ def test_should_detect_naranja_card
346+ assert_equal 'naranja' , CreditCard . brand? ( '5895627823453005' )
347+ assert_equal 'naranja' , CreditCard . brand? ( '5895620000000002' )
348+ assert_equal 'naranja' , CreditCard . brand? ( '5895626746595650' )
349+ end
350+
351+ # Alelo BINs beginning with the digit 4 overlap with Visa's range of valid card numbers.
352+ # We intentionally misidentify these cards as Visa, which works because transactions with
353+ # such cards will run on Visa rails.
354+ def test_should_detect_alelo_number_beginning_with_4_as_visa
355+ assert_equal 'visa' , CreditCard . brand? ( '4025880000000010' )
356+ assert_equal 'visa' , CreditCard . brand? ( '4025880000000028' )
357+ assert_equal 'visa' , CreditCard . brand? ( '4025880000000036' )
358+ assert_equal 'visa' , CreditCard . brand? ( '4025880000000044' )
359+ end
360+
361+ def test_should_detect_cabal_card
362+ assert_equal 'cabal' , CreditCard . brand? ( '6044009000000000' )
363+ assert_equal 'cabal' , CreditCard . brand? ( '5896575500000000' )
364+ assert_equal 'cabal' , CreditCard . brand? ( '6035224400000000' )
365+ assert_equal 'cabal' , CreditCard . brand? ( '6502723300000000' )
366+ assert_equal 'cabal' , CreditCard . brand? ( '6500870000000000' )
367+ end
368+
369+ def test_should_detect_unionpay_card
370+ assert_equal 'unionpay' , CreditCard . brand? ( '6221260000000000' )
371+ assert_equal 'unionpay' , CreditCard . brand? ( '6250941006528599' )
372+ assert_equal 'unionpay' , CreditCard . brand? ( '6282000000000000' )
373+ assert_equal 'unionpay' , CreditCard . brand? ( '8100000000000000' )
374+ assert_equal 'unionpay' , CreditCard . brand? ( '814400000000000000' )
375+ assert_equal 'unionpay' , CreditCard . brand? ( '8171999927660000' )
376+ assert_equal 'unionpay' , CreditCard . brand? ( '8171999900000000021' )
377+ assert_equal 'unionpay' , CreditCard . brand? ( '6200000000000005' )
378+ end
379+
380+ def test_should_detect_synchrony_card
381+ assert_equal 'synchrony' , CreditCard . brand? ( '7006000000000000' )
382+ end
383+
384+ def test_should_detect_routex_card
385+ number = '7006760000000000000'
386+ assert_equal 'routex' , CreditCard . brand? ( number )
387+ assert CreditCard . valid_number? ( number )
388+ assert_equal 'routex' , CreditCard . brand? ( '7006789224703725591' )
163389 end
164390
165391 def test_should_detect_when_an_argument_brand_does_not_match_calculated_brand
@@ -168,14 +394,14 @@ def test_should_detect_when_an_argument_brand_does_not_match_calculated_brand
168394 end
169395
170396 def test_detecting_full_range_of_maestro_card_numbers
171- maestro = '50000000000 '
397+ maestro = '63900000000 '
172398
173399 assert_equal 11 , maestro . length
174400 assert_not_equal 'maestro' , CreditCard . brand? ( maestro )
175401
176402 while maestro . length < 19
177403 maestro << '0'
178- assert_equal 'maestro' , CreditCard . brand? ( maestro )
404+ assert_equal 'maestro' , CreditCard . brand? ( maestro ) , "Failed for bin #{ maestro } "
179405 end
180406
181407 assert_equal 19 , maestro . length
@@ -187,34 +413,67 @@ def test_detecting_full_range_of_maestro_card_numbers
187413 def test_matching_discover_card
188414 assert_equal 'discover' , CreditCard . brand? ( '6011000000000000' )
189415 assert_equal 'discover' , CreditCard . brand? ( '6500000000000000' )
190- assert_equal 'discover' , CreditCard . brand? ( '6221260000000000' )
191416 assert_equal 'discover' , CreditCard . brand? ( '6450000000000000' )
192417
193418 assert_not_equal 'discover' , CreditCard . brand? ( '6010000000000000' )
194419 assert_not_equal 'discover' , CreditCard . brand? ( '6600000000000000' )
195420 end
196421
197422 def test_matching_invalid_card
198- assert_nil CreditCard . brand? ( "XXXXXXXXXXXX0000" )
199- assert_false CreditCard . valid_number? ( "XXXXXXXXXXXX0000" )
423+ assert_nil CreditCard . brand? ( 'XXXXXXXXXXXX0000' )
424+ assert_false CreditCard . valid_number? ( 'XXXXXXXXXXXX0000' )
425+ assert_false CreditCard . valid_number? ( nil )
426+ end
427+
428+ def test_matching_valid_naranja
429+ number = '5895627823453005'
430+ assert_equal 'naranja' , CreditCard . brand? ( number )
431+ assert CreditCard . valid_number? ( number )
432+ end
433+
434+ def test_matching_valid_creditel
435+ number = '6019330047539016'
436+ assert_equal 'creditel' , CreditCard . brand? ( number )
437+ assert CreditCard . valid_number? ( number )
200438 end
201439
202440 def test_16_digit_maestro_uk
203441 number = '6759000000000000'
204442 assert_equal 16 , number . length
205- assert_equal 'switch ' , CreditCard . brand? ( number )
443+ assert_equal 'maestro ' , CreditCard . brand? ( number )
206444 end
207445
208446 def test_18_digit_maestro_uk
209447 number = '675900000000000000'
210448 assert_equal 18 , number . length
211- assert_equal 'switch ' , CreditCard . brand? ( number )
449+ assert_equal 'maestro ' , CreditCard . brand? ( number )
212450 end
213451
214452 def test_19_digit_maestro_uk
215453 number = '6759000000000000000'
216454 assert_equal 19 , number . length
217- assert_equal 'switch' , CreditCard . brand? ( number )
455+ assert_equal 'maestro' , CreditCard . brand? ( number )
456+ end
457+
458+ def test_carnet_cards
459+ numbers = %w[
460+ 5062280000000000
461+ 6046220312312312
462+ 6393889871239871
463+ 5022751231231231
464+ 6275350000000001
465+ ]
466+ numbers . each do |num |
467+ assert_equal 16 , num . length
468+ assert_equal 'carnet' , CreditCard . brand? ( num )
469+ end
470+ end
471+
472+ def test_should_detect_cartes_bancaires_cards
473+ assert_equal 'cartes_bancaires' , CreditCard . brand? ( '5855010000000000' )
474+ assert_equal 'cartes_bancaires' , CreditCard . brand? ( '5075935000000000' )
475+ assert_equal 'cartes_bancaires' , CreditCard . brand? ( '5075901100000000' )
476+ assert_equal 'cartes_bancaires' , CreditCard . brand? ( '5075890130000000' )
218477 end
219478
220479 def test_electron_cards
@@ -230,6 +489,9 @@ def test_electron_cards
230489 end
231490 end
232491
492+ # nil check
493+ assert_false electron_test . call ( nil )
494+
233495 # Visa range
234496 assert_false electron_test . call ( '4245180000000000' )
235497 assert_false electron_test . call ( '4918810000000000' )
@@ -241,7 +503,11 @@ def test_electron_cards
241503 assert_false electron_test . call ( '42496200000000000' )
242504 end
243505
506+ def test_should_detect_panal_card
507+ assert_equal 'panal' , CreditCard . brand? ( '6020490000000000' )
508+ end
509+
244510 def test_credit_card?
245511 assert credit_card . credit_card?
246512 end
247- end
513+ end
0 commit comments