ibandit 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,549 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ibandit::IBAN do
4
+ subject(:iban) { described_class.new(iban_code) }
5
+ let(:iban_code) { 'GB82WEST12345698765432' }
6
+
7
+ its(:iban) { is_expected.to eq(iban_code) }
8
+
9
+ context 'with a poorly formatted IBAN' do
10
+ let(:iban_code) { " gb82 WeSt 1234 5698 7654 32\n" }
11
+ its(:iban) { is_expected.to eq('GB82WEST12345698765432') }
12
+ end
13
+
14
+ context 'with nil' do
15
+ let(:iban_code) { nil }
16
+ its(:iban) { is_expected.to eq('') }
17
+ end
18
+
19
+ describe 'it decomposes the IBAN' do
20
+ its(:country_code) { is_expected.to eq('GB') }
21
+ its(:check_digits) { is_expected.to eq('82') }
22
+ its(:bank_code) { is_expected.to eq('WEST') }
23
+ its(:branch_code) { is_expected.to eq('123456') }
24
+ its(:account_number) { is_expected.to eq('98765432') }
25
+ its(:iban_national_id) { is_expected.to eq('WEST123456') }
26
+ its(:local_check_digits) { is_expected.to eq('') }
27
+
28
+ context 'when the IBAN is blank' do
29
+ let(:iban_code) { '' }
30
+
31
+ its(:country_code) { is_expected.to eq('') }
32
+ its(:check_digits) { is_expected.to eq('') }
33
+ its(:bank_code) { is_expected.to eq('') }
34
+ its(:branch_code) { is_expected.to eq('') }
35
+ its(:account_number) { is_expected.to eq('') }
36
+ its(:iban_national_id) { is_expected.to eq('') }
37
+ its(:bban) { is_expected.to eq('') }
38
+ its(:local_check_digits) { is_expected.to eq('') }
39
+ end
40
+ end
41
+
42
+ describe '#to_s' do
43
+ specify { expect(iban.to_s).to eq('GB82WEST12345698765432') }
44
+ specify { expect(iban.to_s(:compact)).to eq('GB82WEST12345698765432') }
45
+
46
+ it 'returns a prettified string when passed :formatted' do
47
+ expect(iban.to_s(:formatted)).to eq('GB82 WEST 1234 5698 7654 32')
48
+ end
49
+
50
+ specify { expect { iban.to_s(:russian) }.to raise_error ArgumentError }
51
+ end
52
+
53
+ ###############
54
+ # Validations #
55
+ ###############
56
+
57
+ describe '#valid_country_code?' do
58
+ subject { iban.valid_country_code? }
59
+
60
+ context 'with valid details' do
61
+ it { is_expected.to eq(true) }
62
+ end
63
+
64
+ context 'with an unknown country code' do
65
+ let(:iban_code) { 'AA123456789123456' }
66
+ it { is_expected.to eq(false) }
67
+
68
+ it 'sets errors on the IBAN' do
69
+ iban.valid_country_code?
70
+ expect(iban.errors).to include(:country_code)
71
+ end
72
+ end
73
+ end
74
+
75
+ describe '#valid_check_digits?' do
76
+ subject { iban.valid_check_digits? }
77
+
78
+ context 'with valid details' do
79
+ let(:iban_code) { 'GB82WEST12345698765432' }
80
+ it { is_expected.to eq(true) }
81
+
82
+ context 'where the check digit is zero-padded' do
83
+ let(:iban_code) { 'GB06WEST12345698765442' }
84
+ it { is_expected.to eq(true) }
85
+ end
86
+ end
87
+
88
+ context 'with invalid details' do
89
+ let(:iban_code) { 'GB12WEST12345698765432' }
90
+ it { is_expected.to eq(false) }
91
+
92
+ it 'sets errors on the IBAN' do
93
+ iban.valid_check_digits?
94
+ expect(iban.errors).to include(:check_digits)
95
+ end
96
+ end
97
+
98
+ context 'with invalid characters' do
99
+ let(:iban_code) { 'AA82-EST123456987654' }
100
+ it { is_expected.to be_nil }
101
+
102
+ it 'does not set errors on the IBAN' do
103
+ iban.valid_check_digits?
104
+ expect(iban.errors).to_not include(:check_digits)
105
+ end
106
+ end
107
+
108
+ context 'with an empty IBAN' do
109
+ let(:iban_code) { '' }
110
+ it { is_expected.to be_nil }
111
+
112
+ it 'does not set errors on the IBAN' do
113
+ iban.valid_check_digits?
114
+ expect(iban.errors).to_not include(:check_digits)
115
+ end
116
+ end
117
+ end
118
+
119
+ describe '#valid_length?' do
120
+ subject { iban.valid_length? }
121
+
122
+ context 'with valid details' do
123
+ let(:iban_code) { 'GB82WEST12345698765432' }
124
+ it { is_expected.to eq(true) }
125
+ end
126
+
127
+ context 'with invalid details' do
128
+ let(:iban_code) { 'GB82WEST123456987654' }
129
+ it { is_expected.to eq(false) }
130
+
131
+ it 'sets errors on the IBAN' do
132
+ iban.valid_length?
133
+ expect(iban.errors).to include(:length)
134
+ end
135
+ end
136
+
137
+ context 'with an invalid country_code' do
138
+ let(:iban_code) { 'AA82WEST123456987654' }
139
+ it { is_expected.to be_nil }
140
+
141
+ it 'does not set errors on the IBAN' do
142
+ iban.valid_length?
143
+ expect(iban.errors).to_not include(:length)
144
+ end
145
+ end
146
+ end
147
+
148
+ describe '#valid_characters?' do
149
+ subject { iban.valid_characters? }
150
+
151
+ context 'with valid details' do
152
+ let(:iban_code) { 'GB82WEST12345698765432' }
153
+ it { is_expected.to eq(true) }
154
+ end
155
+
156
+ context 'with invalid details' do
157
+ let(:iban_code) { 'GB-123ABCD' }
158
+ it { is_expected.to eq(false) }
159
+
160
+ it 'sets errors on the IBAN' do
161
+ iban.valid_characters?
162
+ expect(iban.errors).to include(:characters)
163
+ end
164
+ end
165
+ end
166
+
167
+ describe '#valid_format?' do
168
+ subject { iban.valid_format? }
169
+
170
+ context 'with valid details' do
171
+ let(:iban_code) { 'GB82WEST12345698765432' }
172
+ it { is_expected.to eq(true) }
173
+ end
174
+
175
+ context 'with invalid details' do
176
+ let(:iban_code) { 'GB82WEST12AAAAAA7654' }
177
+ it { is_expected.to eq(false) }
178
+
179
+ it 'sets errors on the IBAN' do
180
+ iban.valid_format?
181
+ expect(iban.errors).to include(:format)
182
+ end
183
+ end
184
+
185
+ context 'with an invalid country_code' do
186
+ let(:iban_code) { 'AA82WEST12AAAAAA7654' }
187
+ it { is_expected.to be_nil }
188
+
189
+ it 'does not set errors on the IBAN' do
190
+ iban.valid_format?
191
+ expect(iban.errors).to_not include(:format)
192
+ end
193
+ end
194
+ end
195
+
196
+ describe '#valid?' do
197
+ describe 'validations called' do
198
+ after { iban.valid? }
199
+
200
+ specify { expect(iban).to receive(:valid_country_code?).at_least(1) }
201
+ specify { expect(iban).to receive(:valid_characters?).at_least(1) }
202
+ specify { expect(iban).to receive(:valid_check_digits?).at_least(1) }
203
+ specify { expect(iban).to receive(:valid_length?).at_least(1) }
204
+ specify { expect(iban).to receive(:valid_format?).at_least(1) }
205
+ end
206
+
207
+ context 'for a valid Albanian IBAN' do
208
+ let(:iban_code) { 'AL47 2121 1009 0000 0002 3569 8741' }
209
+ it { is_expected.to be_valid }
210
+ end
211
+
212
+ context 'for a valid Andorran IBAN' do
213
+ let(:iban_code) { 'AD12 0001 2030 2003 5910 0100' }
214
+ it { is_expected.to be_valid }
215
+ end
216
+
217
+ context 'for a valid Austrian IBAN' do
218
+ let(:iban_code) { 'AT61 1904 3002 3457 3201' }
219
+ it { is_expected.to be_valid }
220
+ end
221
+
222
+ context 'for a valid Azerbaijanian IBAN' do
223
+ let(:iban_code) { 'AZ21 NABZ 0000 0000 1370 1000 1944' }
224
+ it { is_expected.to be_valid }
225
+ end
226
+
227
+ context 'for a valid Bahrainian IBAN' do
228
+ let(:iban_code) { 'BH67 BMAG 0000 1299 1234 56' }
229
+ it { is_expected.to be_valid }
230
+ end
231
+
232
+ context 'for a valid Belgian IBAN' do
233
+ let(:iban_code) { 'BE62 5100 0754 7061' }
234
+ it { is_expected.to be_valid }
235
+ end
236
+
237
+ context 'for a valid Bosnian IBAN' do
238
+ let(:iban_code) { 'BA39 1290 0794 0102 8494' }
239
+ it { is_expected.to be_valid }
240
+ end
241
+
242
+ context 'for a valid Bulgarian IBAN' do
243
+ let(:iban_code) { 'BG80 BNBG 9661 1020 3456 78' }
244
+ it { is_expected.to be_valid }
245
+ end
246
+
247
+ context 'for a valid Croatian IBAN' do
248
+ let(:iban_code) { 'HR12 1001 0051 8630 0016 0' }
249
+ it { is_expected.to be_valid }
250
+ end
251
+
252
+ context 'for a valid Cypriot IBAN' do
253
+ let(:iban_code) { 'CY17 0020 0128 0000 0012 0052 7600' }
254
+ it { is_expected.to be_valid }
255
+ end
256
+
257
+ context 'for a valid Czech IBAN' do
258
+ let(:iban_code) { 'CZ65 0800 0000 1920 0014 5399' }
259
+ it { is_expected.to be_valid }
260
+ end
261
+
262
+ context 'for a valid Danish IBAN' do
263
+ let(:iban_code) { 'DK50 0040 0440 1162 43' }
264
+ it { is_expected.to be_valid }
265
+ end
266
+
267
+ context 'for a valid Estonian IBAN' do
268
+ let(:iban_code) { 'EE38 2200 2210 2014 5685' }
269
+ it { is_expected.to be_valid }
270
+ end
271
+
272
+ context 'for a valid Faroe Islands IBAN' do
273
+ let(:iban_code) { 'FO97 5432 0388 8999 44' }
274
+ it { is_expected.to be_valid }
275
+ end
276
+
277
+ context 'for a valid Finnish IBAN' do
278
+ let(:iban_code) { 'FI21 1234 5600 0007 85' }
279
+ it { is_expected.to be_valid }
280
+ end
281
+
282
+ context 'for a valid French IBAN' do
283
+ let(:iban_code) { 'FR14 2004 1010 0505 0001 3M02 606' }
284
+ it { is_expected.to be_valid }
285
+ end
286
+
287
+ context 'for a valid Georgian IBAN' do
288
+ let(:iban_code) { 'GE29 NB00 0000 0101 9049 17' }
289
+ it { is_expected.to be_valid }
290
+ end
291
+
292
+ context 'for a valid German IBAN' do
293
+ let(:iban_code) { 'DE89 3704 0044 0532 0130 00' }
294
+ it { is_expected.to be_valid }
295
+ end
296
+
297
+ context 'for a valid Gibraltan IBAN' do
298
+ let(:iban_code) { 'GI75 NWBK 0000 0000 7099 453' }
299
+ it { is_expected.to be_valid }
300
+ end
301
+
302
+ context 'for a valid Greek IBAN' do
303
+ let(:iban_code) { 'GR16 0110 1250 0000 0001 2300 695' }
304
+ it { is_expected.to be_valid }
305
+ end
306
+
307
+ context 'for a valid Greenland IBAN' do
308
+ let(:iban_code) { 'GL56 0444 9876 5432 10' }
309
+ it { is_expected.to be_valid }
310
+ end
311
+
312
+ context 'for a valid Hungarian IBAN' do
313
+ let(:iban_code) { 'HU42 1177 3016 1111 1018 0000 0000' }
314
+ it { is_expected.to be_valid }
315
+ end
316
+
317
+ context 'for a valid Icelandic IBAN' do
318
+ let(:iban_code) { 'IS14 0159 2600 7654 5510 7303 39' }
319
+ it { is_expected.to be_valid }
320
+ end
321
+
322
+ context 'for a valid Irish IBAN' do
323
+ let(:iban_code) { 'IE29 AIBK 9311 5212 3456 78' }
324
+ it { is_expected.to be_valid }
325
+ end
326
+
327
+ context 'for a valid Israeli IBAN' do
328
+ let(:iban_code) { 'IL62 0108 0000 0009 9999 999' }
329
+ it { is_expected.to be_valid }
330
+ end
331
+
332
+ context 'for a valid Italian IBAN' do
333
+ let(:iban_code) { 'IT40 S054 2811 1010 0000 0123 456' }
334
+ it { is_expected.to be_valid }
335
+ end
336
+
337
+ context 'for a valid Jordanian IBAN' do
338
+ let(:iban_code) { 'JO94 CBJO 0010 0000 0000 0131 0003 02' }
339
+ it { is_expected.to be_valid }
340
+ end
341
+
342
+ context 'for a valid Kuwaiti IBAN' do
343
+ let(:iban_code) { 'KW81 CBKU 0000 0000 0000 1234 5601 01' }
344
+ it { is_expected.to be_valid }
345
+ end
346
+
347
+ context 'for a valid Latvian IBAN' do
348
+ let(:iban_code) { 'LV80 BANK 0000 4351 9500 1' }
349
+ it { is_expected.to be_valid }
350
+ end
351
+
352
+ context 'for a valid Lebanese IBAN' do
353
+ let(:iban_code) { 'LB62 0999 0000 0001 0019 0122 9114' }
354
+ it { is_expected.to be_valid }
355
+ end
356
+
357
+ context 'for a valid Liechtensteinian IBAN' do
358
+ let(:iban_code) { 'LI21 0881 0000 2324 013A A' }
359
+ it { is_expected.to be_valid }
360
+ end
361
+
362
+ context 'for a valid Lithuanian IBAN' do
363
+ let(:iban_code) { 'LT12 1000 0111 0100 1000' }
364
+ it { is_expected.to be_valid }
365
+ end
366
+
367
+ context 'for a valid Luxembourgian IBAN' do
368
+ let(:iban_code) { 'LU28 0019 4006 4475 0000' }
369
+ it { is_expected.to be_valid }
370
+ end
371
+
372
+ context 'for a valid Macedonian IBAN' do
373
+ let(:iban_code) { 'MK072 5012 0000 0589 84' }
374
+ it { is_expected.to be_valid }
375
+ end
376
+
377
+ context 'for a valid Maltese IBAN' do
378
+ let(:iban_code) { 'MT84 MALT 0110 0001 2345 MTLC AST0 01S' }
379
+ it { is_expected.to be_valid }
380
+ end
381
+
382
+ context 'for a valid Maurititanian IBAN' do
383
+ let(:iban_code) { 'MU17 BOMM 0101 1010 3030 0200 000M UR' }
384
+ it { is_expected.to be_valid }
385
+ end
386
+
387
+ context 'for a valid Moldovan IBAN' do
388
+ let(:iban_code) { 'MD24 AG00 0225 1000 1310 4168' }
389
+ it { is_expected.to be_valid }
390
+ end
391
+
392
+ context 'for a valid Monocan IBAN' do
393
+ let(:iban_code) { 'MC93 2005 2222 1001 1223 3M44 555' }
394
+ it { is_expected.to be_valid }
395
+ end
396
+
397
+ context 'for a valid Montenegrian IBAN' do
398
+ let(:iban_code) { 'ME25 5050 0001 2345 6789 51' }
399
+ it { is_expected.to be_valid }
400
+ end
401
+
402
+ context 'for a valid Dutch IBAN' do
403
+ let(:iban_code) { 'NL39 RABO 0300 0652 64' }
404
+ it { is_expected.to be_valid }
405
+ end
406
+
407
+ context 'for a valid Norwegian IBAN' do
408
+ let(:iban_code) { 'NO93 8601 1117 947' }
409
+ it { is_expected.to be_valid }
410
+ end
411
+
412
+ context 'for a valid Pakistani IBAN' do
413
+ let(:iban_code) { 'PK36 SCBL 0000 0011 2345 6702' }
414
+ it { is_expected.to be_valid }
415
+ end
416
+
417
+ context 'for a valid Polish IBAN' do
418
+ let(:iban_code) { 'PL60 1020 1026 0000 0422 7020 1111' }
419
+ it { is_expected.to be_valid }
420
+ end
421
+
422
+ context 'for a valid Potuguese IBAN' do
423
+ let(:iban_code) { 'PT50 0002 0123 1234 5678 9015 4' }
424
+ it { is_expected.to be_valid }
425
+ end
426
+
427
+ context 'for a valid Qatari IBAN' do
428
+ let(:iban_code) { 'QA58 DOHB 0000 1234 5678 90AB CDEF G' }
429
+ it { is_expected.to be_valid }
430
+ end
431
+
432
+ context 'for a valid Romanian IBAN' do
433
+ let(:iban_code) { 'RO49 AAAA 1B31 0075 9384 0000' }
434
+ it { is_expected.to be_valid }
435
+ end
436
+
437
+ context 'for a valid San Marinian IBAN' do
438
+ let(:iban_code) { 'SM86 U032 2509 8000 0000 0270 100' }
439
+ it { is_expected.to be_valid }
440
+ end
441
+
442
+ context 'for a valid Saudi IBAN' do
443
+ let(:iban_code) { 'SA03 8000 0000 6080 1016 7519' }
444
+ it { is_expected.to be_valid }
445
+ end
446
+
447
+ context 'for a valid Serbian IBAN' do
448
+ let(:iban_code) { 'RS35 2600 0560 1001 6113 79' }
449
+ it { is_expected.to be_valid }
450
+ end
451
+
452
+ context 'for a valid Slovakian IBAN' do
453
+ let(:iban_code) { 'SK31 1200 0000 1987 4263 7541' }
454
+ it { is_expected.to be_valid }
455
+ end
456
+
457
+ context 'for a valid Slovenian IBAN' do
458
+ let(:iban_code) { 'SI56 1910 0000 0123 438' }
459
+ it { is_expected.to be_valid }
460
+ end
461
+
462
+ context 'for a valid Spanish IBAN' do
463
+ let(:iban_code) { 'ES80 2310 0001 1800 0001 2345' }
464
+ it { is_expected.to be_valid }
465
+ end
466
+
467
+ context 'for a valid Swedish IBAN' do
468
+ let(:iban_code) { 'SE35 5000 0000 0549 1000 0003' }
469
+ it { is_expected.to be_valid }
470
+ end
471
+
472
+ context 'for a valid Swiss IBAN' do
473
+ let(:iban_code) { 'CH93 0076 2011 6238 5295 7' }
474
+ it { is_expected.to be_valid }
475
+ end
476
+
477
+ context 'for a valid Tunisian IBAN' do
478
+ let(:iban_code) { 'TN59 1000 6035 1835 9847 8831' }
479
+ it { is_expected.to be_valid }
480
+ end
481
+
482
+ context 'for a valid Turkish IBAN' do
483
+ let(:iban_code) { 'TR33 0006 1005 1978 6457 8413 26' }
484
+ it { is_expected.to be_valid }
485
+ end
486
+
487
+ context 'for a valid UAE IBAN' do
488
+ let(:iban_code) { 'AE07 0331 2345 6789 0123 456' }
489
+ it { is_expected.to be_valid }
490
+ end
491
+
492
+ context 'for a valid UK IBAN' do
493
+ let(:iban_code) { 'GB82 WEST 1234 5698 7654 32' }
494
+ it { is_expected.to be_valid }
495
+ end
496
+ end
497
+
498
+ describe '#local_check_digits' do
499
+ context 'with a Belgian IBAN' do
500
+ let(:iban_code) { 'BE62510007547061' }
501
+ its(:local_check_digits) { is_expected.to eq('61') }
502
+ end
503
+
504
+ context 'with a French IBAN' do
505
+ let(:iban_code) { 'FR1234567890123456789012345' }
506
+ its(:local_check_digits) { is_expected.to eq('45') }
507
+ end
508
+
509
+ context 'with a Monocan IBAN' do
510
+ let(:iban_code) { 'MC9320052222100112233M44555' }
511
+ its(:local_check_digits) { is_expected.to eq('55') }
512
+ end
513
+
514
+ context 'with a Spanish IBAN' do
515
+ let(:iban_code) { 'ES1212345678911234567890' }
516
+ its(:local_check_digits) { is_expected.to eq('91') }
517
+ end
518
+
519
+ context 'with an Italian IBAN' do
520
+ let(:iban_code) { 'IT12A1234567890123456789012' }
521
+ its(:local_check_digits) { is_expected.to eq('A') }
522
+ end
523
+
524
+ context 'with an Estonian IBAN' do
525
+ let(:iban_code) { 'EE382200221020145685' }
526
+ its(:local_check_digits) { is_expected.to eq('5') }
527
+ end
528
+
529
+ context 'with an Finnish IBAN' do
530
+ let(:iban_code) { 'FI2112345600000785' }
531
+ its(:local_check_digits) { is_expected.to eq('5') }
532
+ end
533
+
534
+ context 'with an Portuguese IBAN' do
535
+ let(:iban_code) { 'PT50000201231234567890154' }
536
+ its(:local_check_digits) { is_expected.to eq('54') }
537
+ end
538
+
539
+ context 'with a Slovakian IBAN' do
540
+ let(:iban_code) { 'SK3112000000198742637541' }
541
+ its(:local_check_digits) { is_expected.to eq('9') }
542
+ end
543
+
544
+ context 'with a Dutch IBAN' do
545
+ let(:iban_code) { 'NL91ABNA0417164300' }
546
+ its(:local_check_digits) { is_expected.to eq('0') }
547
+ end
548
+ end
549
+ end