adyen-ruby-api-library 6.0.0 → 10.1.2

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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -1
  3. data/.github/release.yml +18 -0
  4. data/.github/workflows/codeql.yml +37 -0
  5. data/.github/workflows/label_new_issues.yml +15 -0
  6. data/.github/workflows/release.yml +40 -0
  7. data/.github/workflows/ruby.yml +2 -2
  8. data/.github/workflows/rubygems_release.yml +18 -0
  9. data/.github/workflows/stale.yml +26 -0
  10. data/.gitignore +3 -0
  11. data/.rubocop.yml +8 -0
  12. data/CONTRIBUTING.md +1 -1
  13. data/Gemfile +7 -7
  14. data/Makefile +79 -0
  15. data/README.md +158 -20
  16. data/Rakefile +3 -3
  17. data/VERSION +2 -0
  18. data/adyen-ruby-api-library.gemspec +6 -3
  19. data/bin/console +2 -2
  20. data/lib/adyen/client.rb +213 -99
  21. data/lib/adyen/errors.rb +30 -22
  22. data/lib/adyen/hash_with_accessors.rb +12 -7
  23. data/lib/adyen/services/balanceControlService.rb +27 -0
  24. data/lib/adyen/services/balancePlatform/account_holders_api.rb +76 -0
  25. data/lib/adyen/services/balancePlatform/balance_accounts_api.rb +116 -0
  26. data/lib/adyen/services/balancePlatform/bank_account_validation_api.rb +26 -0
  27. data/lib/adyen/services/balancePlatform/card_orders_api.rb +36 -0
  28. data/lib/adyen/services/balancePlatform/grant_accounts_api.rb +26 -0
  29. data/lib/adyen/services/balancePlatform/grant_offers_api.rb +36 -0
  30. data/lib/adyen/services/balancePlatform/manage_card_pin_api.rb +46 -0
  31. data/lib/adyen/services/balancePlatform/manage_sca_devices_api.rb +56 -0
  32. data/lib/adyen/services/balancePlatform/network_tokens_api.rb +36 -0
  33. data/lib/adyen/services/balancePlatform/payment_instrument_groups_api.rb +46 -0
  34. data/lib/adyen/services/balancePlatform/payment_instruments_api.rb +86 -0
  35. data/lib/adyen/services/balancePlatform/platform_api.rb +46 -0
  36. data/lib/adyen/services/balancePlatform/transaction_rules_api.rb +56 -0
  37. data/lib/adyen/services/balancePlatform/transfer_routes_api.rb +26 -0
  38. data/lib/adyen/services/balancePlatform.rb +89 -0
  39. data/lib/adyen/services/binLookup.rb +37 -0
  40. data/lib/adyen/services/checkout/donations_api.rb +36 -0
  41. data/lib/adyen/services/checkout/modifications_api.rb +76 -0
  42. data/lib/adyen/services/checkout/orders_api.rb +46 -0
  43. data/lib/adyen/services/checkout/payment_links_api.rb +46 -0
  44. data/lib/adyen/services/checkout/payments_api.rb +76 -0
  45. data/lib/adyen/services/checkout/recurring_api.rb +46 -0
  46. data/lib/adyen/services/checkout/utility_api.rb +48 -0
  47. data/lib/adyen/services/checkout.rb +29 -108
  48. data/lib/adyen/services/dataProtection.rb +27 -0
  49. data/lib/adyen/services/disputes.rb +67 -0
  50. data/lib/adyen/services/legalEntityManagement/business_lines_api.rb +56 -0
  51. data/lib/adyen/services/legalEntityManagement/documents_api.rb +56 -0
  52. data/lib/adyen/services/legalEntityManagement/hosted_onboarding_api.rb +46 -0
  53. data/lib/adyen/services/legalEntityManagement/legal_entities_api.rb +76 -0
  54. data/lib/adyen/services/legalEntityManagement/pci_questionnaires_api.rb +66 -0
  55. data/lib/adyen/services/legalEntityManagement/tax_e_delivery_consent_api.rb +36 -0
  56. data/lib/adyen/services/legalEntityManagement/terms_of_service_api.rb +66 -0
  57. data/lib/adyen/services/legalEntityManagement/transfer_instruments_api.rb +56 -0
  58. data/lib/adyen/services/legalEntityManagement.rb +59 -0
  59. data/lib/adyen/services/management/account_company_level_api.rb +46 -0
  60. data/lib/adyen/services/management/account_merchant_level_api.rb +56 -0
  61. data/lib/adyen/services/management/account_store_level_api.rb +96 -0
  62. data/lib/adyen/services/management/allowed_origins_company_level_api.rb +56 -0
  63. data/lib/adyen/services/management/allowed_origins_merchant_level_api.rb +56 -0
  64. data/lib/adyen/services/management/android_files_company_level_api.rb +76 -0
  65. data/lib/adyen/services/management/api_credentials_company_level_api.rb +56 -0
  66. data/lib/adyen/services/management/api_credentials_merchant_level_api.rb +56 -0
  67. data/lib/adyen/services/management/api_key_company_level_api.rb +26 -0
  68. data/lib/adyen/services/management/api_key_merchant_level_api.rb +26 -0
  69. data/lib/adyen/services/management/client_key_company_level_api.rb +26 -0
  70. data/lib/adyen/services/management/client_key_merchant_level_api.rb +26 -0
  71. data/lib/adyen/services/management/my_api_credential_api.rb +76 -0
  72. data/lib/adyen/services/management/payment_methods_merchant_level_api.rb +76 -0
  73. data/lib/adyen/services/management/payout_settings_merchant_level_api.rb +66 -0
  74. data/lib/adyen/services/management/split_configuration_merchant_level_api.rb +106 -0
  75. data/lib/adyen/services/management/terminal_actions_company_level_api.rb +36 -0
  76. data/lib/adyen/services/management/terminal_actions_terminal_level_api.rb +26 -0
  77. data/lib/adyen/services/management/terminal_orders_company_level_api.rb +116 -0
  78. data/lib/adyen/services/management/terminal_orders_merchant_level_api.rb +116 -0
  79. data/lib/adyen/services/management/terminal_settings_company_level_api.rb +56 -0
  80. data/lib/adyen/services/management/terminal_settings_merchant_level_api.rb +56 -0
  81. data/lib/adyen/services/management/terminal_settings_store_level_api.rb +96 -0
  82. data/lib/adyen/services/management/terminal_settings_terminal_level_api.rb +56 -0
  83. data/lib/adyen/services/management/terminals_terminal_level_api.rb +36 -0
  84. data/lib/adyen/services/management/users_company_level_api.rb +56 -0
  85. data/lib/adyen/services/management/users_merchant_level_api.rb +56 -0
  86. data/lib/adyen/services/management/webhooks_company_level_api.rb +86 -0
  87. data/lib/adyen/services/management/webhooks_merchant_level_api.rb +86 -0
  88. data/lib/adyen/services/management.rb +164 -0
  89. data/lib/adyen/services/marketpay.rb +42 -36
  90. data/lib/adyen/services/payment.rb +149 -0
  91. data/lib/adyen/services/paymentsApp.rb +67 -0
  92. data/lib/adyen/services/payout/initialization_api.rb +46 -0
  93. data/lib/adyen/services/payout/instant_payouts_api.rb +26 -0
  94. data/lib/adyen/services/payout/reviewing_api.rb +36 -0
  95. data/lib/adyen/services/payout.rb +34 -0
  96. data/lib/adyen/services/posMobile.rb +27 -0
  97. data/lib/adyen/services/posTerminalManagement.rb +82 -0
  98. data/lib/adyen/services/recurring.rb +70 -13
  99. data/lib/adyen/services/service.rb +8 -2
  100. data/lib/adyen/services/storedValue.rb +77 -0
  101. data/lib/adyen/services/terminalCloudAPI.rb +38 -0
  102. data/lib/adyen/services/transfers/capital_api.rb +55 -0
  103. data/lib/adyen/services/transfers/transactions_api.rb +36 -0
  104. data/lib/adyen/services/transfers/transfers_api.rb +76 -0
  105. data/lib/adyen/services/transfers.rb +34 -0
  106. data/lib/adyen/utils/hmac_validator.rb +52 -22
  107. data/lib/adyen/version.rb +2 -2
  108. data/lib/adyen-ruby-api-library.rb +23 -15
  109. data/renovate.json +3 -3
  110. data/spec/account_spec.rb +20 -20
  111. data/spec/balance_control_spec.rb +43 -0
  112. data/spec/balance_platform_spec.rb +129 -0
  113. data/spec/bin_lookup_spec.rb +69 -11
  114. data/spec/checkout-oauth_spec.rb +588 -0
  115. data/spec/checkout_spec.rb +591 -314
  116. data/spec/client_spec.rb +240 -45
  117. data/spec/data_protection_spec.rb +4 -4
  118. data/spec/disputes_spec.rb +45 -0
  119. data/spec/errors_spec.rb +44 -15
  120. data/spec/fund_spec.rb +10 -10
  121. data/spec/hash_with_accessors_spec.rb +18 -8
  122. data/spec/hop_spec.rb +4 -4
  123. data/spec/lem_spec.rb +63 -0
  124. data/spec/management-oauth_spec.rb +62 -0
  125. data/spec/management_spec.rb +66 -0
  126. data/spec/mocks/requests/BalanceControl/balance_transfer.json +10 -0
  127. data/spec/mocks/requests/BalancePlatform/create_account_holder.json +5 -0
  128. data/spec/mocks/requests/BalancePlatform/update_account_holder.json +10 -0
  129. data/spec/mocks/requests/Checkout/amount_updates.json +22 -0
  130. data/spec/mocks/requests/Checkout/apple_pay_sessions.json +5 -0
  131. data/spec/mocks/requests/Checkout/capture.json +34 -0
  132. data/spec/mocks/requests/Checkout/generic_cancel.json +5 -0
  133. data/spec/mocks/requests/Checkout/modifications_request.json +0 -0
  134. data/spec/mocks/requests/Checkout/psp_cancel.json +4 -0
  135. data/spec/mocks/requests/Checkout/refund.json +34 -0
  136. data/spec/mocks/requests/DisputesService/retrieve_applicable_defense_reasons.json +4 -0
  137. data/spec/mocks/requests/LegalEntityManagement/create_business_line.json +15 -0
  138. data/spec/mocks/requests/Management/create_store.json +15 -0
  139. data/spec/mocks/requests/Recurring/create_permit.json +6 -0
  140. data/spec/mocks/requests/StoredValue/issue_giftcard.json +12 -0
  141. data/spec/mocks/requests/TerminalCloudAPI/connected_terminals.json +3 -0
  142. data/spec/mocks/requests/TerminalCloudAPI/sync_payment.json +29 -0
  143. data/spec/mocks/requests/Transfers/get_transactions.json +82 -0
  144. data/spec/mocks/requests/Transfers/make_transfer.json +32 -0
  145. data/spec/mocks/responses/BalanceControl/balance_transfer.json +14 -0
  146. data/spec/mocks/responses/BalancePlatform/create_account_holder.json +41 -0
  147. data/spec/mocks/responses/BalancePlatform/get_balance_account.json +15 -0
  148. data/spec/mocks/responses/BalancePlatform/update_account_holder.json +16 -0
  149. data/spec/mocks/responses/Checkout/amount_updates.json +24 -0
  150. data/spec/mocks/responses/Checkout/apple_pay_sessions.json +3 -0
  151. data/spec/mocks/responses/Checkout/capture.json +37 -0
  152. data/spec/mocks/responses/Checkout/generic_cancel.json +7 -0
  153. data/spec/mocks/responses/Checkout/modifications.json +0 -0
  154. data/spec/mocks/responses/Checkout/psp_cancel.json +7 -0
  155. data/spec/mocks/responses/Checkout/refund.json +37 -0
  156. data/spec/mocks/responses/Checkout/stored_payment_methods.json +1 -0
  157. data/spec/mocks/responses/DisputesService/retrieve_applicable_defense_reasons.json +71 -0
  158. data/spec/mocks/responses/LegalEntityManagement/create_business_line.json +17 -0
  159. data/spec/mocks/responses/Management/create_store.json +23 -0
  160. data/spec/mocks/responses/Management/get_companies.json +42 -0
  161. data/spec/mocks/responses/Recurring/create_permit.json +4 -0
  162. data/spec/mocks/responses/StoredValue/issue_giftcard.json +13 -0
  163. data/spec/mocks/responses/TerminalCloudAPI/connected_terminals.json +5 -0
  164. data/spec/mocks/responses/TerminalCloudAPI/sync_payment.json +18 -0
  165. data/spec/mocks/responses/Transfers/get_transactions.json +82 -0
  166. data/spec/mocks/responses/Transfers/make_transfer.json +36 -0
  167. data/spec/mocks/responses/Webhooks/backslash_webhook.json +41 -0
  168. data/spec/mocks/responses/Webhooks/colon_webhook.json +41 -0
  169. data/spec/mocks/responses/Webhooks/forwardslash_webhook.json +41 -0
  170. data/spec/mocks/responses/Webhooks/mixed_webhook.json +41 -0
  171. data/spec/notification_spec.rb +9 -9
  172. data/spec/payments_spec.rb +39 -22
  173. data/spec/payouts_spec.rb +39 -15
  174. data/spec/pos_terminal_management_spec.rb +44 -0
  175. data/spec/recurring_spec.rb +8 -8
  176. data/spec/service_spec.rb +4 -0
  177. data/spec/spec_helper.rb +42 -46
  178. data/spec/stored_value_spec.rb +44 -0
  179. data/spec/terminal_cloud_api_spec.rb +91 -0
  180. data/spec/transfers_spec.rb +64 -0
  181. data/spec/utils/hmac_validator_spec.rb +53 -23
  182. data/templates/api-single.mustache +32 -0
  183. data/templates/api-small.mustache +39 -0
  184. data/templates/api.mustache +38 -0
  185. data/templates/config.yaml +10 -0
  186. metadata +160 -47
  187. data/.github/dependabot.yml +0 -8
  188. data/docs/checkout.html +0 -128
  189. data/docs/index.html +0 -50
  190. data/docs/install-library.html +0 -61
  191. data/docs/javascripts/prism.js +0 -5
  192. data/docs/javascripts/scale.fix.js +0 -17
  193. data/docs/marketpay.html +0 -171
  194. data/docs/params.json +0 -1
  195. data/docs/payment.html +0 -106
  196. data/docs/payout.html +0 -135
  197. data/docs/recurring.html +0 -113
  198. data/docs/stylesheets/github-light.css +0 -115
  199. data/docs/stylesheets/prism.css +0 -140
  200. data/docs/stylesheets/styles.css +0 -324
  201. data/docs/using-library.html +0 -67
  202. data/lib/adyen/services/bin_lookup.rb +0 -18
  203. data/lib/adyen/services/data_protection.rb +0 -17
  204. data/lib/adyen/services/dispute.rb +0 -20
  205. data/lib/adyen/services/payments.rb +0 -34
  206. data/lib/adyen/services/payouts.rb +0 -22
  207. data/lib/adyen/services/postfmapi.rb +0 -19
  208. data/spec/dispute_spec.rb +0 -17
  209. data/spec/mocks/requests/DisputeService/defend_dispute.json +0 -5
  210. data/spec/mocks/requests/DisputeService/delete_dispute_defense_document.json +0 -5
  211. data/spec/mocks/requests/DisputeService/retrieve_applicable_defense_reasons.json +0 -4
  212. data/spec/mocks/requests/DisputeService/supply_defense_document.json +0 -11
  213. data/spec/mocks/requests/Recurring/store_token.json +0 -15
  214. data/spec/mocks/responses/DisputeService/defend_dispute.json +0 -5
  215. data/spec/mocks/responses/DisputeService/delete_dispute_defense_document.json +0 -5
  216. data/spec/mocks/responses/DisputeService/retrieve_applicable_defense_reasons.json +0 -28
  217. data/spec/mocks/responses/DisputeService/supply_defense_document.json +0 -5
  218. data/spec/mocks/responses/Recurring/store_token.json +0 -7
  219. data/spec/postfmapi_spec.rb +0 -16
data/spec/payouts_spec.rb CHANGED
@@ -1,19 +1,43 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
+ require 'json'
2
3
 
3
- RSpec.describe Adyen::Payments, service: "payouts service" do
4
- # client instance to be used in dynamically generated tests
5
- client = create_client(:basic)
4
+ RSpec.describe Adyen::Payout, service: 'Payout' do
5
+ before(:all) do
6
+ @shared_values = {
7
+ client: create_client(:api_key),
8
+ service: 'Payout'
9
+ }
10
+ end
6
11
 
7
- # methods / values to test for
8
- # format is defined in spec_helper
9
- test_sets = [
10
- ["store_detail", "resultCode", "Success"],
11
- ["store_detail_and_submit_third_party", "resultCode", "[payout-submit-received]"],
12
- ["submit_third_party", "resultCode", "[payout-submit-received]"],
13
- ["confirm_third_party", "response", "[payout-confirm-received]"],
14
- ["decline_third_party", "response", "[payout-decline-received]"],
15
- ["payout", "resultCode", "Success"]
16
- ]
12
+ # must be created manually because every field in the response is an array
13
+ it 'makes a business_lines POST call' do
14
+ request_body = JSON.parse(json_from_file('mocks/requests/Payout/confirm_third_party.json'))
17
15
 
18
- generate_tests(client, "Payout", test_sets, client.payouts)
16
+ response_body = json_from_file('mocks/responses/Payout/confirm_third_party.json')
17
+
18
+ url = @shared_values[:client].service_url(@shared_values[:service], 'confirmThirdParty',
19
+ @shared_values[:client].payout.version)
20
+ WebMock.stub_request(:post, url)
21
+ .with(
22
+ body: request_body,
23
+ headers: {
24
+ 'x-api-key' => @shared_values[:client].api_key
25
+ }
26
+ )
27
+ .to_return(
28
+ body: response_body
29
+ )
30
+
31
+ result = @shared_values[:client].payout.reviewing_api.confirm_third_party(request_body)
32
+ response_hash = result.response
33
+
34
+ expect(result.status)
35
+ .to eq(200)
36
+ expect(response_hash)
37
+ .to eq(JSON.parse(response_body))
38
+ expect(response_hash)
39
+ .to be_a Adyen::HashWithAccessors
40
+ expect(response_hash)
41
+ .to be_a_kind_of Hash
42
+ end
19
43
  end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+ require 'json'
3
+
4
+ RSpec.describe Adyen::PosTerminalManagement, service: 'PosTerminalManagement' do
5
+ before(:all) do
6
+ @shared_values = {
7
+ client: create_client(:api_key),
8
+ service: 'LegalEntityManagement'
9
+ }
10
+ end
11
+
12
+ # must be created manually because every field in the response is an array
13
+ it 'makes a assign_terminals POST call' do
14
+ request_body = JSON.parse(json_from_file('mocks/requests/Terminal/assign_terminals.json'))
15
+
16
+ response_body = json_from_file('mocks/responses/Terminal/assign_terminals.json')
17
+
18
+ url = @shared_values[:client].service_url(@shared_values[:service], 'assignTerminals',
19
+ @shared_values[:client].pos_terminal_management.version)
20
+ WebMock.stub_request(:post, url)
21
+ .with(
22
+ body: request_body,
23
+ headers: {
24
+ 'x-api-key' => @shared_values[:client].api_key
25
+ }
26
+ )
27
+ .to_return(
28
+ body: response_body
29
+ )
30
+
31
+ result = @shared_values[:client].pos_terminal_management.assign_terminals(request_body)
32
+ response_hash = result.response
33
+
34
+ expect(result.status)
35
+ .to eq(200)
36
+ expect(response_hash)
37
+ .to eq(JSON.parse(response_body))
38
+ expect(response_hash)
39
+ .to be_a Adyen::HashWithAccessors
40
+ expect(response_hash)
41
+ .to be_a_kind_of Hash
42
+ end
43
+ end
44
+ # rubocop:enable Metrics/BlockLength
@@ -1,18 +1,18 @@
1
- require "spec_helper"
2
- require_relative "../lib/adyen/errors"
1
+ require 'spec_helper'
2
+ require_relative '../lib/adyen/errors'
3
3
 
4
- RSpec.describe Adyen::Payments, service: "recurring service" do
4
+ RSpec.describe Adyen::Payment, service: 'recurring service' do
5
5
  # client instance to be used in dynamically generated tests
6
6
  client = create_client(:basic)
7
7
 
8
8
  # methods / values to test for
9
9
  # format is defined in spec_helper
10
10
  test_sets = [
11
- ["list_recurring_details", "creationDate", "2017-03-01T11:53:11+01:00"],
12
- ["disable", "response", "[detail-successfully-disabled]"],
13
- ["store_token", "result", "Success"],
14
- ["schedule_account_updater", "result", "Success"]
11
+ ['list_recurring_details', 'creationDate', '2017-03-01T11:53:11+01:00'],
12
+ ['disable', 'response', '[detail-successfully-disabled]'],
13
+ ['create_permit', 'pspReference', '8815260599791117'],
14
+ ['schedule_account_updater', 'result', 'Success']
15
15
  ]
16
16
 
17
- generate_tests(client, "Recurring", test_sets, client.recurring)
17
+ generate_tests(client, 'Recurring', test_sets, client.recurring)
18
18
  end
data/spec/service_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # rubocop:disable Layout/LineLength
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe Adyen::Service do
@@ -44,3 +46,5 @@ RSpec.describe Adyen::Service do
44
46
  end
45
47
  end
46
48
  end
49
+ # rubocop:enable Layout/LineLength
50
+ # rubocop:enable Metrics/BlockLength
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,9 @@
1
- require "webmock/rspec"
2
- require "base64"
3
- require_relative "../lib/adyen-ruby-api-library"
1
+ # rubocop:disable Metrics/MethodLength
2
+ # rubocop:disable Metrics/AbcSize
3
+
4
+ require 'webmock/rspec'
5
+ require 'base64'
6
+ require_relative '../lib/adyen-ruby-api-library'
4
7
 
5
8
  # disable external connections
6
9
  WebMock.disable_net_connect!(allow_localhost: true)
@@ -18,57 +21,48 @@ def create_test(client, service, method_name, parent_object)
18
21
  request_body = JSON.parse(json_from_file("mocks/requests/#{service}/#{method_name}.json"))
19
22
  response_body = json_from_file("mocks/responses/#{service}/#{method_name}.json")
20
23
 
21
- with_application_info = [
22
- "authorise",
23
- "authorise3d",
24
- "authorise3ds2",
25
- "payments",
26
- "payment_session",
27
- ]
28
- if with_application_info.include?(method_name)
29
- client.add_application_info(request_body)
30
- end
31
-
32
24
  # client-generated headers
33
25
  headers = {
34
- "Content-Type".to_sym => "application/json",
26
+ 'Content-Type'.to_sym => 'application/json'
35
27
  }
36
28
 
37
29
  # authentication headers
38
- if not client.api_key.nil?
39
- headers["x-api-key"] = client.api_key
40
- elsif not client.ws_user.nil? and not client.ws_password.nil?
41
- auth_header = "Basic " + Base64::encode64("#{client.ws_user}:#{client.ws_password}")
42
- headers["Authorization"] = auth_header.strip
30
+ if !client.api_key.nil?
31
+ headers['x-api-key'] = client.api_key
32
+ elsif !client.oauth_token.nil?
33
+ headers["Authorization"] = "Bearer #{client.oauth_token}"
34
+ elsif !client.ws_user.nil? && !client.ws_password.nil?
35
+ auth_header = "Basic #{Base64.encode64("#{client.ws_user}:#{client.ws_password}")}"
36
+ headers['Authorization'] = auth_header.strip
43
37
  else
44
- raise ArgumentError, "Authentication not set correctly in test case"
38
+ raise ArgumentError, 'Authentication not set correctly in test case'
45
39
  end
46
40
 
47
41
  # stub request
48
42
  action = Adyen::Service.action_for_method_name(method_name)
49
43
  url = client.service_url(service, action, parent_object.version)
50
- WebMock.stub_request(:post, url).
51
- with(
52
- body: request_body,
53
- headers: headers,
54
- ).
55
- to_return(
56
- body: response_body,
57
- )
44
+ WebMock.stub_request(:post, url)
45
+ .with(
46
+ body: request_body,
47
+ headers: headers
48
+ )
49
+ .to_return(
50
+ body: response_body
51
+ )
58
52
  result = parent_object.public_send(method_name, request_body)
59
53
 
60
54
  # result.response is already a Ruby object (Adyen::HashWithAccessors) (rather than an unparsed JSON string)
61
55
  response_hash = result.response
62
56
 
63
57
  # boilerplate error checks
64
- expect(result.status).
65
- to eq(200)
66
- expect(response_hash).
67
- to eq(JSON.parse(response_body))
68
- expect(response_hash).
69
- to be_a Adyen::HashWithAccessors
70
- expect(response_hash).
71
- to be_a_kind_of Hash
58
+ expect(result.status)
59
+ .to eq(200)
60
+ expect(response_hash)
61
+ .to eq(JSON.parse(response_body))
62
+ expect(response_hash)
63
+ .to be_a Adyen::HashWithAccessors
64
+ expect(response_hash)
65
+ .to be_a_kind_of Hash
72
66
 
73
67
  response_hash
74
68
  end
@@ -80,26 +74,28 @@ def generate_tests(client, service, test_sets, parent_object)
80
74
  test_sets.each do |test_set|
81
75
  it "makes a #{test_set[0]} call" do
82
76
  parsed_body = create_test(client, service, test_set[0], parent_object)
83
- expect(parsed_body[test_set[1]]).
84
- to eq(test_set[2])
77
+ expect(parsed_body[test_set[1]])
78
+ .to eq(test_set[2])
85
79
  end
86
80
  end
87
81
  end
88
82
 
89
83
  # create and return a client for testing
90
- # auth_type must be one of [:basic, :api_key]
84
+ # auth_type must be one of [:basic, :api_key, :oauth]
91
85
  def create_client(auth_type)
92
86
  client = Adyen::Client.new
93
87
  client.env = :mock
94
-
95
88
  if auth_type == :basic
96
- client.ws_user = "user"
97
- client.ws_password = "password"
89
+ client.ws_user = 'user'
90
+ client.ws_password = 'password'
91
+ elsif auth_type == :oauth
92
+ client.oauth_token = 'oauth_token'
98
93
  elsif auth_type == :api_key
99
- client.api_key = "api_key"
94
+ client.api_key = 'api_key'
100
95
  else
101
- raise ArgumentError "Invalid auth type for test client"
96
+ raise ArgumentError 'Invalid auth type for test client'
102
97
  end
103
-
104
98
  client
105
99
  end
100
+ # rubocop:enable Metrics/MethodLength
101
+ # rubocop:enable Metrics/AbcSize
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+ require 'json'
3
+
4
+ RSpec.describe Adyen::BalancePlatform, service: 'balancePlatform' do
5
+ before(:all) do
6
+ @shared_values = {
7
+ client: create_client(:api_key),
8
+ service: 'BalancePlatform'
9
+ }
10
+ end
11
+
12
+ # must be created manually because every field in the response is an array
13
+ it 'makes a issue POST call' do
14
+ request_body = JSON.parse(json_from_file('mocks/requests/StoredValue/issue_giftcard.json'))
15
+
16
+ response_body = json_from_file('mocks/responses/StoredValue/issue_giftcard.json')
17
+
18
+ url = @shared_values[:client].service_url(@shared_values[:service], 'issue',
19
+ @shared_values[:client].stored_value.version)
20
+ WebMock.stub_request(:post, url)
21
+ .with(
22
+ body: request_body,
23
+ headers: {
24
+ 'x-api-key' => @shared_values[:client].api_key
25
+ }
26
+ )
27
+ .to_return(
28
+ body: response_body
29
+ )
30
+
31
+ result = @shared_values[:client].stored_value.issue(request_body)
32
+ response_hash = result.response
33
+
34
+ expect(result.status)
35
+ .to eq(200)
36
+ expect(response_hash)
37
+ .to eq(JSON.parse(response_body))
38
+ expect(response_hash)
39
+ .to be_a Adyen::HashWithAccessors
40
+ expect(response_hash)
41
+ .to be_a_kind_of Hash
42
+ end
43
+ end
44
+ # rubocop:enable Metrics/BlockLength
@@ -0,0 +1,91 @@
1
+ require 'spec_helper'
2
+ require 'json'
3
+
4
+ RSpec.describe Adyen::TerminalCloudAPI, service: 'TerminalCloudAPI' do
5
+ before(:all) do
6
+ @shared_values = {
7
+ client: create_client(:api_key),
8
+ service: 'TerminalCloudAPI'
9
+ }
10
+ end
11
+
12
+ it 'makes a connectedTerminals POST call' do
13
+ request_body = JSON.parse(json_from_file('mocks/requests/TerminalCloudAPI/connected_terminals.json'))
14
+
15
+ response_body = json_from_file('mocks/responses/TerminalCloudAPI/connected_terminals.json')
16
+
17
+ url = @shared_values[:client].service_url(@shared_values[:service], 'connectedTerminals', nil)
18
+ WebMock.stub_request(:post, url)
19
+ .with(
20
+ headers: {
21
+ 'x-api-key' => @shared_values[:client].api_key
22
+ }
23
+ )
24
+ .to_return(
25
+ body: response_body
26
+ )
27
+
28
+ result = @shared_values[:client].terminal_cloud_api.connected_terminals(request_body)
29
+ response_hash = result.response
30
+
31
+ expect(result.status)
32
+ .to eq(200)
33
+ expect(response_hash)
34
+ .to eq(JSON.parse(response_body))
35
+ expect(response_hash)
36
+ .to be_a Adyen::HashWithAccessors
37
+ expect(response_hash)
38
+ .to be_a_kind_of Hash
39
+ end
40
+
41
+ it 'makes a sync payment POST call' do
42
+ request_body = JSON.parse(json_from_file('mocks/requests/TerminalCloudAPI/sync_payment.json'))
43
+
44
+ response_body = json_from_file('mocks/responses/TerminalCloudAPI/sync_payment.json')
45
+
46
+ url = @shared_values[:client].service_url(@shared_values[:service], 'sync', nil)
47
+ WebMock.stub_request(:post, url)
48
+ .with(
49
+ headers: {
50
+ 'x-api-key' => @shared_values[:client].api_key
51
+ }
52
+ )
53
+ .to_return(
54
+ body: response_body
55
+ )
56
+
57
+ result = @shared_values[:client].terminal_cloud_api.sync(request_body)
58
+ response_hash = result.response
59
+
60
+ expect(result.status)
61
+ .to eq(200)
62
+ expect(response_hash)
63
+ .to eq(JSON.parse(response_body))
64
+ expect(response_hash)
65
+ .to be_a Adyen::HashWithAccessors
66
+ expect(response_hash)
67
+ .to be_a_kind_of Hash
68
+ end
69
+
70
+ it 'makes an async payment POST call' do
71
+ request_body = JSON.parse(json_from_file('mocks/requests/TerminalCloudAPI/sync_payment.json'))
72
+
73
+ url = @shared_values[:client].service_url(@shared_values[:service], 'async', nil)
74
+ WebMock.stub_request(:post, url)
75
+ .with(
76
+ headers: {
77
+ 'x-api-key' => @shared_values[:client].api_key
78
+ }
79
+ )
80
+ .to_return(
81
+ body: 'ok'
82
+ )
83
+
84
+ result = @shared_values[:client].terminal_cloud_api.async(request_body)
85
+ response_hash = result.response
86
+
87
+ expect(result.status)
88
+ .to eq(200)
89
+ end
90
+ end
91
+ # rubocop:enable Metrics/BlockLength
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+ require 'json'
3
+
4
+ RSpec.describe Adyen::Transfers, service: 'transfers' do
5
+ before(:all) do
6
+ @shared_values = {
7
+ client: create_client(:api_key),
8
+ service: 'Transfers'
9
+ }
10
+ end
11
+
12
+ it 'makes a transfers POST call' do
13
+ request_body = JSON.parse(json_from_file('mocks/requests/Transfers/make_transfer.json'))
14
+
15
+ response_body = json_from_file('mocks/responses/Transfers/make_transfer.json')
16
+
17
+ url = @shared_values[:client].service_url(@shared_values[:service], 'transfers',
18
+ @shared_values[:client].transfers.version)
19
+ WebMock.stub_request(:post, url)
20
+ .with(
21
+ body: request_body,
22
+ headers: {
23
+ 'x-api-key' => @shared_values[:client].api_key
24
+ }
25
+ )
26
+ .to_return(
27
+ body: response_body
28
+ )
29
+
30
+ result = @shared_values[:client].transfers.transfers_api.transfer_funds(request_body)
31
+
32
+ expect(result.status)
33
+ .to eq(200)
34
+ end
35
+
36
+ it 'makes a transactions GET call' do
37
+ response_body = json_from_file('mocks/responses/Transfers/make_transfer.json')
38
+
39
+ url = @shared_values[:client].service_url(
40
+ @shared_values[:service],
41
+ 'transactions?createdUntil=2021-05-30T15%3A07%3A40Z&createdSince=2021-05-30T15%3A07%3A40Z',
42
+ @shared_values[:client].transfers.version
43
+ )
44
+ WebMock.stub_request(:get, url)
45
+ .with(
46
+ headers: {
47
+ 'x-api-key' => @shared_values[:client].api_key
48
+ }
49
+ )
50
+ .to_return(
51
+ body: response_body
52
+ )
53
+
54
+ result = @shared_values[:client].transfers.transactions_api.get_all_transactions(
55
+ query_params: {
56
+ 'createdUntil' => '2021-05-30T15:07:40Z', 'createdSince' => '2021-05-30T15:07:40Z'
57
+ }
58
+ )
59
+
60
+ expect(result.status)
61
+ .to eq(200)
62
+ end
63
+ end
64
+ # rubocop:enable Metrics/BlockLength
@@ -4,49 +4,79 @@ RSpec.describe Adyen::Utils::HmacValidator do
4
4
  let(:validator) { described_class.new }
5
5
  let(:key) { '44782DEF547AAA06C910C43932B1EB0C71FC68D9D0C057550C48EC2ACF6BA056' }
6
6
  let(:expected_sign) { 'coqCmt/IZ4E3CzPvMY8zTjQVL5hYJUiBRg8UU+iCWo0=' }
7
- let(:notification_request_item) do
7
+ let(:webhook_request_item) do
8
8
  {
9
- additionalData: {
10
- hmacSignature: expected_sign
9
+ 'additionalData' => {
10
+ 'hmacSignature' => expected_sign
11
11
  },
12
- amount: {
13
- value: 1130,
14
- currency: 'EUR'
12
+ 'amount' => {
13
+ 'value' => 1130,
14
+ 'currency' => 'EUR'
15
15
  },
16
- pspReference: '7914073381342284',
17
- eventCode: 'AUTHORISATION',
18
- merchantAccountCode: 'TestMerchant',
19
- merchantReference: 'TestPayment-1407325143704',
20
- paymentMethod: 'visa',
21
- success: 'true'
16
+ 'pspReference' => '7914073381342284',
17
+ 'eventCode' => 'AUTHORISATION',
18
+ 'merchantAccountCode' => 'TestMerchant',
19
+ 'merchantReference' => 'TestPayment-1407325143704',
20
+ 'paymentMethod' => 'visa',
21
+ 'success' => 'true'
22
22
  }
23
23
  end
24
24
 
25
25
  describe 'HMAC Validator' do
26
26
  it 'should get correct data' do
27
- data_to_sign = validator.data_to_sign(notification_request_item)
27
+ data_to_sign = validator.data_to_sign(webhook_request_item)
28
28
  expect(data_to_sign).to eq '7914073381342284::TestMerchant:TestPayment-1407325143704:1130:EUR:AUTHORISATION:true'
29
29
  end
30
30
 
31
- it 'should get correct data with escaped characters' do
32
- notification_request_item['merchantAccountCode'] = 'Test:\\Merchant'
33
- data_to_sign = validator.data_to_sign(notification_request_item)
34
- expect(data_to_sign).to eq '7914073381342284::Test\\:\\Merchant:TestPayment-1407325143704:1130:EUR:AUTHORISATION:true'
35
- end
36
-
37
31
  it 'should encrypt properly' do
38
- encrypted = validator.calculate_notification_hmac(notification_request_item, key)
32
+ encrypted = validator.calculate_webhook_hmac(webhook_request_item, key)
39
33
  expect(encrypted).to eq expected_sign
40
34
  end
41
35
 
42
36
  it 'should have a valid hmac' do
43
- expect(validator.valid_notification_hmac?(notification_request_item, key)).to be true
37
+ expect(validator.valid_webhook_hmac?(webhook_request_item, key)).to be true
44
38
  end
45
39
 
46
40
  it 'should have an invalid hmac' do
47
- notification_request_item['additionalData'] = { 'hmacSignature' => 'invalidHMACsign' }
41
+ webhook_request_item['additionalData'] = { 'hmacSignature' => 'invalidHMACsign' }
48
42
 
49
- expect(validator.valid_notification_hmac?(notification_request_item, key)).to be false
43
+ expect(validator.valid_webhook_hmac?(webhook_request_item, key)).to be false
50
44
  end
45
+
46
+ it 'should validate backslashes correctly' do
47
+ webhook = JSON.parse(json_from_file('mocks/responses/Webhooks/backslash_webhook.json'))
48
+ expect(validator.valid_webhook_hmac?(webhook, '74F490DD33F7327BAECC88B2947C011FC02D014A473AAA33A8EC93E4DC069174')).to be true
49
+ end
50
+
51
+ it 'should validate colons correctly' do
52
+ webhook = JSON.parse(json_from_file('mocks/responses/Webhooks/colon_webhook.json'))
53
+ expect(validator.valid_webhook_hmac?(webhook, '74F490DD33F7327BAECC88B2947C011FC02D014A473AAA33A8EC93E4DC069174')).to be true
54
+ end
55
+
56
+ it 'should validate forward slashes correctly' do
57
+ webhook = JSON.parse(json_from_file('mocks/responses/Webhooks/forwardslash_webhook.json'))
58
+ expect(validator.valid_webhook_hmac?(webhook, '74F490DD33F7327BAECC88B2947C011FC02D014A473AAA33A8EC93E4DC069174')).to be true
59
+ end
60
+
61
+ it 'should validate mix of slashes and colon correctly' do
62
+ webhook = JSON.parse(json_from_file('mocks/responses/Webhooks/mixed_webhook.json'))
63
+ expect(validator.valid_webhook_hmac?(webhook, '74F490DD33F7327BAECC88B2947C011FC02D014A473AAA33A8EC93E4DC069174')).to be true
64
+ end
65
+
66
+ it 'should have an invalid payload hmac' do
67
+ hmac_signature = "wrong signature"
68
+ payload = json_from_file('mocks/responses/Webhooks/mixed_webhook.json')
69
+
70
+ expect(validator.valid_webhook_payload_hmac?(hmac_signature, key, payload)).to be false
71
+ end
72
+
73
+ it 'should have an valid payload hmac' do
74
+ hmac_signature = "93Av9t6OVkYCrVHU/xgiTkWGbulJz+Vcm2qO4TYQH2Q="
75
+ payload = json_from_file('mocks/responses/Webhooks/mixed_webhook.json')
76
+
77
+ expect(validator.valid_webhook_payload_hmac?(hmac_signature, key, payload)).to be true
78
+ end
79
+
51
80
  end
52
81
  end
82
+ # rubocop:enable Metrics/BlockLength
@@ -0,0 +1,32 @@
1
+ {{#apiInfo}}
2
+ {{#apis}}
3
+ require_relative '{{serviceName}}/{{#lambda.snakecase}}{{classname}}{{/lambda.snakecase}}'
4
+ {{/apis}}
5
+ {{/apiInfo}}
6
+
7
+ module Adyen
8
+
9
+ # NOTE: This class is auto generated by OpenAPI Generator
10
+ # Ref: https://openapi-generator.tech
11
+ #
12
+ # Do not edit the class manually.
13
+ class {{#lambda.titlecase}}{{serviceName}}{{/lambda.titlecase}}
14
+ attr_accessor :service, :version
15
+
16
+ DEFAULT_VERSION = {{version}}
17
+ def initialize(client, version = DEFAULT_VERSION)
18
+ @service = '{{#lambda.titlecase}}{{serviceName}}{{/lambda.titlecase}}'
19
+ @client = client
20
+ @version = version
21
+ end
22
+
23
+ {{#apiInfo}}
24
+ {{#apis}}
25
+ def {{classFilename}}
26
+ @{{classFilename}} ||= Adyen::{{classname}}.new(@client, @version)
27
+ end
28
+
29
+ {{/apis}}
30
+ {{/apiInfo}}
31
+ end
32
+ end
@@ -0,0 +1,39 @@
1
+ require_relative './service'
2
+ module Adyen
3
+ {{#operations}}
4
+
5
+ # NOTE: This class is auto generated by OpenAPI Generator
6
+ # Ref: https://openapi-generator.tech
7
+ #
8
+ # Do not edit the class manually.
9
+ class {{#lambda.titlecase}}{{serviceName}}{{/lambda.titlecase}} < Service
10
+ attr_accessor :service, :version
11
+
12
+ DEFAULT_VERSION = {{version}}
13
+ def initialize(client, version = DEFAULT_VERSION)
14
+ super(client, version, '{{#lambda.titlecase}}{{serviceName}}{{/lambda.titlecase}}')
15
+ end
16
+
17
+ {{#operation}}
18
+ # {{{summary}}}{{^summary}}{{operationId}}{{/summary}}{{#isDeprecated}}
19
+ #
20
+ # Deprecated {{#vendorExtensions.x-deprecatedInVersion}}since {{#appName}}{{{.}}}{{/appName}} v{{.}}{{/vendorExtensions.x-deprecatedInVersion}}{{#vendorExtensions.x-deprecatedMessage}}
21
+ # {{{.}}}{{/vendorExtensions.x-deprecatedMessage}}{{/isDeprecated}}
22
+ def {{#lambda.snakecase}}{{#vendorExtensions.x-methodName}}{{.}}{{/vendorExtensions.x-methodName}}{{^vendorExtensions.x-methodName}}{{nickname}}{{/vendorExtensions.x-methodName}}{{/lambda.snakecase}}({{#bodyParams}}request, {{/bodyParams}}{{#requiredParams}}{{^isQueryParam}}{{#lambda.snakecase}}{{paramName}}{{/lambda.snakecase}}, {{/isQueryParam}}{{/requiredParams}}headers: {}{{#queryParams}}{{#-first}}, query_params: {}{{/-first}}{{/queryParams}})
23
+ endpoint = '{{path}}'.gsub(/{.+?}/, '%s')
24
+ endpoint = endpoint.gsub(%r{^/}, '')
25
+ endpoint = format(endpoint{{#pathParams}}{{#lambda.snakecase}}, {{paramName}}{{/lambda.snakecase}}{{/pathParams}})
26
+ {{#queryParams}}{{#-first}}endpoint += create_query_string(query_params){{/-first}}{{/queryParams}}
27
+ action = { method: '{{#lambda.lowercase}}{{httpMethod}}{{/lambda.lowercase}}', url: endpoint }
28
+ {{#bodyParams}}
29
+ @client.call_adyen_api(@service, action, request, headers, @version)
30
+ {{/bodyParams}}
31
+ {{^bodyParams}}
32
+ @client.call_adyen_api(@service, action, {}, headers, @version)
33
+ {{/bodyParams}}
34
+ end
35
+
36
+ {{/operation}}
37
+ {{/operations}}
38
+ end
39
+ end