buckaruby 1.1.1 → 1.5.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.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/.rubocop.yml +44 -3
- data/.travis.yml +5 -5
- data/CHANGELOG.md +29 -5
- data/Gemfile +5 -1
- data/Gemfile.lock +71 -0
- data/README.md +53 -0
- data/buckaruby.gemspec +3 -3
- data/lib/buckaruby.rb +1 -2
- data/lib/buckaruby/field_mapper.rb +52 -0
- data/lib/buckaruby/gateway.rb +31 -5
- data/lib/buckaruby/iban.rb +4 -2
- data/lib/buckaruby/operation.rb +1 -0
- data/lib/buckaruby/payment_method.rb +2 -0
- data/lib/buckaruby/request.rb +36 -2
- data/lib/buckaruby/response.rb +50 -35
- data/lib/buckaruby/signature.rb +22 -4
- data/lib/buckaruby/transaction_status.rb +19 -0
- data/lib/buckaruby/transaction_type.rb +79 -0
- data/lib/buckaruby/version.rb +1 -1
- data/spec/buckaruby/configuration_spec.rb +1 -1
- data/spec/buckaruby/field_mapper_spec.rb +69 -0
- data/spec/buckaruby/gateway_spec.rb +218 -79
- data/spec/buckaruby/iban_spec.rb +13 -13
- data/spec/buckaruby/signature_spec.rb +20 -14
- data/spec/buckaruby/support/case_insensitive_hash_spec.rb +1 -1
- data/spec/fixtures/responses/callback_payment_amex.txt +1 -0
- data/spec/fixtures/responses/callback_payment_sofort.txt +1 -0
- data/spec/fixtures/responses/callback_payment_visa.txt +1 -0
- data/spec/fixtures/responses/callback_refund_amex.txt +1 -0
- data/spec/fixtures/responses/setup_transaction_success.txt +1 -1
- data/spec/fixtures/responses/specify_transaction_success.txt +1 -0
- data/spec/spec_helper.rb +2 -0
- metadata +24 -23
data/lib/buckaruby/iban.rb
CHANGED
@@ -2,8 +2,10 @@
|
|
2
2
|
|
3
3
|
module Buckaruby
|
4
4
|
# Helper for calculating the IBAN for a given account number, bank code and country code.
|
5
|
-
|
6
|
-
|
5
|
+
module Iban
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def calculate_iban(account_number, bank_code, country_code = "NL")
|
7
9
|
if account_number.nil? || account_number.to_s.empty?
|
8
10
|
raise ArgumentError, "Invalid account number"
|
9
11
|
end
|
data/lib/buckaruby/operation.rb
CHANGED
@@ -4,6 +4,7 @@ module Buckaruby
|
|
4
4
|
module Operation
|
5
5
|
TRANSACTION_REQUEST = "TransactionRequest"
|
6
6
|
TRANSACTION_STATUS = "TransactionStatus"
|
7
|
+
TRANSACTION_REQUEST_SPECIFICATION = "TransactionRequestSpecification"
|
7
8
|
REFUND_INFO = "RefundInfo"
|
8
9
|
CANCEL_TRANSACTION = "CancelTransaction"
|
9
10
|
end
|
@@ -8,11 +8,13 @@ module Buckaruby
|
|
8
8
|
SEPA_DIRECT_DEBIT = "sepadirectdebit"
|
9
9
|
PAYPAL = "paypal"
|
10
10
|
BANCONTACT_MISTER_CASH = "bancontactmrcash"
|
11
|
+
SOFORT = "sofortueberweisung"
|
11
12
|
TRANSFER = "transfer"
|
12
13
|
|
13
14
|
# Credit cards
|
14
15
|
VISA = "visa"
|
15
16
|
MASTER_CARD = "mastercard"
|
16
17
|
MAESTRO = "maestro"
|
18
|
+
AMERICAN_EXPRESS = "amex"
|
17
19
|
end
|
18
20
|
end
|
data/lib/buckaruby/request.rb
CHANGED
@@ -50,14 +50,16 @@ module Buckaruby
|
|
50
50
|
# Try to catch some common exceptions Net::HTTP might raise
|
51
51
|
rescue Errno::ETIMEDOUT, Errno::EINVAL, Errno::ECONNRESET, Errno::ECONNREFUSED, Errno::EHOSTUNREACH,
|
52
52
|
IOError, SocketError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::OpenTimeout,
|
53
|
-
Net::ProtocolError, Net::ReadTimeout, OpenSSL::SSL::SSLError =>
|
54
|
-
raise ConnectionException,
|
53
|
+
Net::ProtocolError, Net::ReadTimeout, OpenSSL::SSL::SSLError => e
|
54
|
+
raise ConnectionException, e
|
55
55
|
end
|
56
56
|
|
57
57
|
def build_request_data(options)
|
58
58
|
params = { brq_websitekey: @config.website }
|
59
59
|
|
60
60
|
params.merge!(build_request_params(options))
|
61
|
+
params.merge!(build_custom_params(options[:custom])) if options[:custom]
|
62
|
+
params.merge!(build_additional_params(options[:additional])) if options[:additional]
|
61
63
|
|
62
64
|
params[:add_buckaruby] = "Buckaruby #{Buckaruby::VERSION}"
|
63
65
|
|
@@ -67,6 +69,14 @@ module Buckaruby
|
|
67
69
|
params
|
68
70
|
end
|
69
71
|
|
72
|
+
def build_custom_params(options)
|
73
|
+
options.map { |key, value| [:"cust_#{key}", value] }.to_h
|
74
|
+
end
|
75
|
+
|
76
|
+
def build_additional_params(options)
|
77
|
+
options.map { |key, value| [:"add_#{key}", value] }.to_h
|
78
|
+
end
|
79
|
+
|
70
80
|
def post_data(params)
|
71
81
|
params.map { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join("&")
|
72
82
|
end
|
@@ -149,6 +159,30 @@ module Buckaruby
|
|
149
159
|
end
|
150
160
|
end
|
151
161
|
|
162
|
+
# Request for a creating a transaction specification.
|
163
|
+
class TransactionSpecificationRequest < Request
|
164
|
+
def execute(options)
|
165
|
+
super(options.merge(operation: Operation::TRANSACTION_REQUEST_SPECIFICATION))
|
166
|
+
end
|
167
|
+
|
168
|
+
def build_request_params(options)
|
169
|
+
params = {}
|
170
|
+
|
171
|
+
if options[:payment_method]
|
172
|
+
if options[:payment_method].respond_to?(:join)
|
173
|
+
params[:brq_services] = options[:payment_method].join(",")
|
174
|
+
else
|
175
|
+
params[:brq_services] = options[:payment_method]
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
params[:brq_latestversiononly] = "true"
|
180
|
+
params[:brq_culture] = options[:culture] || Language::DUTCH
|
181
|
+
|
182
|
+
params
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
152
186
|
# Request for a creating a recurrent transaction.
|
153
187
|
class RecurrentTransactionRequest < TransactionRequest
|
154
188
|
def build_transaction_request_params(options)
|
data/lib/buckaruby/response.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'support/case_insensitive_hash'
|
4
|
+
|
3
5
|
require 'cgi'
|
4
6
|
require 'date'
|
5
7
|
|
@@ -20,25 +22,43 @@ module Buckaruby
|
|
20
22
|
end
|
21
23
|
|
22
24
|
def status
|
23
|
-
|
24
|
-
case params[:brq_statuscode]
|
25
|
-
when '190'
|
26
|
-
TransactionStatus::SUCCESS
|
27
|
-
when '490', '491', '492'
|
28
|
-
TransactionStatus::FAILED
|
29
|
-
when '690'
|
30
|
-
TransactionStatus::REJECTED
|
31
|
-
when '790', '791', '792', '793'
|
32
|
-
TransactionStatus::PENDING
|
33
|
-
when '890', '891'
|
34
|
-
TransactionStatus::CANCELLED
|
35
|
-
end
|
25
|
+
TransactionStatus.parse(params[:brq_statuscode])
|
36
26
|
end
|
37
27
|
|
38
28
|
def timestamp
|
39
29
|
parse_time(params[:brq_timestamp])
|
40
30
|
end
|
41
31
|
|
32
|
+
def custom
|
33
|
+
@custom ||= begin
|
34
|
+
custom = Support::CaseInsensitiveHash.new
|
35
|
+
|
36
|
+
params.each do |key, value|
|
37
|
+
next unless key.upcase.start_with?("CUST_")
|
38
|
+
|
39
|
+
new_key = key.to_s[5..-1]
|
40
|
+
custom[new_key] = value
|
41
|
+
end
|
42
|
+
|
43
|
+
custom
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def additional
|
48
|
+
@additional ||= begin
|
49
|
+
additional = Support::CaseInsensitiveHash.new
|
50
|
+
|
51
|
+
params.each do |key, value|
|
52
|
+
next unless key.upcase.start_with?("ADD_")
|
53
|
+
|
54
|
+
new_key = key.to_s[4..-1]
|
55
|
+
additional[new_key] = value
|
56
|
+
end
|
57
|
+
|
58
|
+
additional
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
42
62
|
private
|
43
63
|
|
44
64
|
def parse_response(body)
|
@@ -53,7 +73,7 @@ module Buckaruby
|
|
53
73
|
end
|
54
74
|
|
55
75
|
def verify_signature!(response, config)
|
56
|
-
if params[:brq_apiresult]
|
76
|
+
if params[:brq_apiresult].nil? || params[:brq_apiresult].casecmp("fail") != 0
|
57
77
|
sent_signature = params[:brq_signature]
|
58
78
|
generated_signature = Signature.generate_signature(response, config)
|
59
79
|
|
@@ -144,27 +164,7 @@ module Buckaruby
|
|
144
164
|
end
|
145
165
|
|
146
166
|
def transaction_type
|
147
|
-
|
148
|
-
# See http://support.buckaroo.nl/index.php/Transactietypes
|
149
|
-
case params[:brq_transaction_type]
|
150
|
-
when 'C001', 'C002', 'C004', 'C021', 'C043', 'C044', 'C046', 'C089', 'C090', 'C192', 'C251', 'V001', 'V002', 'V010', 'V021', 'V032', 'V034', 'V043', 'V044', 'V046', 'V089', 'V090', 'V192', 'V245'
|
151
|
-
# Check the recurring flag to detect a normal or recurring transaction.
|
152
|
-
if params[:brq_recurring] && params[:brq_recurring].casecmp("true").zero?
|
153
|
-
TransactionType::PAYMENT_RECURRENT
|
154
|
-
else
|
155
|
-
TransactionType::PAYMENT
|
156
|
-
end
|
157
|
-
when 'C005', 'V014', 'V031', 'V094'
|
158
|
-
TransactionType::PAYMENT_RECURRENT
|
159
|
-
when 'C079', 'C080', 'C082', 'C092', 'C101', 'C102', 'C121', 'C194', 'C197', 'C252', 'C500', 'V067', 'V068', 'V070', 'V079', 'V080', 'V082', 'V092', 'V101', 'V102', 'V110', 'V149', 'V194', 'V197', 'V246'
|
160
|
-
TransactionType::REFUND
|
161
|
-
when 'C501', 'C502', 'C546', 'C551', 'C553', 'C554', 'C562', 'C589', 'C593', 'V111', 'V131', 'V132', 'V134', 'V143', 'V144', 'V146', 'V543', 'V544', 'V545', 'V546', 'V589', 'V592'
|
162
|
-
TransactionType::REVERSAL
|
163
|
-
end
|
164
|
-
else
|
165
|
-
# Fallback when transaction type is not known (cancelling credit card)
|
166
|
-
TransactionType::PAYMENT
|
167
|
-
end
|
167
|
+
TransactionType.parse(params[:brq_transaction_type], params[:brq_recurring])
|
168
168
|
end
|
169
169
|
|
170
170
|
def transaction_status
|
@@ -269,4 +269,19 @@ module Buckaruby
|
|
269
269
|
class CallbackResponse < Response
|
270
270
|
include TransactionResponse
|
271
271
|
end
|
272
|
+
|
273
|
+
# Response when retrieving the specification for a transaction.
|
274
|
+
class TransactionSpecificationResponse < ApiResponse
|
275
|
+
def services
|
276
|
+
@services ||= FieldMapper.map_fields(params, :brq_services)
|
277
|
+
end
|
278
|
+
|
279
|
+
def basic_fields
|
280
|
+
@basic_fields ||= FieldMapper.map_fields(params, :brq_basicfields)
|
281
|
+
end
|
282
|
+
|
283
|
+
def custom_parameters
|
284
|
+
@custom_parameters ||= FieldMapper.map_fields(params, :brq_customparameters)
|
285
|
+
end
|
286
|
+
end
|
272
287
|
end
|
data/lib/buckaruby/signature.rb
CHANGED
@@ -5,8 +5,10 @@ require 'digest'
|
|
5
5
|
module Buckaruby
|
6
6
|
# Calculate a signature based on the parameters of the payment request or response.
|
7
7
|
# -> see BPE 3.0 Gateway NVP, chapter 4 'Digital Signature'
|
8
|
-
|
9
|
-
|
8
|
+
module Signature
|
9
|
+
module_function
|
10
|
+
|
11
|
+
def generate_signature(params, config)
|
10
12
|
case config.hash_method
|
11
13
|
when :sha1
|
12
14
|
Digest::SHA1.hexdigest(generate_signature_string(params, config.secret))
|
@@ -19,11 +21,27 @@ module Buckaruby
|
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
22
|
-
def
|
24
|
+
def generate_signature_string(params, secret)
|
23
25
|
sign_params = params.select { |key, _value| key.to_s.upcase.start_with?("BRQ_", "ADD_", "CUST_") && key.to_s.casecmp("BRQ_SIGNATURE").nonzero? }
|
24
|
-
|
26
|
+
sign_params = order_signature_params(sign_params)
|
27
|
+
|
28
|
+
string = sign_params.map { |param| "#{param[0]}=#{param[1]}" }.join
|
25
29
|
string << secret
|
26
30
|
string
|
27
31
|
end
|
32
|
+
|
33
|
+
# Excerpt from the Buckaroo documentation, chapter 4 'Digital Signature':
|
34
|
+
# In the payment engine, the used lexical sort algorithm uses the following order:
|
35
|
+
# symbols first, then numbers, then case insensitive letters. Also, a shorter string
|
36
|
+
# that is identical to the beginning of a longer string, comes before the longer string.
|
37
|
+
# Take for example the following, comma separated, list which has been sorted:
|
38
|
+
# a_a, a0, a0a, a1a, aaA, aab, aba, aCa
|
39
|
+
CHAR_ORDER = "_01234567890abcdefghijklmnopqrstuvwxyz"
|
40
|
+
|
41
|
+
def order_signature_params(params)
|
42
|
+
params.sort_by do |key, _value|
|
43
|
+
key.to_s.downcase.each_char.map { |c| CHAR_ORDER.index(c) }
|
44
|
+
end
|
45
|
+
end
|
28
46
|
end
|
29
47
|
end
|
@@ -1,11 +1,30 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Buckaruby
|
4
|
+
# Parses the transaction status code from Buckaroo.
|
4
5
|
module TransactionStatus
|
5
6
|
SUCCESS = 1
|
6
7
|
FAILED = 2
|
7
8
|
REJECTED = 3
|
8
9
|
CANCELLED = 4
|
9
10
|
PENDING = 5
|
11
|
+
|
12
|
+
module_function
|
13
|
+
|
14
|
+
# See https://support.buckaroo.nl/categorie%C3%ABn/transacties/status
|
15
|
+
def parse(brq_statuscode)
|
16
|
+
case brq_statuscode
|
17
|
+
when '190'
|
18
|
+
TransactionStatus::SUCCESS
|
19
|
+
when '490', '491', '492'
|
20
|
+
TransactionStatus::FAILED
|
21
|
+
when '690'
|
22
|
+
TransactionStatus::REJECTED
|
23
|
+
when '790', '791', '792', '793'
|
24
|
+
TransactionStatus::PENDING
|
25
|
+
when '890', '891'
|
26
|
+
TransactionStatus::CANCELLED
|
27
|
+
end
|
28
|
+
end
|
10
29
|
end
|
11
30
|
end
|
@@ -1,10 +1,89 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Buckaruby
|
4
|
+
# Parses the transaction type from Buckaroo.
|
4
5
|
module TransactionType
|
5
6
|
PAYMENT = 1
|
6
7
|
PAYMENT_RECURRENT = 2
|
7
8
|
REFUND = 3
|
8
9
|
REVERSAL = 4
|
10
|
+
|
11
|
+
module_function
|
12
|
+
|
13
|
+
# See https://support.buckaroo.nl/categorie%C3%ABn/integratie/transactietypes-overzicht
|
14
|
+
def parse(brq_transaction_type, brq_recurring)
|
15
|
+
if brq_transaction_type && !brq_transaction_type.empty?
|
16
|
+
case brq_transaction_type
|
17
|
+
when 'C021', 'V021', # iDEAL
|
18
|
+
'C002', 'C004', 'C005', # (SEPA) Direct Debit
|
19
|
+
'V010', 'V014', # PayPal
|
20
|
+
'C090', 'V090', # Bancontact
|
21
|
+
'N074', 'C075', # Sofort
|
22
|
+
'C001', # Transfer
|
23
|
+
|
24
|
+
'C044', 'C192', 'C283', 'C293', 'C318', 'C345',
|
25
|
+
'C880', 'C963', 'V002', 'V032', 'V038', 'V044',
|
26
|
+
'V192', 'V283', 'V293', 'V313', 'V318', 'V345',
|
27
|
+
'V696', # Visa
|
28
|
+
|
29
|
+
'C043', 'C089', 'C273', 'C303', 'C328', 'C355',
|
30
|
+
'C876', 'C969', 'V001', 'V031', 'V037', 'V043',
|
31
|
+
'V089', 'V273', 'V303', 'V328', 'V355', 'V702', # MasterCard
|
32
|
+
|
33
|
+
'C046', 'C251', 'C288', 'C308', 'C333', 'C872',
|
34
|
+
'C972', 'V034', 'V040', 'V046', 'V094', 'V245',
|
35
|
+
'V288', 'V308', 'V333', 'V705', # Maestro
|
36
|
+
|
37
|
+
'V003', 'V030', 'V036', 'V042' # American Express
|
38
|
+
|
39
|
+
# Check the recurring flag to detect a normal or recurring transaction.
|
40
|
+
if brq_recurring && brq_recurring.casecmp("true").zero?
|
41
|
+
TransactionType::PAYMENT_RECURRENT
|
42
|
+
else
|
43
|
+
TransactionType::PAYMENT
|
44
|
+
end
|
45
|
+
when 'C121', # iDEAL
|
46
|
+
'C102', 'C500', # (SEPA) Direct Debit
|
47
|
+
'V110', # PayPal
|
48
|
+
'C092', 'V092', # Bancontact
|
49
|
+
'N540', 'C543', # Sofort
|
50
|
+
'C101', # Transfer
|
51
|
+
|
52
|
+
'C080', 'C194', 'C281', 'C290', 'C315', 'C342',
|
53
|
+
'C881', 'C961', 'V068', 'V074', 'V080', 'V102',
|
54
|
+
'V194', 'V281', 'V290', 'V315', 'V342', 'V694', # Visa
|
55
|
+
|
56
|
+
'C079', 'C197', 'C300', 'C325', 'C352', 'C371',
|
57
|
+
'C877', 'C967', 'V067', 'V073', 'V079', 'V101',
|
58
|
+
'V149', 'V197', 'V300', 'V325', 'V352', 'V371',
|
59
|
+
'V700', # MasterCard
|
60
|
+
|
61
|
+
'C082', 'C252', 'C286', 'C305', 'C330', 'C873',
|
62
|
+
'C970', 'V070', 'V076', 'V082', 'V246', 'V286',
|
63
|
+
'V305', 'V330', 'V703', # Maestro
|
64
|
+
|
65
|
+
'V066', 'V072', 'V078', 'V103' # American Express
|
66
|
+
TransactionType::REFUND
|
67
|
+
when 'C501', 'C502', 'C562', # (SEPA) Direct Debit
|
68
|
+
'V111', # PayPal
|
69
|
+
'C544', # Sofort
|
70
|
+
|
71
|
+
'C554', 'C593', 'C882', 'V132', 'V138', 'V144',
|
72
|
+
'V544', 'V592', # Visa
|
73
|
+
|
74
|
+
'C553', 'C589', 'C878', 'V131', 'V137', 'V143',
|
75
|
+
'V543', 'V589', # MasterCard
|
76
|
+
|
77
|
+
'C546', 'C551', 'C874', 'V134', 'V140', 'V146',
|
78
|
+
'V545', 'V546', # Maestro
|
79
|
+
|
80
|
+
'V130', 'V136', 'V142' # American Express
|
81
|
+
TransactionType::REVERSAL
|
82
|
+
end
|
83
|
+
else
|
84
|
+
# Fallback when transaction type is not known (e.g. cancelling credit card)
|
85
|
+
TransactionType::PAYMENT
|
86
|
+
end
|
87
|
+
end
|
9
88
|
end
|
10
89
|
end
|
data/lib/buckaruby/version.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe Buckaruby::Configuration do
|
5
|
+
RSpec.describe Buckaruby::Configuration do
|
6
6
|
describe '#website' do
|
7
7
|
it 'sets the website from options' do
|
8
8
|
config = Buckaruby::Configuration.new(website: "12345678", secret: "7C222FB2927D828AF22F592134E8932480637C0D")
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Buckaruby::FieldMapper do
|
6
|
+
describe '.map_fields' do
|
7
|
+
let(:fields) do
|
8
|
+
{
|
9
|
+
brq_services_1_description: "iDEAL",
|
10
|
+
brq_services_1_name: "ideal",
|
11
|
+
brq_services_1_version: "2",
|
12
|
+
brq_services_1_supportedcurrencies_1_code: "EUR",
|
13
|
+
brq_services_1_supportedcurrencies_1_isonumber: "978",
|
14
|
+
brq_services_1_supportedcurrencies_1_name: "Euro",
|
15
|
+
brq_services_2_description: "Visa",
|
16
|
+
brq_services_2_name: "visa",
|
17
|
+
brq_services_2_version: "1",
|
18
|
+
brq_services_2_supportedcurrencies_1_code: "GBP",
|
19
|
+
brq_services_2_supportedcurrencies_1_isonumber: "826",
|
20
|
+
brq_services_2_supportedcurrencies_1_name: "Pond",
|
21
|
+
brq_services_2_supportedcurrencies_2_code: "USD",
|
22
|
+
brq_services_2_supportedcurrencies_2_isonumber: "840",
|
23
|
+
brq_services_2_supportedcurrencies_2_name: "US Dollar"
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'maps NVP fields to arrays and hashes' do
|
28
|
+
services = Buckaruby::FieldMapper.map_fields(fields, :brq_services)
|
29
|
+
expect(services).to be_an_instance_of(Array)
|
30
|
+
expect(services.count).to eq(2)
|
31
|
+
|
32
|
+
ideal = services.first
|
33
|
+
expect(ideal).to be_an_instance_of(Buckaruby::Support::CaseInsensitiveHash)
|
34
|
+
expect(ideal[:description]).to eq("iDEAL")
|
35
|
+
expect(ideal[:name]).to eq("ideal")
|
36
|
+
expect(ideal[:version]).to eq("2")
|
37
|
+
|
38
|
+
visa = services.last
|
39
|
+
expect(visa).to be_an_instance_of(Buckaruby::Support::CaseInsensitiveHash)
|
40
|
+
expect(visa[:description]).to eq("Visa")
|
41
|
+
expect(visa[:name]).to eq("visa")
|
42
|
+
expect(visa[:version]).to eq("1")
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'maps NVP subfields to arrays and hashes' do
|
46
|
+
services = Buckaruby::FieldMapper.map_fields(fields, :brq_services)
|
47
|
+
|
48
|
+
currencies = services.first[:supportedcurrencies]
|
49
|
+
expect(currencies).to be_an_instance_of(Array)
|
50
|
+
expect(currencies.count).to eq(1)
|
51
|
+
|
52
|
+
currency = currencies.first
|
53
|
+
expect(currency).to be_an_instance_of(Buckaruby::Support::CaseInsensitiveHash)
|
54
|
+
expect(currency[:code]).to eq("EUR")
|
55
|
+
expect(currency[:isonumber]).to eq("978")
|
56
|
+
expect(currency[:name]).to eq("Euro")
|
57
|
+
|
58
|
+
currencies = services.last[:supportedcurrencies]
|
59
|
+
expect(currencies).to be_an_instance_of(Array)
|
60
|
+
expect(currencies.count).to eq(2)
|
61
|
+
|
62
|
+
currency = currencies.first
|
63
|
+
expect(currency).to be_an_instance_of(Buckaruby::Support::CaseInsensitiveHash)
|
64
|
+
expect(currency[:code]).to eq("GBP")
|
65
|
+
expect(currency[:isonumber]).to eq("826")
|
66
|
+
expect(currency[:name]).to eq("Pond")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|