ibandit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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