adyen-ruby-api-library 11.2.0 → 12.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 (214) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -1
  3. data/.github/workflows/codeql.yml +4 -4
  4. data/.github/workflows/release.yml +1 -1
  5. data/.github/workflows/ruby.yml +3 -3
  6. data/.github/workflows/rubygems_release.yml +1 -1
  7. data/.github/workflows/stale.yml +1 -1
  8. data/Gemfile +2 -2
  9. data/README.md +30 -7
  10. data/VERSION +1 -1
  11. data/adyen-ruby-api-library.gemspec +1 -1
  12. data/lib/adyen/client.rb +10 -16
  13. data/lib/adyen/deprecation.rb +34 -0
  14. data/lib/adyen/services/balanceControl/balance_control_api.rb +3 -3
  15. data/lib/adyen/services/balancePlatform/account_holders_api.rb +14 -18
  16. data/lib/adyen/services/balancePlatform/authorized_card_users_api.rb +4 -12
  17. data/lib/adyen/services/balancePlatform/balance_accounts_api.rb +5 -65
  18. data/lib/adyen/services/balancePlatform/balances_api.rb +5 -15
  19. data/lib/adyen/services/balancePlatform/bank_account_validation_api.rb +1 -3
  20. data/lib/adyen/services/balancePlatform/card_orders_api.rb +2 -6
  21. data/lib/adyen/services/balancePlatform/custom_payout_schedules_sweeps_api.rb +56 -0
  22. data/lib/adyen/services/balancePlatform/direct_debit_mandates_api.rb +48 -0
  23. data/lib/adyen/services/balancePlatform/grant_accounts_api.rb +3 -3
  24. data/lib/adyen/services/balancePlatform/grant_offers_api.rb +6 -6
  25. data/lib/adyen/services/balancePlatform/manage_card_pin_api.rb +3 -9
  26. data/lib/adyen/services/balancePlatform/manage_sca_devices_api.rb +6 -18
  27. data/lib/adyen/services/balancePlatform/managed_payout_schedules_api.rb +80 -0
  28. data/lib/adyen/services/balancePlatform/network_tokens_api.rb +2 -6
  29. data/lib/adyen/services/balancePlatform/payment_instrument_groups_api.rb +3 -9
  30. data/lib/adyen/services/balancePlatform/payment_instruments_api.rb +9 -27
  31. data/lib/adyen/services/balancePlatform/platform_api.rb +3 -9
  32. data/lib/adyen/services/balancePlatform/recurring_top_ups_api.rb +48 -0
  33. data/lib/adyen/services/balancePlatform/sca_association_management_api.rb +3 -9
  34. data/lib/adyen/services/balancePlatform/sca_device_management_api.rb +11 -9
  35. data/lib/adyen/services/balancePlatform/transaction_rules_api.rb +4 -12
  36. data/lib/adyen/services/balancePlatform/transfer_limits_balance_account_level_api.rb +6 -18
  37. data/lib/adyen/services/balancePlatform/transfer_limits_balance_platform_level_api.rb +4 -12
  38. data/lib/adyen/services/balancePlatform/transfer_routes_api.rb +1 -3
  39. data/lib/adyen/services/balancePlatform.rb +20 -0
  40. data/lib/adyen/services/binLookup/bin_lookup_api.rb +2 -6
  41. data/lib/adyen/services/capital/dynamic_offers_api.rb +40 -0
  42. data/lib/adyen/services/capital/grant_accounts_api.rb +1 -3
  43. data/lib/adyen/services/capital/grant_offers_api.rb +4 -8
  44. data/lib/adyen/services/capital/grants_api.rb +6 -18
  45. data/lib/adyen/services/capital.rb +5 -0
  46. data/lib/adyen/services/checkout/donations_api.rb +2 -6
  47. data/lib/adyen/services/checkout/modifications_api.rb +6 -18
  48. data/lib/adyen/services/checkout/orders_api.rb +3 -9
  49. data/lib/adyen/services/checkout/payment_links_api.rb +3 -9
  50. data/lib/adyen/services/checkout/payments_api.rb +14 -18
  51. data/lib/adyen/services/checkout/recurring_api.rb +4 -12
  52. data/lib/adyen/services/checkout/utility_api.rb +6 -12
  53. data/lib/adyen/services/checkout.rb +1 -1
  54. data/lib/adyen/services/dataProtection/data_protection_api.rb +1 -3
  55. data/lib/adyen/services/disputes/disputes_api.rb +5 -15
  56. data/lib/adyen/services/legalEntityManagement/business_lines_api.rb +4 -12
  57. data/lib/adyen/services/legalEntityManagement/documents_api.rb +4 -12
  58. data/lib/adyen/services/legalEntityManagement/hosted_onboarding_api.rb +3 -9
  59. data/lib/adyen/services/legalEntityManagement/legal_entities_api.rb +7 -21
  60. data/lib/adyen/services/legalEntityManagement/pci_questionnaires_api.rb +5 -15
  61. data/lib/adyen/services/legalEntityManagement/tax_e_delivery_consent_api.rb +2 -6
  62. data/lib/adyen/services/legalEntityManagement/terms_of_service_api.rb +5 -15
  63. data/lib/adyen/services/legalEntityManagement/transfer_instruments_api.rb +4 -12
  64. data/lib/adyen/services/management/account_company_level_api.rb +3 -9
  65. data/lib/adyen/services/management/account_merchant_level_api.rb +4 -12
  66. data/lib/adyen/services/management/account_store_level_api.rb +8 -24
  67. data/lib/adyen/services/management/allowed_origins_company_level_api.rb +4 -12
  68. data/lib/adyen/services/management/allowed_origins_merchant_level_api.rb +4 -12
  69. data/lib/adyen/services/management/android_files_company_level_api.rb +6 -18
  70. data/lib/adyen/services/management/api_credentials_company_level_api.rb +4 -12
  71. data/lib/adyen/services/management/api_credentials_merchant_level_api.rb +4 -12
  72. data/lib/adyen/services/management/api_key_company_level_api.rb +1 -3
  73. data/lib/adyen/services/management/api_key_merchant_level_api.rb +1 -3
  74. data/lib/adyen/services/management/client_key_company_level_api.rb +1 -3
  75. data/lib/adyen/services/management/client_key_merchant_level_api.rb +1 -3
  76. data/lib/adyen/services/management/donation_campaigns_api.rb +64 -0
  77. data/lib/adyen/services/management/my_api_credential_api.rb +6 -18
  78. data/lib/adyen/services/management/payment_methods_merchant_level_api.rb +6 -18
  79. data/lib/adyen/services/management/payout_settings_merchant_level_api.rb +5 -15
  80. data/lib/adyen/services/management/split_configuration_merchant_level_api.rb +9 -27
  81. data/lib/adyen/services/management/terminal_actions_company_level_api.rb +2 -6
  82. data/lib/adyen/services/management/terminal_actions_terminal_level_api.rb +1 -3
  83. data/lib/adyen/services/management/terminal_orders_company_level_api.rb +10 -30
  84. data/lib/adyen/services/management/terminal_orders_merchant_level_api.rb +10 -30
  85. data/lib/adyen/services/management/terminal_settings_company_level_api.rb +4 -12
  86. data/lib/adyen/services/management/terminal_settings_merchant_level_api.rb +4 -12
  87. data/lib/adyen/services/management/terminal_settings_store_level_api.rb +8 -24
  88. data/lib/adyen/services/management/terminal_settings_terminal_level_api.rb +4 -12
  89. data/lib/adyen/services/management/terminals_terminal_level_api.rb +2 -6
  90. data/lib/adyen/services/management/users_company_level_api.rb +4 -12
  91. data/lib/adyen/services/management/users_merchant_level_api.rb +4 -12
  92. data/lib/adyen/services/management/webhooks_company_level_api.rb +7 -21
  93. data/lib/adyen/services/management/webhooks_merchant_level_api.rb +7 -21
  94. data/lib/adyen/services/management.rb +5 -0
  95. data/lib/adyen/services/payment/modifications_api.rb +10 -24
  96. data/lib/adyen/services/payment/payments_api.rb +5 -15
  97. data/lib/adyen/services/paymentsApp/payments_app_api.rb +5 -15
  98. data/lib/adyen/services/payout/initialization_api.rb +3 -9
  99. data/lib/adyen/services/payout/instant_payouts_api.rb +1 -3
  100. data/lib/adyen/services/payout/reviewing_api.rb +2 -6
  101. data/lib/adyen/services/posMobile/pos_mobile_api.rb +6 -3
  102. data/lib/adyen/services/posTerminalManagement.rb +10 -0
  103. data/lib/adyen/services/recurring/recurring_api.rb +10 -18
  104. data/lib/adyen/services/service.rb +12 -2
  105. data/lib/adyen/services/sessionAuthentication/session_authentication_api.rb +1 -3
  106. data/lib/adyen/services/storedValue/stored_value_api.rb +6 -18
  107. data/lib/adyen/services/transfers/capital_api.rb +9 -9
  108. data/lib/adyen/services/transfers/cash_out_api.rb +24 -0
  109. data/lib/adyen/services/transfers/transactions_api.rb +2 -6
  110. data/lib/adyen/services/transfers/transfers_api.rb +6 -18
  111. data/lib/adyen/services/transfers.rb +5 -0
  112. data/lib/adyen/utils/hmac_validator.rb +15 -18
  113. data/lib/adyen/version.rb +1 -1
  114. data/sdk-generation-log/balancecontrol.json +8 -0
  115. data/sdk-generation-log/balanceplatform.json +8 -0
  116. data/sdk-generation-log/binlookup.json +8 -0
  117. data/sdk-generation-log/capital.json +8 -0
  118. data/sdk-generation-log/checkout.json +8 -0
  119. data/sdk-generation-log/dataprotection.json +8 -0
  120. data/sdk-generation-log/disputes.json +8 -0
  121. data/sdk-generation-log/legalentitymanagement.json +8 -0
  122. data/sdk-generation-log/management.json +8 -0
  123. data/sdk-generation-log/payment.json +8 -0
  124. data/sdk-generation-log/paymentsapp.json +8 -0
  125. data/sdk-generation-log/payout.json +8 -0
  126. data/sdk-generation-log/posmobile.json +8 -0
  127. data/sdk-generation-log/recurring.json +8 -0
  128. data/sdk-generation-log/sessionauthentication.json +8 -0
  129. data/sdk-generation-log/storedvalue.json +8 -0
  130. data/sdk-generation-log/transfers.json +8 -0
  131. data/spec/balance_control_spec.rb +41 -0
  132. data/spec/balance_platform_spec.rb +609 -4
  133. data/spec/capital_spec.rb +82 -0
  134. data/spec/checkout-oauth_spec.rb +220 -10
  135. data/spec/checkout_spec.rb +245 -10
  136. data/spec/client_spec.rb +23 -5
  137. data/spec/deprecation_spec.rb +112 -0
  138. data/spec/management_spec.rb +184 -0
  139. data/spec/mocks/requests/BalancePlatform/apply_managed_schedule.json +14 -0
  140. data/spec/mocks/requests/BalancePlatform/begin_sca_device_registration.json +4 -0
  141. data/spec/mocks/requests/BalancePlatform/create_recurring_top_up.json +21 -0
  142. data/spec/mocks/requests/BalancePlatform/create_sweep.json +10 -0
  143. data/spec/mocks/requests/BalancePlatform/finish_sca_device_registration.json +3 -0
  144. data/spec/mocks/requests/BalancePlatform/submit_sca_association.json +8 -0
  145. data/spec/mocks/requests/BalancePlatform/update_balance_account_managed_schedule.json +5 -0
  146. data/spec/mocks/requests/BalancePlatform/update_mandate.json +14 -0
  147. data/spec/mocks/requests/BalancePlatform/update_recurring_top_ups.json +3 -0
  148. data/spec/mocks/requests/BalancePlatform/update_sweep.json +6 -0
  149. data/spec/mocks/requests/Checkout/amount_updates.json +1 -1
  150. data/spec/mocks/requests/Checkout/card_details.json +3 -0
  151. data/spec/mocks/requests/Checkout/create_stored_payment_method.json +10 -0
  152. data/spec/mocks/requests/Checkout/donation_campaigns.json +4 -0
  153. data/spec/mocks/requests/Checkout/donations.json +9 -0
  154. data/spec/mocks/requests/Checkout/orders.json +5 -3
  155. data/spec/mocks/requests/Checkout/payment-details.json +2 -14
  156. data/spec/mocks/requests/Checkout/payment_methods_balance.json +5 -2
  157. data/spec/mocks/requests/Checkout/payments.json +9 -10
  158. data/spec/mocks/requests/Checkout/paypal_update_order.json +5 -0
  159. data/spec/mocks/requests/Checkout/reversals.json +3 -0
  160. data/spec/mocks/requests/Checkout/update_session.json +7 -0
  161. data/spec/mocks/requests/Management/create_donation_campaign.json +7 -0
  162. data/spec/mocks/requests/Management/list_nonprofits.json +5 -0
  163. data/spec/mocks/requests/Management/update_donation_campaign.json +6 -0
  164. data/spec/mocks/requests/Transfers/initiate_cashout.json +12 -0
  165. data/spec/mocks/responses/BalancePlatform/apply_managed_schedule.json +17 -0
  166. data/spec/mocks/responses/BalancePlatform/begin_sca_device_registration.json +8 -0
  167. data/spec/mocks/responses/BalancePlatform/create_recurring_top_up.json +23 -0
  168. data/spec/mocks/responses/BalancePlatform/create_sweep.json +12 -0
  169. data/spec/mocks/responses/BalancePlatform/finish_sca_device_registration.json +7 -0
  170. data/spec/mocks/responses/BalancePlatform/get_all_sweeps_for_balance_account.json +31 -0
  171. data/spec/mocks/responses/BalancePlatform/get_balance_account_managed_schedule_by_id.json +17 -0
  172. data/spec/mocks/responses/BalancePlatform/get_balance_account_managed_schedules.json +26 -0
  173. data/spec/mocks/responses/BalancePlatform/get_balance_platform_managed_schedule_by_id.json +27 -0
  174. data/spec/mocks/responses/BalancePlatform/get_balance_platform_managed_schedules.json +31 -0
  175. data/spec/mocks/responses/BalancePlatform/get_list_of_mandates.json +19 -0
  176. data/spec/mocks/responses/BalancePlatform/get_mandate_by_id.json +14 -0
  177. data/spec/mocks/responses/BalancePlatform/get_payout_schedule_executions.json +21 -0
  178. data/spec/mocks/responses/BalancePlatform/get_recurring_top_ups.json +35 -0
  179. data/spec/mocks/responses/BalancePlatform/get_sweep.json +12 -0
  180. data/spec/mocks/responses/BalancePlatform/get_tax_form_summary.json +17 -0
  181. data/spec/mocks/responses/BalancePlatform/submit_sca_association.json +10 -0
  182. data/spec/mocks/responses/BalancePlatform/update_balance_account_managed_schedule.json +18 -0
  183. data/spec/mocks/responses/BalancePlatform/update_recurring_top_ups.json +23 -0
  184. data/spec/mocks/responses/BalancePlatform/update_sweep.json +12 -0
  185. data/spec/mocks/responses/Capital/calculate-preliminary-offer-from-dynamic-offer.json +16 -0
  186. data/spec/mocks/responses/Capital/create-static-offer-from-dynamic-offer.json +9 -0
  187. data/spec/mocks/responses/Capital/get-all-dynamic-offers.json +18 -0
  188. data/spec/mocks/responses/Checkout/amount_updates.json +1 -1
  189. data/spec/mocks/responses/Checkout/card_details.json +5 -0
  190. data/spec/mocks/responses/Checkout/create_stored_payment_method.json +5 -0
  191. data/spec/mocks/responses/Checkout/donation_campaigns.json +1 -0
  192. data/spec/mocks/responses/Checkout/donations.json +5 -0
  193. data/spec/mocks/responses/Checkout/orders.json +6 -1
  194. data/spec/mocks/responses/Checkout/orders_cancel.json +1 -1
  195. data/spec/mocks/responses/Checkout/payment-details.json +2 -13
  196. data/spec/mocks/responses/Checkout/payment_links.json +3 -0
  197. data/spec/mocks/responses/Checkout/payment_methods.json +2 -2
  198. data/spec/mocks/responses/Checkout/payment_methods_balance.json +5 -1
  199. data/spec/mocks/responses/Checkout/payments.json +4 -94
  200. data/spec/mocks/responses/Checkout/paypal_update_order.json +4 -0
  201. data/spec/mocks/responses/Checkout/reversals.json +6 -0
  202. data/spec/mocks/responses/Checkout/update_session.json +3 -0
  203. data/spec/mocks/responses/Management/donation_campaign.json +13 -0
  204. data/spec/mocks/responses/Management/list_donation_campaigns.json +19 -0
  205. data/spec/mocks/responses/Management/list_nonprofits.json +34 -0
  206. data/spec/mocks/responses/Transfers/initiate_cashout.json +31 -0
  207. data/spec/service_spec.rb +40 -0
  208. data/spec/spec_helper.rb +2 -2
  209. data/spec/transfers_spec.rb +28 -0
  210. data/spec/utils/consumer_smoke.rb +23 -0
  211. data/spec/utils/hmac_validator_spec.rb +55 -0
  212. data/templates/api-small.mustache +4 -4
  213. data/templates/api.mustache +4 -4
  214. metadata +84 -2
@@ -10,7 +10,7 @@ RSpec.describe Adyen::Checkout, service: 'checkout' do
10
10
  end
11
11
 
12
12
  it 'uses the correct PaymentsApi for the Checkout service' do
13
- # Load both API files to ensure there's no conflict after the fix.
13
+ # Load both API files to ensure there's no conflict.
14
14
  load File.expand_path('../lib/adyen/services/payment/payments_api.rb', __dir__)
15
15
  load File.expand_path('../lib/adyen/services/checkout/payments_api.rb', __dir__)
16
16
 
@@ -84,8 +84,8 @@ RSpec.describe Adyen::Checkout, service: 'checkout' do
84
84
  .to be_a Adyen::HashWithAccessors
85
85
  expect(response_hash)
86
86
  .to be_a_kind_of Hash
87
- expect(response_hash['balance'])
88
- .to eq('100')
87
+ expect(response_hash['balance']['value'])
88
+ .to eq(100)
89
89
  end
90
90
 
91
91
  # must be created manually due to payments/details format
@@ -141,14 +141,15 @@ RSpec.describe Adyen::Checkout, service: 'checkout' do
141
141
  }
142
142
  )
143
143
  .to_return(
144
- body: response_body
144
+ body: response_body,
145
+ status: 201
145
146
  )
146
147
 
147
148
  result = @shared_values[:client].checkout.payment_links_api.payment_links(request_body)
148
149
  response_hash = result.response
149
150
 
150
151
  expect(result.status)
151
- .to eq(200)
152
+ .to eq(201)
152
153
  expect(response_hash)
153
154
  .to eq(JSON.parse(response_body))
154
155
  expect(response_hash)
@@ -291,7 +292,7 @@ RSpec.describe Adyen::Checkout, service: 'checkout' do
291
292
  expect(response_hash)
292
293
  .to be_a_kind_of Hash
293
294
  expect(response_hash['resultCode'])
294
- .to eq('cancelled')
295
+ .to eq('Received')
295
296
  end
296
297
 
297
298
  it 'makes an applePay/sessions call' do
@@ -356,6 +357,239 @@ RSpec.describe Adyen::Checkout, service: 'checkout' do
356
357
  .to be_a_kind_of Hash
357
358
  end
358
359
 
360
+ it 'makes an update_session PATCH call' do
361
+ request_body = JSON.parse(json_from_file('mocks/requests/Checkout/update_session.json'))
362
+
363
+ response_body = json_from_file('mocks/responses/Checkout/update_session.json')
364
+
365
+ url = @shared_values[:client].service_url(@shared_values[:service], 'sessions/CS0123456789ABCDEF',
366
+ @shared_values[:client].checkout.version)
367
+ WebMock.stub_request(:patch, url)
368
+ .with(
369
+ body: request_body,
370
+ headers: {
371
+ 'x-api-key' => @shared_values[:client].api_key
372
+ }
373
+ )
374
+ .to_return(body: response_body)
375
+
376
+ result = @shared_values[:client].checkout.payments_api.update_session(request_body, 'CS0123456789ABCDEF')
377
+ response_hash = result.response
378
+
379
+ expect(result.status)
380
+ .to eq(200)
381
+ expect(response_hash)
382
+ .to eq(JSON.parse(response_body))
383
+ expect(response_hash)
384
+ .to be_a Adyen::HashWithAccessors
385
+ expect(response_hash)
386
+ .to be_a_kind_of Hash
387
+ end
388
+
389
+ it 'makes a cardDetails call' do
390
+ request_body = JSON.parse(json_from_file('mocks/requests/Checkout/card_details.json'))
391
+
392
+ response_body = json_from_file('mocks/responses/Checkout/card_details.json')
393
+
394
+ url = @shared_values[:client].service_url(@shared_values[:service], 'cardDetails',
395
+ @shared_values[:client].checkout.version)
396
+ WebMock.stub_request(:post, url)
397
+ .with(
398
+ body: request_body,
399
+ headers: {
400
+ 'x-api-key' => @shared_values[:client].api_key
401
+ }
402
+ )
403
+ .to_return(body: response_body)
404
+
405
+ result = @shared_values[:client].checkout.payments_api.card_details(request_body)
406
+ response_hash = result.response
407
+
408
+ expect(result.status)
409
+ .to eq(200)
410
+ expect(response_hash)
411
+ .to eq(JSON.parse(response_body))
412
+ expect(response_hash)
413
+ .to be_a Adyen::HashWithAccessors
414
+ expect(response_hash)
415
+ .to be_a_kind_of Hash
416
+ end
417
+
418
+ it 'makes a donationCampaigns call' do
419
+ request_body = JSON.parse(json_from_file('mocks/requests/Checkout/donation_campaigns.json'))
420
+
421
+ response_body = json_from_file('mocks/responses/Checkout/donation_campaigns.json')
422
+
423
+ url = @shared_values[:client].service_url(@shared_values[:service], 'donationCampaigns',
424
+ @shared_values[:client].checkout.version)
425
+ WebMock.stub_request(:post, url)
426
+ .with(
427
+ body: request_body,
428
+ headers: {
429
+ 'x-api-key' => @shared_values[:client].api_key
430
+ }
431
+ )
432
+ .to_return(body: response_body)
433
+
434
+ result = @shared_values[:client].checkout.donations_api.donation_campaigns(request_body)
435
+ response_hash = result.response
436
+
437
+ expect(result.status)
438
+ .to eq(200)
439
+ expect(response_hash)
440
+ .to eq(JSON.parse(response_body))
441
+ expect(response_hash)
442
+ .to be_a Adyen::HashWithAccessors
443
+ expect(response_hash)
444
+ .to be_a_kind_of Hash
445
+ end
446
+
447
+ it 'makes a donations call' do
448
+ request_body = JSON.parse(json_from_file('mocks/requests/Checkout/donations.json'))
449
+
450
+ response_body = json_from_file('mocks/responses/Checkout/donations.json')
451
+
452
+ url = @shared_values[:client].service_url(@shared_values[:service], 'donations',
453
+ @shared_values[:client].checkout.version)
454
+ WebMock.stub_request(:post, url)
455
+ .with(
456
+ body: request_body,
457
+ headers: {
458
+ 'x-api-key' => @shared_values[:client].api_key
459
+ }
460
+ )
461
+ .to_return(body: response_body)
462
+
463
+ result = @shared_values[:client].checkout.donations_api.donations(request_body)
464
+ response_hash = result.response
465
+
466
+ expect(result.status)
467
+ .to eq(200)
468
+ expect(response_hash)
469
+ .to eq(JSON.parse(response_body))
470
+ expect(response_hash)
471
+ .to be_a Adyen::HashWithAccessors
472
+ expect(response_hash)
473
+ .to be_a_kind_of Hash
474
+ end
475
+
476
+ it 'makes a payments call' do
477
+ request_body = JSON.parse(json_from_file('mocks/requests/Checkout/payments.json'))
478
+
479
+ response_body = json_from_file('mocks/responses/Checkout/payments.json')
480
+
481
+ url = @shared_values[:client].service_url(@shared_values[:service], 'payments',
482
+ @shared_values[:client].checkout.version)
483
+ WebMock.stub_request(:post, url)
484
+ .with(
485
+ body: request_body,
486
+ headers: {
487
+ 'x-api-key' => @shared_values[:client].api_key
488
+ }
489
+ )
490
+ .to_return(body: response_body)
491
+
492
+ result = @shared_values[:client].checkout.payments_api.payments(request_body)
493
+ response_hash = result.response
494
+
495
+ expect(result.status)
496
+ .to eq(200)
497
+ expect(response_hash)
498
+ .to eq(JSON.parse(response_body))
499
+ expect(response_hash)
500
+ .to be_a Adyen::HashWithAccessors
501
+ expect(response_hash)
502
+ .to be_a_kind_of Hash
503
+ end
504
+
505
+ it 'makes a reversals call' do
506
+ request_body = JSON.parse(json_from_file('mocks/requests/Checkout/reversals.json'))
507
+
508
+ response_body = json_from_file('mocks/responses/Checkout/reversals.json')
509
+
510
+ url = @shared_values[:client].service_url(@shared_values[:service], 'payments/8535678901234567/reversals',
511
+ @shared_values[:client].checkout.version)
512
+ WebMock.stub_request(:post, url)
513
+ .with(
514
+ body: request_body,
515
+ headers: {
516
+ 'x-api-key' => @shared_values[:client].api_key
517
+ }
518
+ )
519
+ .to_return(body: response_body, status: 201)
520
+
521
+ result = @shared_values[:client].checkout.modifications_api.refund_or_cancel_payment(request_body,
522
+ '8535678901234567')
523
+ response_hash = result.response
524
+
525
+ expect(result.status)
526
+ .to eq(201)
527
+ expect(response_hash)
528
+ .to eq(JSON.parse(response_body))
529
+ expect(response_hash)
530
+ .to be_a Adyen::HashWithAccessors
531
+ expect(response_hash)
532
+ .to be_a_kind_of Hash
533
+ end
534
+
535
+ it 'makes a paypal/updateOrder call' do
536
+ request_body = JSON.parse(json_from_file('mocks/requests/Checkout/paypal_update_order.json'))
537
+
538
+ response_body = json_from_file('mocks/responses/Checkout/paypal_update_order.json')
539
+
540
+ url = @shared_values[:client].service_url(@shared_values[:service], 'paypal/updateOrder',
541
+ @shared_values[:client].checkout.version)
542
+ WebMock.stub_request(:post, url)
543
+ .with(
544
+ body: request_body,
545
+ headers: {
546
+ 'x-api-key' => @shared_values[:client].api_key
547
+ }
548
+ )
549
+ .to_return(body: response_body)
550
+
551
+ result = @shared_values[:client].checkout.utility_api.updates_order_for_paypal_express_checkout(request_body)
552
+ response_hash = result.response
553
+
554
+ expect(result.status)
555
+ .to eq(200)
556
+ expect(response_hash)
557
+ .to eq(JSON.parse(response_body))
558
+ expect(response_hash)
559
+ .to be_a Adyen::HashWithAccessors
560
+ expect(response_hash)
561
+ .to be_a_kind_of Hash
562
+ end
563
+
564
+ it 'makes a storedPaymentMethods POST call' do
565
+ request_body = JSON.parse(json_from_file('mocks/requests/Checkout/create_stored_payment_method.json'))
566
+
567
+ response_body = json_from_file('mocks/responses/Checkout/create_stored_payment_method.json')
568
+
569
+ url = @shared_values[:client].service_url(@shared_values[:service], 'storedPaymentMethods',
570
+ @shared_values[:client].checkout.version)
571
+ WebMock.stub_request(:post, url)
572
+ .with(
573
+ body: request_body,
574
+ headers: {
575
+ 'x-api-key' => @shared_values[:client].api_key
576
+ }
577
+ )
578
+ .to_return(body: response_body, status: 201)
579
+
580
+ result = @shared_values[:client].checkout.recurring_api.stored_payment_methods(request_body)
581
+ response_hash = result.response
582
+
583
+ expect(result.status)
584
+ .to eq(201)
585
+ expect(response_hash)
586
+ .to eq(JSON.parse(response_body))
587
+ expect(response_hash)
588
+ .to be_a Adyen::HashWithAccessors
589
+ expect(response_hash)
590
+ .to be_a_kind_of Hash
591
+ end
592
+
359
593
  it 'makes a capture call' do
360
594
  request_body = JSON.parse(json_from_file('mocks/requests/Checkout/capture.json'))
361
595
 
@@ -607,7 +841,8 @@ RSpec.describe Adyen::Checkout, service: 'checkout' do
607
841
  }
608
842
  )
609
843
  .to_return(
610
- body: '{}'
844
+ status: 204,
845
+ body: ''
611
846
  )
612
847
 
613
848
  result = @shared_values[:client].checkout.recurring_api.delete_token_for_stored_payment_details(
@@ -620,7 +855,7 @@ RSpec.describe Adyen::Checkout, service: 'checkout' do
620
855
  result.response
621
856
 
622
857
  expect(result.status)
623
- .to eq(200)
858
+ .to eq(204)
624
859
  end
625
860
 
626
861
  it 'tests sending the application headers' do
@@ -647,7 +882,7 @@ RSpec.describe Adyen::Checkout, service: 'checkout' do
647
882
  'shopperReference' => 'test-1234'
648
883
  })
649
884
  expect(
650
- a_request(:get, 'http://localhost:3001/v71/storedPaymentMethods?merchantAccount=TestMerchantAccount&shopperReference=test-1234')
885
+ a_request(:get, 'http://localhost:3001/v72/storedPaymentMethods?merchantAccount=TestMerchantAccount&shopperReference=test-1234')
651
886
  .with(headers: {
652
887
  'Accept' => '*/*',
653
888
  'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
@@ -673,7 +908,7 @@ RSpec.describe Adyen::Checkout, service: 'checkout' do
673
908
  url = adyen.service_url('Checkout', 'paymentMethods', @shared_values[:client].checkout.version)
674
909
 
675
910
  expect(url)
676
- .to eq('https://prefix-checkout-live.adyenpayments.com/checkout/v71/paymentMethods')
911
+ .to eq('https://prefix-checkout-live.adyenpayments.com/checkout/v72/paymentMethods')
677
912
  end
678
913
  end
679
914
 
data/spec/client_spec.rb CHANGED
@@ -18,6 +18,28 @@ RSpec.describe Adyen do
18
18
  .to eq(:test)
19
19
  end
20
20
 
21
+ it 'raises ArgumentError when initialized with an invalid env string' do
22
+ expect { Adyen::Client.new(env: 'live') }
23
+ .to raise_error(ArgumentError)
24
+ end
25
+
26
+ it 'raises ArgumentError when initialized with an invalid env value' do
27
+ expect { Adyen::Client.new(env: :invalid) }
28
+ .to raise_error(ArgumentError)
29
+ end
30
+
31
+ it 'strips https:// from live_url_prefix when passed via constructor' do
32
+ client = Adyen::Client.new(env: :live, live_url_prefix: 'https://myprefix')
33
+ expect(client.service_url_base('Payment'))
34
+ .to eq('https://myprefix-pal-live.adyenpayments.com/pal/servlet/Payment')
35
+ end
36
+
37
+ it 'does not mutate the original live_url_prefix string' do
38
+ prefix = 'https://myprefix'
39
+ Adyen::Client.new(env: :live, live_url_prefix: prefix)
40
+ expect(prefix).to eq('https://myprefix')
41
+ end
42
+
21
43
  it 'sets the version number' do
22
44
  @shared_values[:client].checkout.version = @shared_values[:version]
23
45
  expect(@shared_values[:client].checkout.version)
@@ -147,9 +169,7 @@ RSpec.describe Adyen do
147
169
  Adyen::Client.new(env: :test, connection_options: connection_options)
148
170
  end
149
171
 
150
- # test with Ruby 3.2+ only (where Faraday requestOptions timeout is supported)
151
172
  it 'initiates a Faraday connection with the provided options' do
152
- skip 'Only runs on Ruby >= 3.2' unless RUBY_VERSION >= '3.2'
153
173
  connection_options = Faraday::ConnectionOptions.new(
154
174
  request: {
155
175
  open_timeout: 5,
@@ -168,15 +188,13 @@ RSpec.describe Adyen do
168
188
  mock_response = Faraday::Response.new(status: 200)
169
189
 
170
190
  expect(Adyen::AdyenResult).to receive(:new)
171
- expect(Faraday).to receive(:new).with('http://localhost:3001/v71/payments/details',
191
+ expect(Faraday).to receive(:new).with('http://localhost:3001/v72/payments/details',
172
192
  connection_options).and_return(mock_faraday_connection)
173
193
  expect(mock_faraday_connection).to receive(:post).and_return(mock_response)
174
194
  client.checkout.payments_api.payments_details(request_body)
175
195
  end
176
196
 
177
- # test with Ruby 3.2+ only (where Faraday requestOptions timeout is supported)
178
197
  it 'initiates a Faraday connection with the expected default timeouts' do
179
- skip 'Only runs on Ruby >= 3.2' unless RUBY_VERSION >= '3.2'
180
198
  client = Adyen::Client.new(env: :test)
181
199
  expect(client.connection_options[:request][:open_timeout]).to eq(30)
182
200
  expect(client.connection_options[:request][:timeout]).to eq(60)
@@ -0,0 +1,112 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Adyen::Deprecation do
4
+ describe '.warn' do
5
+ around do |example|
6
+ previous = Warning[:deprecated]
7
+ example.run
8
+ ensure
9
+ Warning[:deprecated] = previous
10
+ end
11
+
12
+ context 'message formatting' do
13
+ before { Warning[:deprecated] = true }
14
+
15
+ it 'formats a warning with the method name only' do
16
+ expect { described_class.warn(:get_payment_methods) }
17
+ .to output(/\[DEPRECATED\] `get_payment_methods` is deprecated\n/).to_stderr
18
+ end
19
+
20
+ it 'formats a warning with since' do
21
+ expect { described_class.warn(:get_payment_methods, since: 'Adyen Checkout API v67') }
22
+ .to output(/\[DEPRECATED\] `get_payment_methods` is deprecated since Adyen Checkout API v67\n/).to_stderr
23
+ end
24
+
25
+ it 'formats a warning with message' do
26
+ expect { described_class.warn(:get_payment_methods, message: 'Use `payments` instead.') }
27
+ .to output(/\[DEPRECATED\] `get_payment_methods` is deprecated\. Use `payments` instead\.\n/).to_stderr
28
+ end
29
+
30
+ it 'formats a warning with both since and message' do
31
+ expect do
32
+ described_class.warn(:get_payment_methods,
33
+ since: 'Adyen Checkout API v67',
34
+ message: 'Use `payments` instead.')
35
+ end
36
+ .to output(/\[DEPRECATED\] `get_payment_methods` is deprecated since Adyen Checkout API v67\. Use `payments` instead\.\n/).to_stderr
37
+ end
38
+ end
39
+
40
+ context 'when Warning[:deprecated] is true' do
41
+ it 'writes the formatted message to stderr' do
42
+ Warning[:deprecated] = true
43
+ expect { described_class.warn(:foo, since: 'Adyen Checkout API v67') }
44
+ .to output(/\[DEPRECATED\] `foo` is deprecated since Adyen Checkout API v67\n/).to_stderr
45
+ end
46
+
47
+ it 'attributes the warning to the call site (file:line: warning: format)' do
48
+ Warning[:deprecated] = true
49
+ expect { described_class.warn(:foo, since: 'Adyen Checkout API v67') }
50
+ .to output(/\A.+:\d+: warning: \[DEPRECATED\] `foo`/).to_stderr
51
+ end
52
+
53
+ it 'emits through Warning.warn tagged with the :deprecated category' do
54
+ Warning[:deprecated] = true
55
+ expect(Warning).to receive(:warn).with(
56
+ /:\d+: warning: \[DEPRECATED\] `foo` is deprecated since Adyen Checkout API v67\n/,
57
+ category: :deprecated
58
+ )
59
+ described_class.warn(:foo, since: 'Adyen Checkout API v67')
60
+ end
61
+ end
62
+
63
+ context 'when Warning[:deprecated] is false' do
64
+ it 'writes nothing to stderr' do
65
+ Warning[:deprecated] = false
66
+ expect { described_class.warn(:foo, since: 'Adyen Checkout API v67') }
67
+ .not_to output.to_stderr
68
+ end
69
+ end
70
+
71
+ context 'silencing' do
72
+ around do |example|
73
+ original_env = ENV.fetch('ADYEN_SILENCE_DEPRECATIONS', nil)
74
+ example.run
75
+ ensure
76
+ described_class.silenced = nil
77
+ if original_env.nil?
78
+ ENV.delete('ADYEN_SILENCE_DEPRECATIONS')
79
+ else
80
+ ENV['ADYEN_SILENCE_DEPRECATIONS'] = original_env
81
+ end
82
+ end
83
+
84
+ before { Warning[:deprecated] = true }
85
+
86
+ it 'emits nothing when silenced is true, even with the category enabled' do
87
+ described_class.silenced = true
88
+ expect { described_class.warn(:foo, since: 'Adyen Checkout API v67') }
89
+ .not_to output.to_stderr
90
+ end
91
+
92
+ it 'is silenced when ADYEN_SILENCE_DEPRECATIONS has a truthy value' do
93
+ ENV['ADYEN_SILENCE_DEPRECATIONS'] = '1'
94
+ expect { described_class.warn(:foo, since: 'Adyen Checkout API v67') }
95
+ .not_to output.to_stderr
96
+ end
97
+
98
+ it 'is not silenced when ADYEN_SILENCE_DEPRECATIONS has a falsy value' do
99
+ ENV['ADYEN_SILENCE_DEPRECATIONS'] = '0'
100
+ expect { described_class.warn(:foo, since: 'Adyen Checkout API v67') }
101
+ .to output(/\[DEPRECATED\] `foo` is deprecated since Adyen Checkout API v67\n/).to_stderr
102
+ end
103
+
104
+ it 'lets the attribute override the environment variable' do
105
+ ENV['ADYEN_SILENCE_DEPRECATIONS'] = '1'
106
+ described_class.silenced = false
107
+ expect { described_class.warn(:foo, since: 'Adyen Checkout API v67') }
108
+ .to output(/\[DEPRECATED\] `foo` is deprecated since Adyen Checkout API v67\n/).to_stderr
109
+ end
110
+ end
111
+ end
112
+ end
@@ -63,4 +63,188 @@ RSpec.describe Adyen::Management, service: 'Management' do
63
63
  expect(result.status)
64
64
  .to eq(200)
65
65
  end
66
+
67
+ ## Donation campaigns
68
+
69
+ it 'makes a create_donation_campaign POST call' do
70
+ request_body = JSON.parse(json_from_file('mocks/requests/Management/create_donation_campaign.json'))
71
+ response_body = json_from_file('mocks/responses/Management/donation_campaign.json')
72
+
73
+ url = @shared_values[:client].service_url(@shared_values[:service], 'companies/companyID/campaignManagement',
74
+ @shared_values[:client].management.version)
75
+ WebMock.stub_request(:post, url)
76
+ .with(
77
+ body: request_body,
78
+ headers: {
79
+ 'x-api-key' => @shared_values[:client].api_key
80
+ }
81
+ )
82
+ .to_return(
83
+ body: response_body
84
+ )
85
+
86
+ result = @shared_values[:client].management.donation_campaigns_api.create_donation_campaign(request_body,
87
+ 'companyID')
88
+ response_hash = result.response
89
+
90
+ expect(result.status)
91
+ .to eq(200)
92
+ expect(response_hash)
93
+ .to eq(JSON.parse(response_body))
94
+ expect(response_hash)
95
+ .to be_a Adyen::HashWithAccessors
96
+ expect(response_hash)
97
+ .to be_a_kind_of Hash
98
+ end
99
+
100
+ it 'makes a delete_donation_campaign DELETE call' do
101
+ url = @shared_values[:client].service_url(@shared_values[:service],
102
+ 'companies/companyID/campaignManagement/donationCampaignID',
103
+ @shared_values[:client].management.version)
104
+ WebMock.stub_request(:delete, url)
105
+ .with(
106
+ headers: {
107
+ 'x-api-key' => @shared_values[:client].api_key
108
+ }
109
+ )
110
+ .to_return(status: 204, body: '')
111
+
112
+ result = @shared_values[:client].management.donation_campaigns_api.delete_donation_campaign('companyID',
113
+ 'donationCampaignID')
114
+
115
+ expect(result.status)
116
+ .to eq(204)
117
+ end
118
+
119
+ it 'makes a list_donation_campaigns_for_account_holder GET call' do
120
+ response_body = json_from_file('mocks/responses/Management/list_donation_campaigns.json')
121
+
122
+ url = @shared_values[:client].service_url(@shared_values[:service],
123
+ 'companies/companyID/campaignManagement/accountHolders/accountHolderID',
124
+ @shared_values[:client].management.version)
125
+ WebMock.stub_request(:get, url)
126
+ .with(
127
+ query: { 'status' => 'active', 'pageNumber' => 1, 'pageSize' => 10 },
128
+ headers: {
129
+ 'x-api-key' => @shared_values[:client].api_key
130
+ }
131
+ )
132
+ .to_return(
133
+ body: response_body
134
+ )
135
+
136
+ result = @shared_values[:client].management.donation_campaigns_api
137
+ .list_donation_campaigns_for_account_holder('companyID', 'accountHolderID',
138
+ query_params: { 'status' => 'active',
139
+ 'pageNumber' => 1,
140
+ 'pageSize' => 10 })
141
+ response_hash = result.response
142
+
143
+ expect(result.status)
144
+ .to eq(200)
145
+ expect(response_hash)
146
+ .to eq(JSON.parse(response_body))
147
+ expect(response_hash)
148
+ .to be_a Adyen::HashWithAccessors
149
+ expect(response_hash)
150
+ .to be_a_kind_of Hash
151
+ end
152
+
153
+ it 'makes a list_nonprofits POST call' do
154
+ request_body = JSON.parse(json_from_file('mocks/requests/Management/list_nonprofits.json'))
155
+ response_body = json_from_file('mocks/responses/Management/list_nonprofits.json')
156
+
157
+ url = @shared_values[:client].service_url(@shared_values[:service], 'companies/companyID/nonprofits',
158
+ @shared_values[:client].management.version)
159
+ WebMock.stub_request(:post, url)
160
+ .with(
161
+ body: request_body,
162
+ query: { 'searchTerm' => 'example', 'pageNumber' => 1, 'pageSize' => 10 },
163
+ headers: {
164
+ 'x-api-key' => @shared_values[:client].api_key
165
+ }
166
+ )
167
+ .to_return(
168
+ body: response_body
169
+ )
170
+
171
+ result = @shared_values[:client].management.donation_campaigns_api
172
+ .list_nonprofits(request_body, 'companyID',
173
+ query_params: { 'searchTerm' => 'example',
174
+ 'pageNumber' => 1,
175
+ 'pageSize' => 10 })
176
+ response_hash = result.response
177
+
178
+ expect(result.status)
179
+ .to eq(200)
180
+ expect(response_hash)
181
+ .to eq(JSON.parse(response_body))
182
+ expect(response_hash)
183
+ .to be_a Adyen::HashWithAccessors
184
+ expect(response_hash)
185
+ .to be_a_kind_of Hash
186
+ end
187
+
188
+ it 'makes an update_donation_campaign PATCH call' do
189
+ request_body = JSON.parse(json_from_file('mocks/requests/Management/update_donation_campaign.json'))
190
+ response_body = json_from_file('mocks/responses/Management/donation_campaign.json')
191
+
192
+ url = @shared_values[:client].service_url(@shared_values[:service],
193
+ 'companies/companyID/campaignManagement/donationCampaignID',
194
+ @shared_values[:client].management.version)
195
+ WebMock.stub_request(:patch, url)
196
+ .with(
197
+ body: request_body,
198
+ headers: {
199
+ 'x-api-key' => @shared_values[:client].api_key
200
+ }
201
+ )
202
+ .to_return(
203
+ body: response_body
204
+ )
205
+
206
+ result = @shared_values[:client].management.donation_campaigns_api.update_donation_campaign(request_body,
207
+ 'companyID',
208
+ 'donationCampaignID')
209
+ response_hash = result.response
210
+
211
+ expect(result.status)
212
+ .to eq(200)
213
+ expect(response_hash)
214
+ .to eq(JSON.parse(response_body))
215
+ expect(response_hash)
216
+ .to be_a Adyen::HashWithAccessors
217
+ expect(response_hash)
218
+ .to be_a_kind_of Hash
219
+ end
220
+
221
+ it 'makes an update_donation_campaign_status POST call' do
222
+ response_body = json_from_file('mocks/responses/Management/donation_campaign.json')
223
+
224
+ url = @shared_values[:client].service_url(@shared_values[:service],
225
+ 'companies/companyID/campaignManagement/donationCampaignID/status/activate',
226
+ @shared_values[:client].management.version)
227
+ WebMock.stub_request(:post, url)
228
+ .with(
229
+ headers: {
230
+ 'x-api-key' => @shared_values[:client].api_key
231
+ }
232
+ )
233
+ .to_return(
234
+ body: response_body
235
+ )
236
+
237
+ result = @shared_values[:client].management.donation_campaigns_api
238
+ .update_donation_campaign_status('companyID', 'donationCampaignID', 'activate')
239
+ response_hash = result.response
240
+
241
+ expect(result.status)
242
+ .to eq(200)
243
+ expect(response_hash)
244
+ .to eq(JSON.parse(response_body))
245
+ expect(response_hash)
246
+ .to be_a Adyen::HashWithAccessors
247
+ expect(response_hash)
248
+ .to be_a_kind_of Hash
249
+ end
66
250
  end
@@ -0,0 +1,14 @@
1
+ {
2
+ "balancePlatformPayoutScheduleId": "PSPC00000000000000000000000001",
3
+ "transferInstrumentId": "SE00000000000000000000001",
4
+ "currency": "EUR",
5
+ "reference": "Monthly payout",
6
+ "description": "Scheduled payout to merchant bank account",
7
+ "referenceForBeneficiary": "PAYOUT-REF-001",
8
+ "retainedAmount": 10000,
9
+ "minPayoutAmount": 1000,
10
+ "maxPayoutAmount": 100000000,
11
+ "enabled": true,
12
+ "frequency": "monthly",
13
+ "frequencyValue": 1
14
+ }