adyen-ruby-api-library 4.0.1 → 6.0.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.
Files changed (105) hide show
  1. checksums.yaml +5 -5
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +27 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +7 -0
  6. data/.github/dependabot.yml +8 -0
  7. data/.github/workflows/ruby.yml +20 -0
  8. data/.gitignore +4 -0
  9. data/CODE_OF_CONDUCT.md +76 -0
  10. data/Gemfile +2 -2
  11. data/README.md +72 -109
  12. data/docs/checkout.html +17 -0
  13. data/docs/marketpay.html +2 -0
  14. data/lib/adyen/client.rb +57 -24
  15. data/lib/adyen/errors.rb +44 -2
  16. data/lib/adyen/services/bin_lookup.rb +18 -0
  17. data/lib/adyen/services/checkout.rb +90 -8
  18. data/lib/adyen/services/{checkout_utility.rb → data_protection.rb} +4 -3
  19. data/lib/adyen/services/dispute.rb +20 -0
  20. data/lib/adyen/services/marketpay.rb +27 -6
  21. data/lib/adyen/services/payments.rb +15 -5
  22. data/lib/adyen/services/payouts.rb +3 -2
  23. data/lib/adyen/services/postfmapi.rb +19 -0
  24. data/lib/adyen/services/recurring.rb +3 -2
  25. data/lib/adyen/services/service.rb +2 -2
  26. data/lib/adyen/version.rb +1 -1
  27. data/lib/adyen-ruby-api-library.rb +4 -12
  28. data/renovate.json +5 -0
  29. data/spec/account_spec.rb +4 -1
  30. data/spec/bin_lookup_spec.rb +15 -0
  31. data/spec/checkout_spec.rb +275 -4
  32. data/spec/data_protection_spec.rb +14 -0
  33. data/spec/dispute_spec.rb +17 -0
  34. data/spec/errors_spec.rb +33 -3
  35. data/spec/fund_spec.rb +2 -1
  36. data/spec/hop_spec.rb +14 -0
  37. data/spec/mocks/requests/Account/check_account_holder.json +5 -0
  38. data/spec/mocks/requests/Account/delete_payout_methods.json +6 -0
  39. data/spec/mocks/requests/Account/delete_signatories.json +6 -0
  40. data/spec/mocks/requests/BinLookup/get_3ds_availability.json +4 -0
  41. data/spec/mocks/requests/BinLookup/get_cost_estimate.json +8 -0
  42. data/spec/mocks/requests/Checkout/orders.json +6 -0
  43. data/spec/mocks/requests/Checkout/orders_cancel.json +7 -0
  44. data/spec/mocks/requests/Checkout/origin_keys.json +3 -0
  45. data/spec/mocks/requests/Checkout/payment_links.json +9 -0
  46. data/spec/mocks/requests/Checkout/payment_methods_balance.json +9 -0
  47. data/spec/mocks/requests/Checkout/sessions.json +10 -0
  48. data/spec/mocks/requests/DataProtectionService/request_subject_erasure.json +5 -0
  49. data/spec/mocks/requests/DisputeService/defend_dispute.json +5 -0
  50. data/spec/mocks/requests/DisputeService/delete_dispute_defense_document.json +5 -0
  51. data/spec/mocks/requests/DisputeService/retrieve_applicable_defense_reasons.json +4 -0
  52. data/spec/mocks/requests/DisputeService/supply_defense_document.json +11 -0
  53. data/spec/mocks/requests/Fund/refund_funds_transfer.json +7 -0
  54. data/spec/mocks/requests/Hop/get_onboarding_url.json +4 -0
  55. data/spec/mocks/requests/Payment/donate.json +10 -0
  56. data/spec/mocks/requests/Payment/get_authentication_result.json +4 -0
  57. data/spec/mocks/requests/Payment/retrieve_3ds2_result.json +4 -0
  58. data/spec/mocks/requests/Payment/technical_cancel.json +4 -0
  59. data/spec/mocks/requests/Payment/void_pending_refund.json +4 -0
  60. data/spec/mocks/requests/Payout/payout.json +8 -0
  61. data/spec/mocks/requests/Recurring/schedule_account_updater.json +12 -0
  62. data/spec/mocks/requests/Terminal/assign_terminals.json +6 -0
  63. data/spec/mocks/requests/Terminal/find_terminal.json +3 -0
  64. data/spec/mocks/requests/Terminal/get_terminals_under_account.json +4 -0
  65. data/spec/mocks/responses/Account/check_account_holder.json +3 -0
  66. data/spec/mocks/responses/Account/delete_payout_methods.json +3 -0
  67. data/spec/mocks/responses/Account/delete_signatories.json +3 -0
  68. data/spec/mocks/responses/BinLookup/get_3ds_availability.json +8 -0
  69. data/spec/mocks/responses/BinLookup/get_cost_estimate.json +8 -0
  70. data/spec/mocks/responses/Checkout/get-payment-link.json +11 -0
  71. data/spec/mocks/responses/Checkout/orders.json +8 -0
  72. data/spec/mocks/responses/Checkout/orders_cancel.json +4 -0
  73. data/spec/mocks/responses/Checkout/origin_keys.json +5 -0
  74. data/spec/mocks/responses/Checkout/payment_links.json +9 -0
  75. data/spec/mocks/responses/Checkout/payment_methods_balance.json +3 -0
  76. data/spec/mocks/responses/Checkout/sessions-success.json +11 -0
  77. data/spec/mocks/responses/Checkout/update-payment-link.json +11 -0
  78. data/spec/mocks/responses/DataProtectionService/request_subject_erasure.json +3 -0
  79. data/spec/mocks/responses/DisputeService/defend_dispute.json +5 -0
  80. data/spec/mocks/responses/DisputeService/delete_dispute_defense_document.json +5 -0
  81. data/spec/mocks/responses/DisputeService/retrieve_applicable_defense_reasons.json +28 -0
  82. data/spec/mocks/responses/DisputeService/supply_defense_document.json +5 -0
  83. data/spec/mocks/responses/Fund/refund_funds_transfer.json +5 -0
  84. data/spec/mocks/responses/Hop/get_onboarding_url.json +7 -0
  85. data/spec/mocks/responses/Payment/donate.json +4 -0
  86. data/spec/mocks/responses/Payment/get_authentication_result.json +5 -0
  87. data/spec/mocks/responses/Payment/retrieve_3ds2_result.json +5 -0
  88. data/spec/mocks/responses/Payment/technical_cancel.json +3 -0
  89. data/spec/mocks/responses/Payment/void_pending_refund.json +3 -0
  90. data/spec/mocks/responses/Payout/payout.json +3 -0
  91. data/spec/mocks/responses/Recurring/schedule_account_updater.json +4 -0
  92. data/spec/mocks/responses/Terminal/assign_terminals.json +5 -0
  93. data/spec/mocks/responses/Terminal/find_terminal.json +6 -0
  94. data/spec/mocks/responses/Terminal/get_terminals_under_account.json +11 -0
  95. data/spec/payments_spec.rb +6 -1
  96. data/spec/payouts_spec.rb +2 -1
  97. data/spec/postfmapi_spec.rb +16 -0
  98. data/spec/recurring_spec.rb +2 -1
  99. data/spec/service_spec.rb +4 -0
  100. data/spec/spec_helper.rb +18 -12
  101. metadata +78 -9
  102. data/.travis.yml +0 -14
  103. data/spec/checkout_utility_spec.rb +0 -29
  104. data/spec/mocks/requests/CheckoutUtility/origin_keys.json +0 -7
  105. data/spec/mocks/responses/CheckoutUtility/origin_keys.json +0 -7
data/lib/adyen/errors.rb CHANGED
@@ -3,19 +3,61 @@ module Adyen
3
3
  attr_reader :code, :response, :request, :msg
4
4
 
5
5
  def initialize(request = nil, response = nil, msg = nil, code = nil)
6
+ mask_fields(request)
7
+
8
+ # components of formatted error message
6
9
  attributes = {
7
10
  code: code,
11
+ msg: msg,
8
12
  request: request,
9
- response: response,
10
- msg: msg
13
+ response: response
11
14
  }.select { |_k, v| v }.map { |k, v| "#{k}:#{v}" }.join(', ')
12
15
  message = "#{self.class.name} #{attributes}"
13
16
  super(message)
17
+
18
+ # internal variables
14
19
  @code = code
15
20
  @response = response
16
21
  @request = request
17
22
  @msg = msg
18
23
  end
24
+
25
+ # mask PCI data in request
26
+ def mask_fields(request)
27
+ return if request.nil?
28
+
29
+ # sensitive fields
30
+ fields_to_mask = [
31
+ :expiryMonth,
32
+ :expiryYear,
33
+ :encryptedCardNumber,
34
+ :encryptedExpiryMonth,
35
+ :encryptedExpiryYear,
36
+ :encryptedSecurityCode
37
+ ]
38
+
39
+ # convert to hash if necessary
40
+ request = request.is_a?(Hash) ? request : JSON.parse(request)
41
+
42
+ # iterate through request to find fields to mask
43
+ request.each do |k, v|
44
+ if request[k].is_a?(Hash)
45
+ # recursively traverse multi-level hashes
46
+ mask_fields(request[k])
47
+ else
48
+ if k == :number
49
+ # show first 6 and last 4 for cards
50
+ request[k] = "#{v[0,6]}******#{v[12,16]}"
51
+ elsif k == :cvc
52
+ # show length of cvc for debugging
53
+ request[k] = "*" * v.length
54
+ elsif fields_to_mask.include? k
55
+ # generic mask for other fields
56
+ request[k] = "***"
57
+ end
58
+ end
59
+ end
60
+ end
19
61
  end
20
62
 
21
63
  class AuthenticationError < AdyenError
@@ -0,0 +1,18 @@
1
+ require_relative 'service'
2
+
3
+ module Adyen
4
+ class BinLookup < Service
5
+ attr_accessor :version
6
+ DEFAULT_VERSION = 50
7
+
8
+ def initialize(client, version = DEFAULT_VERSION)
9
+ service = 'BinLookup'
10
+ method_names = [
11
+ :get_3ds_availability,
12
+ :get_cost_estimate
13
+ ]
14
+
15
+ super(client, version, service, method_names)
16
+ end
17
+ end
18
+ end
@@ -1,17 +1,22 @@
1
- require_relative 'service'
1
+ require_relative "service"
2
2
 
3
3
  module Adyen
4
4
  class Checkout < Service
5
- DEFAULT_VERSION = 50
5
+ DEFAULT_VERSION = 68
6
6
 
7
7
  def initialize(client, version = DEFAULT_VERSION)
8
- service = 'Checkout'
8
+ service = "Checkout"
9
9
  method_names = [
10
- :payment_methods,
11
- :payment_session
10
+ :payment_session,
11
+ :origin_keys,
12
+ :sessions
12
13
  ]
13
14
 
14
- super(client, version, service, method_names)
15
+ with_application_info = [
16
+ :payment_session,
17
+ ]
18
+
19
+ super(client, version, service, method_names, with_application_info)
15
20
  end
16
21
 
17
22
  # This method can't be dynamically defined because
@@ -24,7 +29,40 @@ module Adyen
24
29
  when 0
25
30
  Adyen::CheckoutDetail.new(@client, @version)
26
31
  else
27
- action = 'payments'
32
+ action = "payments"
33
+ args[1] ||= {} # optional headers arg
34
+ @client.call_adyen_api(@service, action, args[0], args[1], @version, true)
35
+ end
36
+ end
37
+
38
+ def payment_links(*args)
39
+ case args.size
40
+ when 0
41
+ Adyen::CheckoutLink.new(@client, @version)
42
+ else
43
+ action = "paymentLinks"
44
+ args[1] ||= {} # optional headers arg
45
+ @client.call_adyen_api(@service, action, args[0], args[1], @version, true)
46
+ end
47
+ end
48
+
49
+ def payment_methods(*args)
50
+ case args.size
51
+ when 0
52
+ Adyen::CheckoutMethod.new(@client, @version)
53
+ else
54
+ action = "paymentMethods"
55
+ args[1] ||= {} # optional headers arg
56
+ @client.call_adyen_api(@service, action, args[0], args[1], @version)
57
+ end
58
+ end
59
+
60
+ def orders(*args)
61
+ case args.size
62
+ when 0
63
+ Adyen::CheckoutOrder.new(@client, @version)
64
+ else
65
+ action = "orders"
28
66
  args[1] ||= {} # optional headers arg
29
67
  @client.call_adyen_api(@service, action, args[0], args[1], @version)
30
68
  end
@@ -33,7 +71,7 @@ module Adyen
33
71
 
34
72
  class CheckoutDetail < Service
35
73
  def initialize(client, version = DEFAULT_VERSION)
36
- @service = 'Checkout'
74
+ @service = "Checkout"
37
75
  @client = client
38
76
  @version = version
39
77
  end
@@ -48,4 +86,48 @@ module Adyen
48
86
  @client.call_adyen_api(@service, action, request, headers, @version)
49
87
  end
50
88
  end
89
+
90
+ class CheckoutLink < Service
91
+ def initialize(client, version = DEFAULT_VERSION)
92
+ @service = "Checkout"
93
+ @client = client
94
+ @version = version
95
+ end
96
+
97
+ def get(linkId, headers = {})
98
+ action = { method: 'get', url: "paymentLinks/" + linkId }
99
+ @client.call_adyen_api(@service, action, {}, headers, @version, true)
100
+ end
101
+
102
+ def update(linkId, request, headers = {})
103
+ action = { method: 'patch', url: "paymentLinks/" + linkId }
104
+ @client.call_adyen_api(@service, action, request, headers, @version, false)
105
+ end
106
+ end
107
+
108
+ class CheckoutMethod < Service
109
+ def initialize(client, version = DEFAULT_VERSION)
110
+ @service = "Checkout"
111
+ @client = client
112
+ @version = version
113
+ end
114
+
115
+ def balance(request, headers = {})
116
+ action = "paymentMethods/balance"
117
+ @client.call_adyen_api(@service, action, request, headers, @version, true)
118
+ end
119
+ end
120
+
121
+ class CheckoutOrder < Service
122
+ def initialize(client, version = DEFAULT_VERSION)
123
+ @service = "Checkout"
124
+ @client = client
125
+ @version = version
126
+ end
127
+
128
+ def cancel(request, headers = {})
129
+ action = "orders/cancel"
130
+ @client.call_adyen_api(@service, action, request, headers, @version)
131
+ end
132
+ end
51
133
  end
@@ -1,13 +1,14 @@
1
1
  require_relative 'service'
2
2
 
3
3
  module Adyen
4
- class CheckoutUtility < Service
4
+ class DataProtection < Service
5
+ attr_accessor :version
5
6
  DEFAULT_VERSION = 1
6
7
 
7
8
  def initialize(client, version = DEFAULT_VERSION)
8
- service = 'Checkout'
9
+ service = 'DataProtectionService'
9
10
  method_names = [
10
- :origin_keys
11
+ :request_subject_erasure
11
12
  ]
12
13
 
13
14
  super(client, version, service, method_names)
@@ -0,0 +1,20 @@
1
+ require_relative 'service'
2
+
3
+ module Adyen
4
+ class Dispute < Service
5
+ attr_accessor :version
6
+ DEFAULT_VERSION = 30
7
+
8
+ def initialize(client, version = DEFAULT_VERSION)
9
+ service = 'DisputeService'
10
+ method_names = [
11
+ :retrieve_applicable_defense_reasons,
12
+ :supply_defense_document,
13
+ :delete_dispute_defense_document,
14
+ :defend_dispute,
15
+ ]
16
+
17
+ super(client, version, service, method_names)
18
+ end
19
+ end
20
+ end
@@ -21,11 +21,15 @@ module Adyen
21
21
  def notification
22
22
  @notification ||= Adyen::Marketpay::Notification.new(@client)
23
23
  end
24
+
25
+ def hop
26
+ @hop ||= Adyen::Marketpay::Hop.new(@client)
27
+ end
24
28
  end
25
29
 
26
30
  class Account < Service
27
31
  attr_accessor :version
28
- DEFAULT_VERSION = 4
32
+ DEFAULT_VERSION = 6
29
33
 
30
34
  def initialize(client, version = DEFAULT_VERSION)
31
35
  service = 'Account'
@@ -40,11 +44,13 @@ module Adyen
40
44
  :update_account_holder_state,
41
45
  :delete_bank_accounts,
42
46
  :delete_shareholders,
47
+ :delete_signatories,
43
48
  :close_account,
44
49
  :close_account_holder,
45
- :get_tier_configuration,
46
50
  :suspend_account_holder,
47
- :un_suspend_account_holder
51
+ :un_suspend_account_holder,
52
+ :delete_payout_methods,
53
+ :check_account_holder
48
54
  ]
49
55
 
50
56
  super(client, version, service, method_names)
@@ -53,7 +59,7 @@ module Adyen
53
59
 
54
60
  class Fund < Service
55
61
  attr_accessor :version
56
- DEFAULT_VERSION = 3
62
+ DEFAULT_VERSION = 6
57
63
 
58
64
  def initialize(client, version = DEFAULT_VERSION)
59
65
  service = 'Fund'
@@ -63,7 +69,8 @@ module Adyen
63
69
  :account_holder_transaction_list,
64
70
  :refund_not_paid_out_transfers,
65
71
  :setup_beneficiary,
66
- :transfer_funds
72
+ :transfer_funds,
73
+ :refund_funds_transfer
67
74
  ]
68
75
 
69
76
  super(client, version, service, method_names)
@@ -72,7 +79,7 @@ module Adyen
72
79
 
73
80
  class Notification < Service
74
81
  attr_accessor :version
75
- DEFAULT_VERSION = 5
82
+ DEFAULT_VERSION = 6
76
83
 
77
84
  def initialize(client, version = DEFAULT_VERSION)
78
85
  service = 'Notification'
@@ -88,5 +95,19 @@ module Adyen
88
95
  super(client, version, service, method_names)
89
96
  end
90
97
  end
98
+
99
+ class Hop < Service
100
+ attr_accessor :version
101
+ DEFAULT_VERSION = 6
102
+
103
+ def initialize(client, version = DEFAULT_VERSION)
104
+ service = 'Hop'
105
+ method_names = [
106
+ :get_onboarding_url
107
+ ]
108
+
109
+ super(client, version, service, method_names)
110
+ end
111
+ end
91
112
  end
92
113
  end
@@ -1,12 +1,12 @@
1
- require_relative 'service'
1
+ require_relative "service"
2
2
 
3
3
  module Adyen
4
4
  class Payments < Service
5
5
  attr_accessor :version
6
- DEFAULT_VERSION = 50
6
+ DEFAULT_VERSION = 64
7
7
 
8
8
  def initialize(client, version = DEFAULT_VERSION)
9
- service = 'Payment'
9
+ service = "Payment"
10
10
  method_names = [
11
11
  :authorise,
12
12
  :authorise3d,
@@ -15,10 +15,20 @@ module Adyen
15
15
  :cancel,
16
16
  :refund,
17
17
  :cancel_or_refund,
18
- :adjust_authorisation
18
+ :adjust_authorisation,
19
+ :donate,
20
+ :get_authentication_result,
21
+ :technical_cancel,
22
+ :void_pending_refund,
23
+ :retrieve_3ds2_result
24
+ ]
25
+ with_application_info = [
26
+ :authorise,
27
+ :authorise3d,
28
+ :authorise3ds2
19
29
  ]
20
30
 
21
- super(client, version, service, method_names)
31
+ super(client, version, service, method_names, with_application_info)
22
32
  end
23
33
  end
24
34
  end
@@ -3,7 +3,7 @@ require_relative 'service'
3
3
  module Adyen
4
4
  class Payouts < Service
5
5
  attr_accessor :version
6
- DEFAULT_VERSION = 30
6
+ DEFAULT_VERSION = 64
7
7
 
8
8
  def initialize(client, version = DEFAULT_VERSION)
9
9
  service = 'Payout'
@@ -12,7 +12,8 @@ module Adyen
12
12
  :store_detail_and_submit_third_party,
13
13
  :submit_third_party,
14
14
  :confirm_third_party,
15
- :decline_third_party
15
+ :decline_third_party,
16
+ :payout
16
17
  ]
17
18
 
18
19
  super(client, version, service, method_names)
@@ -0,0 +1,19 @@
1
+ require_relative 'service'
2
+
3
+ module Adyen
4
+ class PosTerminalManagement < Service
5
+ attr_accessor :version
6
+ DEFAULT_VERSION = 1
7
+
8
+ def initialize(client, version = DEFAULT_VERSION)
9
+ service = 'Terminal'
10
+ method_names = [
11
+ :assign_terminals,
12
+ :find_terminal,
13
+ :get_terminals_under_account
14
+ ]
15
+
16
+ super(client, version, service, method_names)
17
+ end
18
+ end
19
+ end
@@ -3,14 +3,15 @@ require_relative 'service'
3
3
  module Adyen
4
4
  class Recurring < Service
5
5
  attr_accessor :version
6
- DEFAULT_VERSION = 30
6
+ DEFAULT_VERSION = 49
7
7
 
8
8
  def initialize(client, version = DEFAULT_VERSION)
9
9
  service = 'Recurring'
10
10
  method_names = [
11
11
  :list_recurring_details,
12
12
  :disable,
13
- :store_token
13
+ :store_token,
14
+ :schedule_account_updater
14
15
  ]
15
16
 
16
17
  super(client, version, service, method_names)
@@ -11,7 +11,7 @@ module Adyen
11
11
  method_name.to_s.gsub(/_./) { |x| x[1].upcase }
12
12
  end
13
13
 
14
- def initialize(client, version, service, method_names)
14
+ def initialize(client, version, service, method_names, with_application_info = [])
15
15
  @client = client
16
16
  @version = version
17
17
  @service = service
@@ -20,7 +20,7 @@ module Adyen
20
20
  method_names.each do |method_name|
21
21
  define_singleton_method method_name do |request, headers = {}|
22
22
  action = self.class.action_for_method_name(method_name)
23
- @client.call_adyen_api(@service, action, request, headers, @version)
23
+ @client.call_adyen_api(@service, action, request, headers, @version, with_application_info.include?(method_name))
24
24
  end
25
25
  end
26
26
  end
data/lib/adyen/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Adyen
2
2
  NAME = "adyen-ruby-api-library"
3
- VERSION = "4.0.1".freeze
3
+ VERSION = "6.0.0".freeze
4
4
  end
@@ -2,22 +2,14 @@ require_relative "adyen/version"
2
2
  require_relative "adyen/client"
3
3
  require_relative "adyen/errors"
4
4
  require_relative "adyen/services/checkout"
5
- require_relative "adyen/services/checkout_utility"
6
5
  require_relative "adyen/services/payments"
7
6
  require_relative "adyen/services/payouts"
8
7
  require_relative "adyen/services/recurring"
9
8
  require_relative "adyen/services/marketpay"
9
+ require_relative "adyen/services/postfmapi"
10
10
  require_relative "adyen/services/service"
11
+ require_relative "adyen/services/data_protection"
12
+ require_relative "adyen/services/dispute"
13
+ require_relative "adyen/services/bin_lookup"
11
14
  require_relative "adyen/hash_with_accessors"
12
15
  require_relative "adyen/utils/hmac_validator"
13
-
14
- # add snake case to camel case converter to String
15
- # to convert rubinic method names to Adyen API methods
16
- #
17
- # i.e. snake_case -> snakeCase
18
- # note that the first letter is not capitalized as normal
19
- class String
20
- def to_camel_case
21
- split("_").collect.with_index{ |x, i| i > 0 ? x.capitalize : x }.join
22
- end
23
- end
data/renovate.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": [
3
+ "config:base"
4
+ ]
5
+ }
data/spec/account_spec.rb CHANGED
@@ -20,7 +20,10 @@ RSpec.describe Adyen::Payments, service: "marketpay account service" do
20
20
  ["upload_document", "pspReference", "9914762681460244"],
21
21
  ["get_uploaded_documents", "pspReference", "9914694369860322"],
22
22
  ["delete_bank_accounts", "pspReference", "9914694372670551"],
23
- ["delete_shareholders", "pspReference", "9914694372990637"]
23
+ ["delete_shareholders", "pspReference", "9914694372990637"],
24
+ ["delete_signatories", "pspReference", "9914694372990637"],
25
+ ["delete_payout_methods", "pspReference", "9914694372990637"],
26
+ ["check_account_holder", "pspReference", "9914694372990637"],
24
27
  ]
25
28
 
26
29
  generate_tests(client, "Account", test_sets, client.marketpay.account)
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Adyen::BinLookup, service: "BIN lookup service" do
4
+ # client instance to be used in dynamically generated tests
5
+ client = create_client(:basic)
6
+
7
+ # methods / values to test for
8
+ # format is defined in spec_helper
9
+ test_sets = [
10
+ ["get_3ds_availability", "threeDS2supported", false],
11
+ ["get_cost_estimate", "resultCode", "Success"]
12
+ ]
13
+
14
+ generate_tests(client, "BinLookup", test_sets, client.bin_lookup)
15
+ end