ibandit 0.11.6 → 0.11.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +7 -6
- data/.rubocop_todo.yml +4 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +8 -0
- data/README.md +90 -30
- data/data/structures.yml +9 -0
- data/ibandit.gemspec +23 -19
- data/lib/ibandit.rb +18 -18
- data/lib/ibandit/check_digit.rb +8 -8
- data/lib/ibandit/constants.rb +14 -5
- data/lib/ibandit/german_details_converter.rb +598 -598
- data/lib/ibandit/iban.rb +90 -37
- data/lib/ibandit/iban_assembler.rb +15 -13
- data/lib/ibandit/iban_splitter.rb +4 -4
- data/lib/ibandit/local_details_cleaner.rb +94 -85
- data/lib/ibandit/pseudo_iban_assembler.rb +2 -2
- data/lib/ibandit/pseudo_iban_splitter.rb +15 -25
- data/lib/ibandit/sweden/bank_lookup.rb +1 -1
- data/lib/ibandit/sweden/local_details_converter.rb +7 -7
- data/lib/ibandit/sweden/validator.rb +5 -5
- data/lib/ibandit/version.rb +1 -1
- data/spec/ibandit/german_details_converter_spec.rb +23 -22
- data/spec/ibandit/iban_assembler_spec.rb +310 -310
- data/spec/ibandit/iban_spec.rb +1087 -712
- data/spec/ibandit/iban_splitter_spec.rb +14 -14
- data/spec/ibandit/local_details_cleaner_spec.rb +473 -452
- data/spec/ibandit/pseudo_iban_assembler_spec.rb +54 -18
- data/spec/ibandit/pseudo_iban_splitter_spec.rb +13 -22
- data/spec/ibandit/structure_spec.rb +3 -3
- data/spec/ibandit/sweden/local_details_converter_spec.rb +125 -125
- data/spec/ibandit/sweden/validator_spec.rb +88 -88
- data/spec/spec_helper.rb +10 -10
- metadata +48 -20
@@ -18,7 +18,7 @@ module Ibandit
|
|
18
18
|
Constants::PSEUDO_IBAN_CHECK_DIGITS,
|
19
19
|
padded_bank_code,
|
20
20
|
padded_branch_code,
|
21
|
-
padded_account_number
|
21
|
+
padded_account_number,
|
22
22
|
].join
|
23
23
|
end
|
24
24
|
|
@@ -67,7 +67,7 @@ module Ibandit
|
|
67
67
|
|
68
68
|
def pad(number, length_key)
|
69
69
|
return if number.nil?
|
70
|
-
number.rjust(structure[length_key],
|
70
|
+
number.rjust(structure[length_key], "X")
|
71
71
|
end
|
72
72
|
|
73
73
|
def structure
|
@@ -5,45 +5,48 @@ module Ibandit
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def split
|
8
|
-
return unless decomposable?
|
9
|
-
|
10
8
|
{
|
11
9
|
country_code: country_code,
|
10
|
+
check_digits: check_digits,
|
12
11
|
bank_code: bank_code,
|
13
12
|
branch_code: branch_code,
|
14
|
-
account_number: account_number
|
13
|
+
account_number: account_number,
|
15
14
|
}
|
16
15
|
end
|
17
16
|
|
18
|
-
private
|
19
|
-
|
20
17
|
def country_code
|
21
18
|
@pseudo_iban.slice(0, 2)
|
22
19
|
end
|
23
20
|
|
21
|
+
private
|
22
|
+
|
24
23
|
def check_digits
|
25
24
|
@pseudo_iban.slice(2, 2)
|
26
25
|
end
|
27
26
|
|
28
27
|
def bank_code
|
28
|
+
return unless country_code_valid?
|
29
29
|
pseudo_iban_part(bank_code_start_index, :pseudo_iban_bank_code_length)
|
30
30
|
end
|
31
31
|
|
32
32
|
def branch_code
|
33
|
+
return unless country_code_valid?
|
33
34
|
pseudo_iban_part(branch_code_start_index,
|
34
35
|
:pseudo_iban_branch_code_length)
|
35
36
|
end
|
36
37
|
|
37
38
|
def account_number
|
38
|
-
|
39
|
-
|
39
|
+
return unless country_code_valid?
|
40
|
+
remove_leading_padding(
|
41
|
+
@pseudo_iban.slice(account_number_start_index, @pseudo_iban.length),
|
42
|
+
)
|
40
43
|
end
|
41
44
|
|
42
45
|
def pseudo_iban_part(start_index, length_key)
|
43
46
|
length = structure.fetch(length_key)
|
44
47
|
return if length == 0
|
45
48
|
|
46
|
-
@pseudo_iban.slice(start_index, length)
|
49
|
+
remove_leading_padding(@pseudo_iban.slice(start_index, length))
|
47
50
|
end
|
48
51
|
|
49
52
|
def bank_code_start_index
|
@@ -58,29 +61,16 @@ module Ibandit
|
|
58
61
|
branch_code_start_index + structure.fetch(:pseudo_iban_branch_code_length)
|
59
62
|
end
|
60
63
|
|
61
|
-
def expected_length
|
62
|
-
account_number_start_index +
|
63
|
-
structure.fetch(:pseudo_iban_account_number_length)
|
64
|
-
end
|
65
|
-
|
66
|
-
def decomposable?
|
67
|
-
country_code_valid? && check_digits_valid? && correct_length?
|
68
|
-
end
|
69
|
-
|
70
64
|
def country_code_valid?
|
71
65
|
Constants::PSEUDO_IBAN_COUNTRY_CODES.include?(country_code)
|
72
66
|
end
|
73
67
|
|
74
|
-
def check_digits_valid?
|
75
|
-
check_digits == Constants::PSEUDO_IBAN_CHECK_DIGITS
|
76
|
-
end
|
77
|
-
|
78
|
-
def correct_length?
|
79
|
-
@pseudo_iban.length == expected_length
|
80
|
-
end
|
81
|
-
|
82
68
|
def structure
|
83
69
|
Ibandit.structures[country_code]
|
84
70
|
end
|
71
|
+
|
72
|
+
def remove_leading_padding(input)
|
73
|
+
input.gsub(/\AX+/, "")
|
74
|
+
end
|
85
75
|
end
|
86
76
|
end
|
@@ -13,7 +13,7 @@ module Ibandit
|
|
13
13
|
def self.bank_info_table
|
14
14
|
@swedish_bank_lookup ||=
|
15
15
|
begin
|
16
|
-
relative_path =
|
16
|
+
relative_path = "../../../../data/raw/swedish_bank_lookup.yml"
|
17
17
|
raw_info = YAML.load_file(File.expand_path(relative_path, __FILE__))
|
18
18
|
|
19
19
|
raw_info.map { |bank| bank.merge(range: Range.new(*bank[:range])) }
|
@@ -19,14 +19,14 @@ module Ibandit
|
|
19
19
|
def convert
|
20
20
|
if bank_info.nil?
|
21
21
|
return { swift_bank_code: nil,
|
22
|
-
swift_account_number: cleaned_account_number.rjust(17,
|
22
|
+
swift_account_number: cleaned_account_number.rjust(17, "0") }
|
23
23
|
end
|
24
24
|
|
25
25
|
{
|
26
26
|
account_number: serial_number,
|
27
27
|
branch_code: clearing_code,
|
28
28
|
swift_bank_code: bank_info.fetch(:bank_code).to_s,
|
29
|
-
swift_account_number: swift_account_number
|
29
|
+
swift_account_number: swift_account_number,
|
30
30
|
}
|
31
31
|
end
|
32
32
|
|
@@ -44,7 +44,7 @@ module Ibandit
|
|
44
44
|
|
45
45
|
def remove_bad_chars(number)
|
46
46
|
return if number.nil?
|
47
|
-
number.gsub(/[-.\s]/,
|
47
|
+
number.gsub(/[-.\s]/, "")
|
48
48
|
end
|
49
49
|
|
50
50
|
def bank_info
|
@@ -76,15 +76,15 @@ module Ibandit
|
|
76
76
|
end
|
77
77
|
|
78
78
|
return serial_number unless bank_info.fetch(:zerofill_serial_number)
|
79
|
-
serial_number && serial_number.rjust(serial_number_length,
|
79
|
+
serial_number && serial_number.rjust(serial_number_length, "0")
|
80
80
|
end
|
81
81
|
|
82
82
|
def swift_account_number
|
83
83
|
if bank_info.fetch(:include_clearing_code) &&
|
84
|
-
|
85
|
-
(clearing_code + serial_number).rjust(17,
|
84
|
+
clearing_code && serial_number
|
85
|
+
(clearing_code + serial_number).rjust(17, "0")
|
86
86
|
else
|
87
|
-
serial_number && serial_number.rjust(17,
|
87
|
+
serial_number && serial_number.rjust(17, "0")
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
@@ -25,7 +25,7 @@ module Ibandit
|
|
25
25
|
serial_number_length = bank_info.fetch(:serial_number_length)
|
26
26
|
|
27
27
|
if bank_info.fetch(:zerofill_serial_number)
|
28
|
-
serial_number = serial_number.rjust(serial_number_length,
|
28
|
+
serial_number = serial_number.rjust(serial_number_length, "0")
|
29
29
|
end
|
30
30
|
|
31
31
|
serial_number_length == serial_number.to_s.length
|
@@ -43,7 +43,7 @@ module Ibandit
|
|
43
43
|
account_number: nil)
|
44
44
|
return unless bank_code_exists?(bank_code)
|
45
45
|
|
46
|
-
clearing_code = account_number.gsub(/\A0+/,
|
46
|
+
clearing_code = account_number.gsub(/\A0+/, "").slice(0, 4).to_i
|
47
47
|
Sweden::BankLookup.for_bank_code(bank_code).any? do |bank|
|
48
48
|
!bank[:include_clearing_code] || bank[:range].include?(clearing_code)
|
49
49
|
end
|
@@ -53,7 +53,7 @@ module Ibandit
|
|
53
53
|
account_number: nil)
|
54
54
|
bank_code_possible = bank_code_possible_for_account_number?(
|
55
55
|
bank_code: bank_code,
|
56
|
-
account_number: account_number
|
56
|
+
account_number: account_number,
|
57
57
|
)
|
58
58
|
return unless bank_code_possible
|
59
59
|
|
@@ -61,11 +61,11 @@ module Ibandit
|
|
61
61
|
length = bank.fetch(:serial_number_length)
|
62
62
|
length += bank[:clearing_code_length] if bank[:include_clearing_code]
|
63
63
|
|
64
|
-
cleaned_account_number = account_number.gsub(/\A0+/,
|
64
|
+
cleaned_account_number = account_number.gsub(/\A0+/, "")
|
65
65
|
if bank[:zerofill_serial_number] && !bank[:include_clearing_code]
|
66
66
|
cleaned_account_number =
|
67
67
|
cleaned_account_number.
|
68
|
-
|
68
|
+
rjust(bank.fetch(:serial_number_length), "0")
|
69
69
|
end
|
70
70
|
|
71
71
|
cleaned_account_number.length == length
|
data/lib/ibandit/version.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Ibandit::GermanDetailsConverter do
|
4
|
-
shared_examples
|
4
|
+
shared_examples "json based fixture" do |json_fixture_file|
|
5
5
|
json_fixture(json_fixture_file).each do |convertor|
|
6
6
|
context "Rule #{convertor['convertor']}" do
|
7
7
|
let(:klass) do
|
@@ -15,35 +15,36 @@ describe Ibandit::GermanDetailsConverter do
|
|
15
15
|
and_call_original
|
16
16
|
end
|
17
17
|
|
18
|
-
convertor.fetch(
|
18
|
+
convertor.fetch("valid", []).each do |tuple|
|
19
19
|
context "bank code: #{tuple['bank_code']} account number " \
|
20
20
|
"#{tuple['account_number']}" do
|
21
21
|
let(:bank_code) do
|
22
|
-
tuple[
|
22
|
+
tuple["bank_code"]
|
23
23
|
end
|
24
24
|
let(:account_number) do
|
25
|
-
tuple[
|
25
|
+
tuple["account_number"]
|
26
26
|
end
|
27
27
|
let(:converted_bank_code) do
|
28
|
-
tuple[
|
28
|
+
tuple["converted_bank_code"] || bank_code
|
29
29
|
end
|
30
30
|
let(:converted_account_number) do
|
31
|
-
tuple[
|
31
|
+
tuple["converted_account_number"] || account_number
|
32
32
|
end
|
33
33
|
it do
|
34
34
|
is_expected.to eq(
|
35
35
|
bank_code: converted_bank_code,
|
36
|
-
account_number: converted_account_number
|
36
|
+
account_number: converted_account_number,
|
37
|
+
)
|
37
38
|
end
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
41
|
-
convertor.fetch(
|
42
|
+
convertor.fetch("invalid", []).each do |tuple|
|
42
43
|
context "bank code: #{tuple['bank_code']} account number " \
|
43
44
|
"#{tuple['account_number']}" do
|
44
|
-
let(:bank_code) { tuple[
|
45
|
-
let(:account_number) { tuple[
|
46
|
-
it
|
45
|
+
let(:bank_code) { tuple["bank_code"] || "00000000" }
|
46
|
+
let(:account_number) { tuple["account_number"] }
|
47
|
+
it "raises UnsupportedAccountDetails" do
|
47
48
|
expect { subject }.
|
48
49
|
to raise_error(Ibandit::UnsupportedAccountDetails)
|
49
50
|
end
|
@@ -53,8 +54,8 @@ describe Ibandit::GermanDetailsConverter do
|
|
53
54
|
end
|
54
55
|
end
|
55
56
|
|
56
|
-
describe
|
57
|
-
include_examples
|
57
|
+
describe "integration tests" do
|
58
|
+
include_examples "json based fixture", "germany_integration_test_cases" do
|
58
59
|
let(:test_subject) do
|
59
60
|
described_class.
|
60
61
|
convert(bank_code: bank_code, account_number: account_number)
|
@@ -62,8 +63,8 @@ describe Ibandit::GermanDetailsConverter do
|
|
62
63
|
end
|
63
64
|
end
|
64
65
|
|
65
|
-
describe
|
66
|
-
include_examples
|
66
|
+
describe "unit tests" do
|
67
|
+
include_examples "json based fixture", "germany_unit_test_cases" do
|
67
68
|
let(:test_subject) do
|
68
69
|
klass.new(bank_code, account_number).converted_details
|
69
70
|
end
|
@@ -74,25 +75,25 @@ describe Ibandit::GermanDetailsConverter do
|
|
74
75
|
subject { described_class.new(account_number) }
|
75
76
|
|
76
77
|
# Test cases taken from the IBAN Rules definitions document
|
77
|
-
valid_account_numbers = %w
|
78
|
+
valid_account_numbers = %w[
|
78
79
|
38150900 600103660 39101181 5600200 75269100 3700246 6723143
|
79
80
|
5719083 571908300 8007759 800775900 350002200 900004300
|
80
|
-
|
81
|
+
]
|
81
82
|
|
82
|
-
invalid_account_numbers = %w
|
83
|
+
invalid_account_numbers = %w[
|
83
84
|
370024600 672314300 3500022 9000043 123456700 94012341 94012341
|
84
85
|
5073321010 1234517892 987614325
|
85
|
-
|
86
|
+
]
|
86
87
|
|
87
88
|
valid_account_numbers.each do |number|
|
88
|
-
context
|
89
|
+
context number.to_s do
|
89
90
|
let(:account_number) { number }
|
90
91
|
it { is_expected.to be_valid }
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
94
95
|
invalid_account_numbers.each do |number|
|
95
|
-
context
|
96
|
+
context number.to_s do
|
96
97
|
let(:account_number) { number }
|
97
98
|
it { is_expected.to_not be_valid }
|
98
99
|
end
|
@@ -1,901 +1,901 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Ibandit::IBANAssembler do
|
4
|
-
shared_examples_for
|
4
|
+
shared_examples_for "allows round trips" do |iban_code|
|
5
5
|
let(:iban) { Ibandit::IBAN.new(iban_code) }
|
6
6
|
let(:args) do
|
7
7
|
{
|
8
8
|
country_code: iban.country_code,
|
9
9
|
account_number: iban.swift_account_number,
|
10
10
|
branch_code: iban.swift_branch_code,
|
11
|
-
bank_code: iban.swift_bank_code
|
11
|
+
bank_code: iban.swift_bank_code,
|
12
12
|
}.reject { |_key, value| value.nil? }
|
13
13
|
end
|
14
14
|
|
15
|
-
it
|
15
|
+
it "successfully reconstructs the IBAN" do
|
16
16
|
expect(described_class.assemble(args)).to eq(iban.iban)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
describe
|
20
|
+
describe ".assemble" do
|
21
21
|
subject(:assemble) { described_class.assemble(args) }
|
22
|
-
let(:args) { { country_code:
|
22
|
+
let(:args) { { country_code: "ES" } }
|
23
23
|
|
24
|
-
context
|
24
|
+
context "without a country_code" do
|
25
25
|
let(:args) { { bank_code: 1 } }
|
26
26
|
it { is_expected.to be_nil }
|
27
27
|
end
|
28
28
|
|
29
|
-
context
|
30
|
-
let(:args) { { country_code:
|
29
|
+
context "with an unsupported country_code" do
|
30
|
+
let(:args) { { country_code: "FU" } }
|
31
31
|
it { is_expected.to be_nil }
|
32
32
|
end
|
33
33
|
|
34
|
-
context
|
34
|
+
context "with AT as the country_code" do
|
35
35
|
let(:args) do
|
36
36
|
{
|
37
|
-
country_code:
|
38
|
-
account_number:
|
39
|
-
bank_code:
|
37
|
+
country_code: "AT",
|
38
|
+
account_number: "00234573201",
|
39
|
+
bank_code: "19043",
|
40
40
|
}
|
41
41
|
end
|
42
42
|
|
43
|
-
it { is_expected.to eq(
|
43
|
+
it { is_expected.to eq("AT611904300234573201") }
|
44
44
|
|
45
|
-
it_behaves_like
|
45
|
+
it_behaves_like "allows round trips", "AT61 1904 3002 3457 3201"
|
46
46
|
|
47
|
-
context
|
47
|
+
context "without an account_number" do
|
48
48
|
before { args.delete(:account_number) }
|
49
49
|
it { is_expected.to be_nil }
|
50
50
|
end
|
51
51
|
|
52
|
-
context
|
52
|
+
context "without an bank_code" do
|
53
53
|
before { args.delete(:bank_code) }
|
54
54
|
it { is_expected.to be_nil }
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
context
|
59
|
-
let(:args) { { country_code:
|
58
|
+
context "with BE as the country_code" do
|
59
|
+
let(:args) { { country_code: "BE", account_number: "510007547061" } }
|
60
60
|
|
61
|
-
it { is_expected.to eq(
|
61
|
+
it { is_expected.to eq("BE62510007547061") }
|
62
62
|
|
63
|
-
it_behaves_like
|
63
|
+
it_behaves_like "allows round trips", "BE62 5100 0754 7061"
|
64
64
|
|
65
|
-
context
|
65
|
+
context "without an account_number" do
|
66
66
|
before { args.delete(:account_number) }
|
67
67
|
it { is_expected.to be_nil }
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
-
context
|
71
|
+
context "with BG as the country_code" do
|
72
72
|
let(:args) do
|
73
73
|
{
|
74
|
-
country_code:
|
75
|
-
account_number:
|
76
|
-
bank_code:
|
77
|
-
branch_code:
|
74
|
+
country_code: "BG",
|
75
|
+
account_number: "1020345678",
|
76
|
+
bank_code: "BNBG",
|
77
|
+
branch_code: "9661",
|
78
78
|
}
|
79
79
|
end
|
80
80
|
|
81
|
-
it { is_expected.to eq(
|
81
|
+
it { is_expected.to eq("BG80BNBG96611020345678") }
|
82
82
|
|
83
|
-
it_behaves_like
|
83
|
+
it_behaves_like "allows round trips", "BG80 BNBG 9661 1020 3456 78"
|
84
84
|
|
85
|
-
context
|
85
|
+
context "without an account_number" do
|
86
86
|
before { args.delete(:account_number) }
|
87
87
|
it { is_expected.to be_nil }
|
88
88
|
end
|
89
89
|
|
90
|
-
context
|
90
|
+
context "without a bank_code" do
|
91
91
|
before { args.delete(:bank_code) }
|
92
92
|
it { is_expected.to be_nil }
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
-
context
|
96
|
+
context "with CY as the country_code" do
|
97
97
|
let(:args) do
|
98
98
|
{
|
99
|
-
country_code:
|
100
|
-
account_number:
|
101
|
-
bank_code:
|
102
|
-
branch_code:
|
99
|
+
country_code: "CY",
|
100
|
+
account_number: "0000001200527600",
|
101
|
+
bank_code: "002",
|
102
|
+
branch_code: "00128",
|
103
103
|
}
|
104
104
|
end
|
105
105
|
|
106
|
-
it { is_expected.to eq(
|
106
|
+
it { is_expected.to eq("CY17002001280000001200527600") }
|
107
107
|
|
108
|
-
it_behaves_like
|
108
|
+
it_behaves_like "allows round trips", "CY17 0020 0128 0000 0012 0052 7600"
|
109
109
|
|
110
|
-
context
|
110
|
+
context "without an branch_code" do
|
111
111
|
before { args.delete(:branch_code) }
|
112
|
-
it { is_expected.to eq(
|
112
|
+
it { is_expected.to eq("CY040020000001200527600") }
|
113
113
|
end
|
114
114
|
|
115
|
-
context
|
115
|
+
context "without an account_number" do
|
116
116
|
before { args.delete(:account_number) }
|
117
117
|
it { is_expected.to be_nil }
|
118
118
|
end
|
119
119
|
|
120
|
-
context
|
120
|
+
context "without an bank_code" do
|
121
121
|
before { args.delete(:bank_code) }
|
122
122
|
it { is_expected.to be_nil }
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
|
-
context
|
126
|
+
context "with CZ as the country_code" do
|
127
127
|
let(:args) do
|
128
128
|
{
|
129
|
-
country_code:
|
130
|
-
bank_code:
|
131
|
-
account_number:
|
129
|
+
country_code: "CZ",
|
130
|
+
bank_code: "0800",
|
131
|
+
account_number: "0000192000145399",
|
132
132
|
}
|
133
133
|
end
|
134
134
|
|
135
|
-
it { is_expected.to eq(
|
135
|
+
it { is_expected.to eq("CZ6508000000192000145399") }
|
136
136
|
|
137
|
-
it_behaves_like
|
137
|
+
it_behaves_like "allows round trips", "CZ65 0800 0000 1920 0014 5399"
|
138
138
|
|
139
|
-
context
|
139
|
+
context "without a bank_code" do
|
140
140
|
before { args.delete(:bank_code) }
|
141
141
|
it { is_expected.to be_nil }
|
142
142
|
end
|
143
143
|
|
144
|
-
context
|
144
|
+
context "without an account_number" do
|
145
145
|
before { args.delete(:account_number) }
|
146
146
|
it { is_expected.to be_nil }
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
150
|
-
context
|
150
|
+
context "with DE as the country_code" do
|
151
151
|
let(:args) do
|
152
|
-
{ country_code:
|
153
|
-
bank_code:
|
154
|
-
account_number:
|
152
|
+
{ country_code: "DE",
|
153
|
+
bank_code: "37040044",
|
154
|
+
account_number: "0532013000" }
|
155
155
|
end
|
156
156
|
|
157
|
-
it { is_expected.to eq(
|
157
|
+
it { is_expected.to eq("DE89370400440532013000") }
|
158
158
|
|
159
|
-
it_behaves_like
|
159
|
+
it_behaves_like "allows round trips", "DE89 3704 0044 0532 0130 00"
|
160
160
|
|
161
|
-
context
|
161
|
+
context "without a bank_code" do
|
162
162
|
before { args.delete(:bank_code) }
|
163
163
|
it { is_expected.to be_nil }
|
164
164
|
end
|
165
165
|
|
166
|
-
context
|
166
|
+
context "without an account_number" do
|
167
167
|
before { args.delete(:account_number) }
|
168
168
|
it { is_expected.to be_nil }
|
169
169
|
end
|
170
170
|
end
|
171
171
|
|
172
|
-
context
|
172
|
+
context "with DK as the country_code" do
|
173
173
|
let(:args) do
|
174
|
-
{ country_code:
|
175
|
-
bank_code:
|
176
|
-
account_number:
|
174
|
+
{ country_code: "DK",
|
175
|
+
bank_code: "1199",
|
176
|
+
account_number: "0003179680" }
|
177
177
|
end
|
178
178
|
|
179
|
-
it { is_expected.to eq(
|
179
|
+
it { is_expected.to eq("DK2411990003179680") }
|
180
180
|
|
181
|
-
it_behaves_like
|
181
|
+
it_behaves_like "allows round trips", "DK24 1199 0003 1796 80"
|
182
182
|
|
183
|
-
context
|
183
|
+
context "without a bank_code" do
|
184
184
|
before { args.delete(:bank_code) }
|
185
185
|
it { is_expected.to be_nil }
|
186
186
|
end
|
187
187
|
|
188
|
-
context
|
188
|
+
context "without an account_number" do
|
189
189
|
before { args.delete(:account_number) }
|
190
190
|
it { is_expected.to be_nil }
|
191
191
|
end
|
192
192
|
end
|
193
193
|
|
194
|
-
context
|
194
|
+
context "with EE as the country_code" do
|
195
195
|
let(:args) do
|
196
196
|
{
|
197
|
-
country_code:
|
198
|
-
bank_code:
|
199
|
-
account_number:
|
197
|
+
country_code: "EE",
|
198
|
+
bank_code: "22",
|
199
|
+
account_number: "00221020145685",
|
200
200
|
}
|
201
201
|
end
|
202
202
|
|
203
|
-
it { is_expected.to eq(
|
203
|
+
it { is_expected.to eq("EE382200221020145685") }
|
204
204
|
|
205
|
-
it_behaves_like
|
205
|
+
it_behaves_like "allows round trips", "EE38 2200 2210 2014 5685"
|
206
206
|
|
207
|
-
context
|
207
|
+
context "without an account_number" do
|
208
208
|
before { args.delete(:account_number) }
|
209
209
|
it { is_expected.to be_nil }
|
210
210
|
end
|
211
211
|
end
|
212
212
|
|
213
|
-
context
|
213
|
+
context "with ES as the country_code" do
|
214
214
|
let(:args) do
|
215
215
|
{
|
216
|
-
country_code:
|
217
|
-
bank_code:
|
218
|
-
branch_code:
|
219
|
-
account_number:
|
216
|
+
country_code: "ES",
|
217
|
+
bank_code: "2310",
|
218
|
+
branch_code: "0001",
|
219
|
+
account_number: "180000012345",
|
220
220
|
}
|
221
221
|
end
|
222
222
|
|
223
|
-
it { is_expected.to eq(
|
223
|
+
it { is_expected.to eq("ES8023100001180000012345") }
|
224
224
|
|
225
|
-
it_behaves_like
|
225
|
+
it_behaves_like "allows round trips", "ES80 2310 0001 1800 0001 2345"
|
226
226
|
|
227
|
-
context
|
227
|
+
context "without a bank_code or branch code" do
|
228
228
|
before { args.delete(:bank_code) }
|
229
229
|
before { args.delete(:branch_code) }
|
230
|
-
before { args[:account_number] =
|
230
|
+
before { args[:account_number] = "23100001180000012345" }
|
231
231
|
|
232
232
|
it { is_expected.to be_nil }
|
233
233
|
end
|
234
234
|
|
235
|
-
context
|
235
|
+
context "without an account_number" do
|
236
236
|
before { args.delete(:account_number) }
|
237
237
|
it { is_expected.to be_nil }
|
238
238
|
end
|
239
239
|
end
|
240
240
|
|
241
|
-
context
|
241
|
+
context "with FI as the country_code" do
|
242
242
|
let(:args) do
|
243
|
-
{ country_code:
|
243
|
+
{ country_code: "FI", bank_code: "123456", account_number: "00000785" }
|
244
244
|
end
|
245
245
|
|
246
|
-
it { is_expected.to eq(
|
246
|
+
it { is_expected.to eq("FI2112345600000785") }
|
247
247
|
|
248
|
-
it_behaves_like
|
248
|
+
it_behaves_like "allows round trips", "FI21 1234 5600 0007 85"
|
249
249
|
|
250
|
-
context
|
250
|
+
context "without an account_number" do
|
251
251
|
before { args.delete(:account_number) }
|
252
252
|
it { is_expected.to be_nil }
|
253
253
|
end
|
254
254
|
|
255
|
-
context
|
255
|
+
context "without a bank_code" do
|
256
256
|
before { args.delete(:bank_code) }
|
257
257
|
it { is_expected.to be_nil }
|
258
258
|
end
|
259
259
|
end
|
260
260
|
|
261
|
-
context
|
261
|
+
context "with FR as the country_code" do
|
262
262
|
let(:args) do
|
263
263
|
{
|
264
|
-
country_code:
|
265
|
-
bank_code:
|
266
|
-
branch_code:
|
267
|
-
account_number:
|
264
|
+
country_code: "FR",
|
265
|
+
bank_code: "20041",
|
266
|
+
branch_code: "01005",
|
267
|
+
account_number: "0500013M02606",
|
268
268
|
}
|
269
269
|
end
|
270
270
|
|
271
|
-
it { is_expected.to eq(
|
271
|
+
it { is_expected.to eq("FR1420041010050500013M02606") }
|
272
272
|
|
273
|
-
it_behaves_like
|
273
|
+
it_behaves_like "allows round trips", "FR14 2004 1010 0505 0001 3M02 606"
|
274
274
|
|
275
|
-
context
|
276
|
-
before { args[:account_number] =
|
275
|
+
context "without the rib key in the account number" do
|
276
|
+
before { args[:account_number] = "0500013M026" }
|
277
277
|
specify { expect(Ibandit::IBAN.new(assemble)).to_not be_valid }
|
278
278
|
end
|
279
279
|
|
280
|
-
context
|
280
|
+
context "without a bank_code" do
|
281
281
|
before { args.delete(:bank_code) }
|
282
282
|
it { is_expected.to be_nil }
|
283
283
|
end
|
284
284
|
|
285
|
-
context
|
285
|
+
context "without a branch_code" do
|
286
286
|
before { args.delete(:branch_code) }
|
287
287
|
it { is_expected.to be_nil }
|
288
288
|
end
|
289
289
|
|
290
|
-
context
|
290
|
+
context "without an account_number" do
|
291
291
|
before { args.delete(:account_number) }
|
292
292
|
it { is_expected.to be_nil }
|
293
293
|
end
|
294
294
|
end
|
295
295
|
|
296
|
-
context
|
296
|
+
context "with GB as the country_code" do
|
297
297
|
let(:args) do
|
298
298
|
{
|
299
|
-
country_code:
|
300
|
-
bank_code:
|
301
|
-
branch_code:
|
302
|
-
account_number:
|
299
|
+
country_code: "GB",
|
300
|
+
bank_code: "BARC",
|
301
|
+
branch_code: "200000",
|
302
|
+
account_number: "00579135",
|
303
303
|
}
|
304
304
|
end
|
305
305
|
|
306
|
-
it { is_expected.to eq(
|
306
|
+
it { is_expected.to eq("GB07BARC20000000579135") }
|
307
307
|
|
308
|
-
it_behaves_like
|
308
|
+
it_behaves_like "allows round trips", "GB07 BARC 2000 0000 5791 35"
|
309
309
|
|
310
|
-
context
|
311
|
-
before { args.merge!(bank_code:
|
312
|
-
it { is_expected.to eq(
|
310
|
+
context "with the bank_code supplied manually" do
|
311
|
+
before { args.merge!(bank_code: "BARC") }
|
312
|
+
it { is_expected.to eq("GB07BARC20000000579135") }
|
313
313
|
end
|
314
314
|
|
315
|
-
context
|
315
|
+
context "without a branch_code" do
|
316
316
|
before { args.delete(:branch_code) }
|
317
317
|
it { is_expected.to be_nil }
|
318
318
|
end
|
319
319
|
|
320
|
-
context
|
320
|
+
context "without an account_number" do
|
321
321
|
before { args.delete(:account_number) }
|
322
322
|
it { is_expected.to be_nil }
|
323
323
|
end
|
324
324
|
|
325
|
-
context
|
325
|
+
context "without a bank_code" do
|
326
326
|
before { args.delete(:bank_code) }
|
327
327
|
it { is_expected.to be_nil }
|
328
328
|
end
|
329
329
|
|
330
|
-
context
|
331
|
-
before { args[:branch_code] =
|
330
|
+
context "with a non-numeric branch code" do
|
331
|
+
before { args[:branch_code] = "abc123" }
|
332
332
|
it { is_expected.to be_nil }
|
333
333
|
end
|
334
334
|
end
|
335
335
|
|
336
|
-
context
|
336
|
+
context "with GR as the country_code" do
|
337
337
|
let(:args) do
|
338
338
|
{
|
339
|
-
country_code:
|
340
|
-
bank_code:
|
341
|
-
branch_code:
|
342
|
-
account_number:
|
339
|
+
country_code: "GR",
|
340
|
+
bank_code: "011",
|
341
|
+
branch_code: "0125",
|
342
|
+
account_number: "0000000012300695",
|
343
343
|
}
|
344
344
|
end
|
345
345
|
|
346
|
-
it { is_expected.to eq(
|
346
|
+
it { is_expected.to eq("GR1601101250000000012300695") }
|
347
347
|
|
348
|
-
it_behaves_like
|
348
|
+
it_behaves_like "allows round trips", "GR16 0110 1250 0000 0001 2300 695"
|
349
349
|
|
350
|
-
context
|
350
|
+
context "without an account_number" do
|
351
351
|
before { args.delete(:account_number) }
|
352
352
|
it { is_expected.to be_nil }
|
353
353
|
end
|
354
354
|
|
355
|
-
context
|
355
|
+
context "without a bank_code" do
|
356
356
|
before { args.delete(:bank_code) }
|
357
357
|
it { is_expected.to be_nil }
|
358
358
|
end
|
359
359
|
|
360
|
-
context
|
360
|
+
context "without a branch_code" do
|
361
361
|
before { args.delete(:branch_code) }
|
362
362
|
it { is_expected.to be_nil }
|
363
363
|
end
|
364
364
|
end
|
365
365
|
|
366
|
-
context
|
366
|
+
context "with HR as the country_code" do
|
367
367
|
let(:args) do
|
368
|
-
{ country_code:
|
369
|
-
bank_code:
|
370
|
-
account_number:
|
368
|
+
{ country_code: "HR",
|
369
|
+
bank_code: "1001005",
|
370
|
+
account_number: "1863000160" }
|
371
371
|
end
|
372
372
|
|
373
|
-
it { is_expected.to eq(
|
373
|
+
it { is_expected.to eq("HR1210010051863000160") }
|
374
374
|
|
375
|
-
it_behaves_like
|
375
|
+
it_behaves_like "allows round trips", "HR12 1001 0051 8630 0016 0"
|
376
376
|
|
377
|
-
context
|
377
|
+
context "without a bank_code" do
|
378
378
|
before { args.delete(:bank_code) }
|
379
379
|
it { is_expected.to be_nil }
|
380
380
|
end
|
381
381
|
|
382
|
-
context
|
382
|
+
context "without an account_number" do
|
383
383
|
before { args.delete(:account_number) }
|
384
384
|
it { is_expected.to be_nil }
|
385
385
|
end
|
386
386
|
end
|
387
387
|
|
388
|
-
context
|
388
|
+
context "with HU as the country_code" do
|
389
389
|
let(:args) do
|
390
390
|
{
|
391
|
-
country_code:
|
392
|
-
bank_code:
|
393
|
-
branch_code:
|
394
|
-
account_number:
|
391
|
+
country_code: "HU",
|
392
|
+
bank_code: "117",
|
393
|
+
branch_code: "7301",
|
394
|
+
account_number: "61111101800000000",
|
395
395
|
}
|
396
396
|
end
|
397
397
|
|
398
|
-
it { is_expected.to eq(
|
398
|
+
it { is_expected.to eq("HU42117730161111101800000000") }
|
399
399
|
|
400
|
-
it_behaves_like
|
400
|
+
it_behaves_like "allows round trips", "HU42 1177 3016 1111 1018 0000 0000"
|
401
401
|
|
402
|
-
context
|
402
|
+
context "without a bank_code or branch_code" do
|
403
403
|
before { args.delete(:bank_code) }
|
404
404
|
before { args.delete(:branch_code) }
|
405
|
-
before { args[:account_number] =
|
405
|
+
before { args[:account_number] = "11773016-11111018-00000000" }
|
406
406
|
|
407
407
|
it { is_expected.to be_nil }
|
408
408
|
end
|
409
409
|
|
410
|
-
context
|
410
|
+
context "without a bank_code" do
|
411
411
|
before { args.delete(:bank_code) }
|
412
|
-
before { args[:account_number] =
|
412
|
+
before { args[:account_number] = "11773016-11111018-00000000" }
|
413
413
|
|
414
414
|
it { is_expected.to be_nil }
|
415
415
|
end
|
416
416
|
|
417
|
-
context
|
417
|
+
context "without a branch_code" do
|
418
418
|
before { args.delete(:branch_code) }
|
419
|
-
before { args[:account_number] =
|
419
|
+
before { args[:account_number] = "11773016-11111018-00000000" }
|
420
420
|
|
421
421
|
it { is_expected.to be_nil }
|
422
422
|
end
|
423
423
|
|
424
|
-
context
|
424
|
+
context "without an account_number" do
|
425
425
|
before { args.delete(:account_number) }
|
426
426
|
it { is_expected.to be_nil }
|
427
427
|
end
|
428
428
|
end
|
429
429
|
|
430
|
-
context
|
430
|
+
context "with IE as the country_code" do
|
431
431
|
let(:args) do
|
432
|
-
{ country_code:
|
433
|
-
bank_code:
|
434
|
-
branch_code:
|
435
|
-
account_number:
|
432
|
+
{ country_code: "IE",
|
433
|
+
bank_code: "AIBK",
|
434
|
+
branch_code: "931152",
|
435
|
+
account_number: "12345678" }
|
436
436
|
end
|
437
437
|
|
438
|
-
it { is_expected.to eq(
|
438
|
+
it { is_expected.to eq("IE29AIBK93115212345678") }
|
439
439
|
|
440
|
-
it_behaves_like
|
440
|
+
it_behaves_like "allows round trips", "IE29 AIBK 9311 5212 3456 78"
|
441
441
|
|
442
|
-
context
|
442
|
+
context "without a branch_code" do
|
443
443
|
before { args.delete(:branch_code) }
|
444
444
|
it { is_expected.to be_nil }
|
445
445
|
end
|
446
446
|
|
447
|
-
context
|
447
|
+
context "without an account_number" do
|
448
448
|
before { args.delete(:account_number) }
|
449
449
|
it { is_expected.to be_nil }
|
450
450
|
end
|
451
451
|
|
452
|
-
context
|
452
|
+
context "without a bank_code" do
|
453
453
|
before { args.delete(:bank_code) }
|
454
454
|
it { is_expected.to be_nil }
|
455
455
|
end
|
456
456
|
end
|
457
457
|
|
458
|
-
context
|
458
|
+
context "with IS as the country_code" do
|
459
459
|
let(:args) do
|
460
460
|
{
|
461
|
-
country_code:
|
462
|
-
account_number:
|
463
|
-
bank_code:
|
461
|
+
country_code: "IS",
|
462
|
+
account_number: "260195306702696399",
|
463
|
+
bank_code: "1175",
|
464
464
|
}
|
465
465
|
end
|
466
466
|
|
467
|
-
it { is_expected.to eq(
|
467
|
+
it { is_expected.to eq("IS501175260195306702696399") }
|
468
468
|
|
469
|
-
it_behaves_like
|
469
|
+
it_behaves_like "allows round trips", "IS50 1175 2601 9530 6702 6963 99"
|
470
470
|
|
471
|
-
context
|
471
|
+
context "without an account_number" do
|
472
472
|
before { args.delete(:account_number) }
|
473
473
|
it { is_expected.to be_nil }
|
474
474
|
end
|
475
475
|
|
476
|
-
context
|
476
|
+
context "without a bank_code" do
|
477
477
|
before { args.delete(:bank_code) }
|
478
478
|
it { is_expected.to be_nil }
|
479
479
|
end
|
480
480
|
end
|
481
481
|
|
482
|
-
context
|
482
|
+
context "with IT as the country_code" do
|
483
483
|
let(:args) do
|
484
484
|
{
|
485
|
-
country_code:
|
486
|
-
bank_code:
|
487
|
-
branch_code:
|
488
|
-
account_number:
|
485
|
+
country_code: "IT",
|
486
|
+
bank_code: "05428",
|
487
|
+
branch_code: "11101",
|
488
|
+
account_number: "000000123456",
|
489
489
|
}
|
490
490
|
end
|
491
491
|
|
492
|
-
it { is_expected.to eq(
|
492
|
+
it { is_expected.to eq("IT60X0542811101000000123456") }
|
493
493
|
|
494
|
-
it_behaves_like
|
494
|
+
it_behaves_like "allows round trips", "IT60 X054 2811 1010 0000 0123 456"
|
495
495
|
|
496
|
-
context
|
497
|
-
before { args[:check_digit] =
|
498
|
-
it { is_expected.to eq(
|
496
|
+
context "with an explicitly passed check digit" do
|
497
|
+
before { args[:check_digit] = "Y" }
|
498
|
+
it { is_expected.to eq("IT64Y0542811101000000123456") }
|
499
499
|
end
|
500
500
|
|
501
|
-
context
|
502
|
-
before { args[:account_number] =
|
501
|
+
context "with a bad character in an odd position" do
|
502
|
+
before { args[:account_number] = "000000123h00" }
|
503
503
|
it { is_expected.to be_nil }
|
504
504
|
end
|
505
505
|
|
506
|
-
context
|
507
|
-
before { args[:account_number] =
|
506
|
+
context "with a bad character in an even position" do
|
507
|
+
before { args[:account_number] = "0000001230h0" }
|
508
508
|
it { is_expected.to be_nil }
|
509
509
|
end
|
510
510
|
|
511
|
-
context
|
511
|
+
context "without a bank_code" do
|
512
512
|
before { args.delete(:bank_code) }
|
513
513
|
it { is_expected.to be_nil }
|
514
514
|
end
|
515
515
|
|
516
|
-
context
|
516
|
+
context "without a branch_code" do
|
517
517
|
before { args.delete(:branch_code) }
|
518
518
|
it { is_expected.to be_nil }
|
519
519
|
end
|
520
520
|
|
521
|
-
context
|
521
|
+
context "without an account_number" do
|
522
522
|
before { args.delete(:account_number) }
|
523
523
|
it { is_expected.to be_nil }
|
524
524
|
end
|
525
525
|
end
|
526
526
|
|
527
|
-
context
|
527
|
+
context "with LT as the country_code" do
|
528
528
|
let(:args) do
|
529
529
|
{
|
530
|
-
country_code:
|
531
|
-
account_number:
|
532
|
-
bank_code:
|
530
|
+
country_code: "LT",
|
531
|
+
account_number: "11101001000",
|
532
|
+
bank_code: "10000",
|
533
533
|
}
|
534
534
|
end
|
535
535
|
|
536
|
-
it { is_expected.to eq(
|
536
|
+
it { is_expected.to eq("LT121000011101001000") }
|
537
537
|
|
538
|
-
it_behaves_like
|
538
|
+
it_behaves_like "allows round trips", "LT12 1000 0111 0100 1000"
|
539
539
|
|
540
|
-
context
|
540
|
+
context "without an account_number" do
|
541
541
|
before { args.delete(:account_number) }
|
542
542
|
it { is_expected.to be_nil }
|
543
543
|
end
|
544
544
|
|
545
|
-
context
|
545
|
+
context "without a bank_code" do
|
546
546
|
before { args.delete(:bank_code) }
|
547
547
|
it { is_expected.to be_nil }
|
548
548
|
end
|
549
549
|
end
|
550
550
|
|
551
|
-
context
|
551
|
+
context "with LU as the country_code" do
|
552
552
|
let(:args) do
|
553
553
|
{
|
554
|
-
country_code:
|
555
|
-
account_number:
|
556
|
-
bank_code:
|
554
|
+
country_code: "LU",
|
555
|
+
account_number: "9400644750000",
|
556
|
+
bank_code: "001",
|
557
557
|
}
|
558
558
|
end
|
559
559
|
|
560
|
-
it { is_expected.to eq(
|
560
|
+
it { is_expected.to eq("LU280019400644750000") }
|
561
561
|
|
562
|
-
it_behaves_like
|
562
|
+
it_behaves_like "allows round trips", "LU28 0019 4006 4475 0000"
|
563
563
|
|
564
|
-
context
|
564
|
+
context "without an account_number" do
|
565
565
|
before { args.delete(:account_number) }
|
566
566
|
it { is_expected.to be_nil }
|
567
567
|
end
|
568
568
|
|
569
|
-
context
|
569
|
+
context "without a bank_code" do
|
570
570
|
before { args.delete(:bank_code) }
|
571
571
|
it { is_expected.to be_nil }
|
572
572
|
end
|
573
573
|
end
|
574
574
|
|
575
|
-
context
|
575
|
+
context "with LV as the country_code" do
|
576
576
|
let(:args) do
|
577
577
|
{
|
578
|
-
country_code:
|
579
|
-
account_number:
|
580
|
-
bank_code:
|
578
|
+
country_code: "LV",
|
579
|
+
account_number: "1234567890123",
|
580
|
+
bank_code: "BANK",
|
581
581
|
}
|
582
582
|
end
|
583
583
|
|
584
|
-
it { is_expected.to eq(
|
584
|
+
it { is_expected.to eq("LV72BANK1234567890123") }
|
585
585
|
|
586
|
-
it_behaves_like
|
586
|
+
it_behaves_like "allows round trips", "LV72 BANK 1234 5678 9012 3"
|
587
587
|
|
588
|
-
context
|
588
|
+
context "without an account_number" do
|
589
589
|
before { args.delete(:account_number) }
|
590
590
|
it { is_expected.to be_nil }
|
591
591
|
end
|
592
592
|
|
593
|
-
context
|
593
|
+
context "without a bank_code" do
|
594
594
|
before { args.delete(:bank_code) }
|
595
595
|
it { is_expected.to be_nil }
|
596
596
|
end
|
597
597
|
end
|
598
598
|
|
599
|
-
context
|
599
|
+
context "with MC as the country_code" do
|
600
600
|
let(:args) do
|
601
601
|
{
|
602
|
-
country_code:
|
603
|
-
bank_code:
|
604
|
-
branch_code:
|
605
|
-
account_number:
|
602
|
+
country_code: "MC",
|
603
|
+
bank_code: "20041",
|
604
|
+
branch_code: "01005",
|
605
|
+
account_number: "0500013M02606",
|
606
606
|
}
|
607
607
|
end
|
608
608
|
|
609
|
-
it { is_expected.to eq(
|
609
|
+
it { is_expected.to eq("MC9320041010050500013M02606") }
|
610
610
|
|
611
|
-
it_behaves_like
|
611
|
+
it_behaves_like "allows round trips", "MC93 2004 1010 0505 0001 3M02 606"
|
612
612
|
|
613
|
-
context
|
614
|
-
before { args[:account_number] =
|
613
|
+
context "without the rib key in the account number" do
|
614
|
+
before { args[:account_number] = "0500013M026" }
|
615
615
|
specify { expect(Ibandit::IBAN.new(assemble)).to_not be_valid }
|
616
616
|
end
|
617
617
|
|
618
|
-
context
|
618
|
+
context "without a bank_code" do
|
619
619
|
before { args.delete(:bank_code) }
|
620
620
|
it { is_expected.to be_nil }
|
621
621
|
end
|
622
622
|
|
623
|
-
context
|
623
|
+
context "without a branch_code" do
|
624
624
|
before { args.delete(:branch_code) }
|
625
625
|
it { is_expected.to be_nil }
|
626
626
|
end
|
627
627
|
|
628
|
-
context
|
628
|
+
context "without an account_number" do
|
629
629
|
before { args.delete(:account_number) }
|
630
630
|
it { is_expected.to be_nil }
|
631
631
|
end
|
632
632
|
end
|
633
633
|
|
634
|
-
context
|
634
|
+
context "with MT as the country_code" do
|
635
635
|
let(:args) do
|
636
636
|
{
|
637
|
-
country_code:
|
638
|
-
bank_code:
|
639
|
-
branch_code:
|
640
|
-
account_number:
|
637
|
+
country_code: "MT",
|
638
|
+
bank_code: "MMEB",
|
639
|
+
branch_code: "44093",
|
640
|
+
account_number: "000000009027293051",
|
641
641
|
}
|
642
642
|
end
|
643
643
|
|
644
|
-
it { is_expected.to eq(
|
644
|
+
it { is_expected.to eq("MT98MMEB44093000000009027293051") }
|
645
645
|
|
646
646
|
it_behaves_like(
|
647
|
-
|
648
|
-
|
647
|
+
"allows round trips",
|
648
|
+
"MT98 MMEB 4409 3000 0000 0902 7293 051",
|
649
649
|
)
|
650
650
|
|
651
|
-
context
|
651
|
+
context "without a branch_code" do
|
652
652
|
before { args.delete(:branch_code) }
|
653
653
|
it { is_expected.to be_nil }
|
654
654
|
end
|
655
655
|
|
656
|
-
context
|
656
|
+
context "without an account_number" do
|
657
657
|
before { args.delete(:account_number) }
|
658
658
|
it { is_expected.to be_nil }
|
659
659
|
end
|
660
660
|
|
661
|
-
context
|
661
|
+
context "without a bank_code" do
|
662
662
|
before { args.delete(:bank_code) }
|
663
663
|
it { is_expected.to be_nil }
|
664
664
|
end
|
665
665
|
|
666
|
-
context
|
667
|
-
before { args[:branch_code] =
|
666
|
+
context "with a non-numeric branch code" do
|
667
|
+
before { args[:branch_code] = "abc123" }
|
668
668
|
it { is_expected.to be_nil }
|
669
669
|
end
|
670
670
|
end
|
671
671
|
|
672
|
-
context
|
672
|
+
context "with NL as the country_code" do
|
673
673
|
let(:args) do
|
674
674
|
{
|
675
|
-
country_code:
|
676
|
-
account_number:
|
677
|
-
bank_code:
|
675
|
+
country_code: "NL",
|
676
|
+
account_number: "0417164300",
|
677
|
+
bank_code: "ABNA",
|
678
678
|
}
|
679
679
|
end
|
680
680
|
|
681
|
-
it { is_expected.to eq(
|
681
|
+
it { is_expected.to eq("NL91ABNA0417164300") }
|
682
682
|
|
683
|
-
it_behaves_like
|
683
|
+
it_behaves_like "allows round trips", "NL91 ABNA 0417 1643 00"
|
684
684
|
|
685
|
-
context
|
685
|
+
context "without an account_number" do
|
686
686
|
before { args.delete(:account_number) }
|
687
687
|
it { is_expected.to be_nil }
|
688
688
|
end
|
689
689
|
|
690
|
-
context
|
690
|
+
context "without an bank_code" do
|
691
691
|
before { args.delete(:bank_code) }
|
692
692
|
it { is_expected.to be_nil }
|
693
693
|
end
|
694
694
|
end
|
695
695
|
|
696
|
-
context
|
696
|
+
context "with NO as the country_code" do
|
697
697
|
let(:args) do
|
698
698
|
{
|
699
|
-
country_code:
|
700
|
-
bank_code:
|
701
|
-
account_number:
|
699
|
+
country_code: "NO",
|
700
|
+
bank_code: "8601",
|
701
|
+
account_number: "1117947",
|
702
702
|
}
|
703
703
|
end
|
704
704
|
|
705
|
-
it { is_expected.to eq(
|
705
|
+
it { is_expected.to eq("NO9386011117947") }
|
706
706
|
|
707
|
-
it_behaves_like
|
707
|
+
it_behaves_like "allows round trips", "NO93 8601 1117 947"
|
708
708
|
|
709
|
-
context
|
709
|
+
context "without a bank_code" do
|
710
710
|
before { args.delete(:bank_code) }
|
711
|
-
before { args[:account_number] =
|
711
|
+
before { args[:account_number] = "86011117947" }
|
712
712
|
|
713
713
|
it { is_expected.to be_nil }
|
714
714
|
end
|
715
715
|
|
716
|
-
context
|
716
|
+
context "without an account_number" do
|
717
717
|
before { args.delete(:account_number) }
|
718
718
|
it { is_expected.to be_nil }
|
719
719
|
end
|
720
720
|
end
|
721
721
|
|
722
|
-
context
|
722
|
+
context "with PL as the country_code" do
|
723
723
|
let(:args) do
|
724
724
|
{
|
725
|
-
country_code:
|
726
|
-
bank_code:
|
727
|
-
account_number:
|
725
|
+
country_code: "PL",
|
726
|
+
bank_code: "10201026",
|
727
|
+
account_number: "0000042270201111",
|
728
728
|
}
|
729
729
|
end
|
730
730
|
|
731
|
-
it { is_expected.to eq(
|
731
|
+
it { is_expected.to eq("PL60102010260000042270201111") }
|
732
732
|
|
733
|
-
it_behaves_like
|
733
|
+
it_behaves_like "allows round trips", "PL60 1020 1026 0000 0422 7020 1111"
|
734
734
|
|
735
|
-
context
|
735
|
+
context "without a bank_code" do
|
736
736
|
before { args.delete(:bank_code) }
|
737
|
-
before { args[:account_number] =
|
737
|
+
before { args[:account_number] = "60102010260000042270201111" }
|
738
738
|
|
739
739
|
it { is_expected.to be_nil }
|
740
740
|
end
|
741
741
|
|
742
|
-
context
|
742
|
+
context "without an account_number" do
|
743
743
|
before { args.delete(:account_number) }
|
744
744
|
it { is_expected.to be_nil }
|
745
745
|
end
|
746
746
|
end
|
747
747
|
|
748
|
-
context
|
748
|
+
context "with PT as the country_code" do
|
749
749
|
let(:args) do
|
750
750
|
{
|
751
|
-
country_code:
|
752
|
-
bank_code:
|
753
|
-
branch_code:
|
754
|
-
account_number:
|
751
|
+
country_code: "PT",
|
752
|
+
bank_code: "0002",
|
753
|
+
branch_code: "0023",
|
754
|
+
account_number: "0023843000578",
|
755
755
|
}
|
756
756
|
end
|
757
757
|
|
758
|
-
it { is_expected.to eq(
|
758
|
+
it { is_expected.to eq("PT50000200230023843000578") }
|
759
759
|
|
760
|
-
it_behaves_like
|
760
|
+
it_behaves_like "allows round trips", "PT50 0002 0023 0023 8430 0057 8"
|
761
761
|
|
762
|
-
context
|
762
|
+
context "without a bank_code" do
|
763
763
|
before { args.delete(:bank_code) }
|
764
764
|
it { is_expected.to be_nil }
|
765
765
|
end
|
766
766
|
|
767
|
-
context
|
767
|
+
context "without a branch_code" do
|
768
768
|
before { args.delete(:branch_code) }
|
769
769
|
it { is_expected.to be_nil }
|
770
770
|
end
|
771
771
|
|
772
|
-
context
|
772
|
+
context "without an account_number" do
|
773
773
|
before { args.delete(:account_number) }
|
774
774
|
it { is_expected.to be_nil }
|
775
775
|
end
|
776
776
|
end
|
777
777
|
|
778
|
-
context
|
778
|
+
context "with RO as the country_code" do
|
779
779
|
let(:args) do
|
780
780
|
{
|
781
|
-
country_code:
|
782
|
-
account_number:
|
783
|
-
bank_code:
|
781
|
+
country_code: "RO",
|
782
|
+
account_number: "1B31007593840000",
|
783
|
+
bank_code: "AAAA",
|
784
784
|
}
|
785
785
|
end
|
786
786
|
|
787
|
-
it { is_expected.to eq(
|
787
|
+
it { is_expected.to eq("RO49AAAA1B31007593840000") }
|
788
788
|
|
789
|
-
it_behaves_like
|
789
|
+
it_behaves_like "allows round trips", "RO49 AAAA 1B31 0075 9384 0000"
|
790
790
|
|
791
|
-
context
|
791
|
+
context "without an account_number" do
|
792
792
|
before { args.delete(:account_number) }
|
793
793
|
it { is_expected.to be_nil }
|
794
794
|
end
|
795
795
|
|
796
|
-
context
|
796
|
+
context "without a bank_code" do
|
797
797
|
before { args.delete(:bank_code) }
|
798
798
|
it { is_expected.to be_nil }
|
799
799
|
end
|
800
800
|
end
|
801
801
|
|
802
|
-
context
|
802
|
+
context "with SE as the country_code" do
|
803
803
|
let(:args) do
|
804
804
|
{
|
805
|
-
country_code:
|
806
|
-
bank_code:
|
807
|
-
account_number:
|
805
|
+
country_code: "SE",
|
806
|
+
bank_code: "500",
|
807
|
+
account_number: "00000050011045825",
|
808
808
|
}
|
809
809
|
end
|
810
810
|
|
811
|
-
it { is_expected.to eq(
|
811
|
+
it { is_expected.to eq("SE0450000000050011045825") }
|
812
812
|
|
813
|
-
it_behaves_like
|
813
|
+
it_behaves_like "allows round trips", "SE04 5000 0000 0500 1104 5825"
|
814
814
|
|
815
|
-
context
|
815
|
+
context "without a bank_code" do
|
816
816
|
before { args.delete(:bank_code) }
|
817
817
|
it { is_expected.to be_nil }
|
818
818
|
end
|
819
819
|
|
820
|
-
context
|
820
|
+
context "without an account_number" do
|
821
821
|
before { args.delete(:account_number) }
|
822
822
|
it { is_expected.to be_nil }
|
823
823
|
end
|
824
824
|
end
|
825
825
|
|
826
|
-
context
|
826
|
+
context "with SI as the country_code" do
|
827
827
|
let(:args) do
|
828
828
|
{
|
829
|
-
country_code:
|
830
|
-
bank_code:
|
831
|
-
account_number:
|
829
|
+
country_code: "SI",
|
830
|
+
bank_code: "19100",
|
831
|
+
account_number: "0000123438",
|
832
832
|
}
|
833
833
|
end
|
834
834
|
|
835
|
-
it { is_expected.to eq(
|
835
|
+
it { is_expected.to eq("SI56191000000123438") }
|
836
836
|
|
837
|
-
it_behaves_like
|
837
|
+
it_behaves_like "allows round trips", "SI56 1910 0000 0123 438"
|
838
838
|
|
839
|
-
context
|
839
|
+
context "without a bank_code" do
|
840
840
|
before { args.delete(:bank_code) }
|
841
841
|
it { is_expected.to be_nil }
|
842
842
|
end
|
843
843
|
|
844
|
-
context
|
844
|
+
context "without an account_number" do
|
845
845
|
before { args.delete(:account_number) }
|
846
846
|
it { is_expected.to be_nil }
|
847
847
|
end
|
848
848
|
end
|
849
849
|
|
850
|
-
context
|
850
|
+
context "with SK as the country_code" do
|
851
851
|
let(:args) do
|
852
852
|
{
|
853
|
-
country_code:
|
854
|
-
bank_code:
|
855
|
-
account_number:
|
853
|
+
country_code: "SK",
|
854
|
+
bank_code: "1200",
|
855
|
+
account_number: "0000198742637541",
|
856
856
|
}
|
857
857
|
end
|
858
858
|
|
859
|
-
it { is_expected.to eq(
|
859
|
+
it { is_expected.to eq("SK3112000000198742637541") }
|
860
860
|
|
861
|
-
it_behaves_like
|
861
|
+
it_behaves_like "allows round trips", "SK31 1200 0000 1987 4263 7541"
|
862
862
|
|
863
|
-
context
|
863
|
+
context "without a bank_code" do
|
864
864
|
before { args.delete(:bank_code) }
|
865
865
|
it { is_expected.to be_nil }
|
866
866
|
end
|
867
867
|
|
868
|
-
context
|
868
|
+
context "without an account_number" do
|
869
869
|
before { args.delete(:account_number) }
|
870
870
|
it { is_expected.to be_nil }
|
871
871
|
end
|
872
872
|
end
|
873
873
|
|
874
|
-
context
|
874
|
+
context "with SM as the country_code" do
|
875
875
|
let(:args) do
|
876
876
|
{
|
877
|
-
country_code:
|
878
|
-
bank_code:
|
879
|
-
branch_code:
|
880
|
-
account_number:
|
877
|
+
country_code: "SM",
|
878
|
+
bank_code: "05428",
|
879
|
+
branch_code: "11101",
|
880
|
+
account_number: "000000123456",
|
881
881
|
}
|
882
882
|
end
|
883
883
|
|
884
|
-
it { is_expected.to eq(
|
884
|
+
it { is_expected.to eq("SM88X0542811101000000123456") }
|
885
885
|
|
886
|
-
it_behaves_like
|
886
|
+
it_behaves_like "allows round trips", "SM88 X054 2811 1010 0000 0123 456"
|
887
887
|
|
888
|
-
context
|
888
|
+
context "without a bank_code" do
|
889
889
|
before { args.delete(:bank_code) }
|
890
890
|
it { is_expected.to be_nil }
|
891
891
|
end
|
892
892
|
|
893
|
-
context
|
893
|
+
context "without a branch_code" do
|
894
894
|
before { args.delete(:branch_code) }
|
895
895
|
it { is_expected.to be_nil }
|
896
896
|
end
|
897
897
|
|
898
|
-
context
|
898
|
+
context "without an account_number" do
|
899
899
|
before { args.delete(:account_number) }
|
900
900
|
it { is_expected.to be_nil }
|
901
901
|
end
|