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.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +1 -1
- data/.github/release.yml +18 -0
- data/.github/workflows/codeql.yml +37 -0
- data/.github/workflows/label_new_issues.yml +15 -0
- data/.github/workflows/release.yml +40 -0
- data/.github/workflows/ruby.yml +2 -2
- data/.github/workflows/rubygems_release.yml +18 -0
- data/.github/workflows/stale.yml +26 -0
- data/.gitignore +3 -0
- data/.rubocop.yml +8 -0
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +7 -7
- data/Makefile +79 -0
- data/README.md +158 -20
- data/Rakefile +3 -3
- data/VERSION +2 -0
- data/adyen-ruby-api-library.gemspec +6 -3
- data/bin/console +2 -2
- data/lib/adyen/client.rb +213 -99
- data/lib/adyen/errors.rb +30 -22
- data/lib/adyen/hash_with_accessors.rb +12 -7
- data/lib/adyen/services/balanceControlService.rb +27 -0
- data/lib/adyen/services/balancePlatform/account_holders_api.rb +76 -0
- data/lib/adyen/services/balancePlatform/balance_accounts_api.rb +116 -0
- data/lib/adyen/services/balancePlatform/bank_account_validation_api.rb +26 -0
- data/lib/adyen/services/balancePlatform/card_orders_api.rb +36 -0
- data/lib/adyen/services/balancePlatform/grant_accounts_api.rb +26 -0
- data/lib/adyen/services/balancePlatform/grant_offers_api.rb +36 -0
- data/lib/adyen/services/balancePlatform/manage_card_pin_api.rb +46 -0
- data/lib/adyen/services/balancePlatform/manage_sca_devices_api.rb +56 -0
- data/lib/adyen/services/balancePlatform/network_tokens_api.rb +36 -0
- data/lib/adyen/services/balancePlatform/payment_instrument_groups_api.rb +46 -0
- data/lib/adyen/services/balancePlatform/payment_instruments_api.rb +86 -0
- data/lib/adyen/services/balancePlatform/platform_api.rb +46 -0
- data/lib/adyen/services/balancePlatform/transaction_rules_api.rb +56 -0
- data/lib/adyen/services/balancePlatform/transfer_routes_api.rb +26 -0
- data/lib/adyen/services/balancePlatform.rb +89 -0
- data/lib/adyen/services/binLookup.rb +37 -0
- data/lib/adyen/services/checkout/donations_api.rb +36 -0
- data/lib/adyen/services/checkout/modifications_api.rb +76 -0
- data/lib/adyen/services/checkout/orders_api.rb +46 -0
- data/lib/adyen/services/checkout/payment_links_api.rb +46 -0
- data/lib/adyen/services/checkout/payments_api.rb +76 -0
- data/lib/adyen/services/checkout/recurring_api.rb +46 -0
- data/lib/adyen/services/checkout/utility_api.rb +48 -0
- data/lib/adyen/services/checkout.rb +29 -108
- data/lib/adyen/services/dataProtection.rb +27 -0
- data/lib/adyen/services/disputes.rb +67 -0
- data/lib/adyen/services/legalEntityManagement/business_lines_api.rb +56 -0
- data/lib/adyen/services/legalEntityManagement/documents_api.rb +56 -0
- data/lib/adyen/services/legalEntityManagement/hosted_onboarding_api.rb +46 -0
- data/lib/adyen/services/legalEntityManagement/legal_entities_api.rb +76 -0
- data/lib/adyen/services/legalEntityManagement/pci_questionnaires_api.rb +66 -0
- data/lib/adyen/services/legalEntityManagement/tax_e_delivery_consent_api.rb +36 -0
- data/lib/adyen/services/legalEntityManagement/terms_of_service_api.rb +66 -0
- data/lib/adyen/services/legalEntityManagement/transfer_instruments_api.rb +56 -0
- data/lib/adyen/services/legalEntityManagement.rb +59 -0
- data/lib/adyen/services/management/account_company_level_api.rb +46 -0
- data/lib/adyen/services/management/account_merchant_level_api.rb +56 -0
- data/lib/adyen/services/management/account_store_level_api.rb +96 -0
- data/lib/adyen/services/management/allowed_origins_company_level_api.rb +56 -0
- data/lib/adyen/services/management/allowed_origins_merchant_level_api.rb +56 -0
- data/lib/adyen/services/management/android_files_company_level_api.rb +76 -0
- data/lib/adyen/services/management/api_credentials_company_level_api.rb +56 -0
- data/lib/adyen/services/management/api_credentials_merchant_level_api.rb +56 -0
- data/lib/adyen/services/management/api_key_company_level_api.rb +26 -0
- data/lib/adyen/services/management/api_key_merchant_level_api.rb +26 -0
- data/lib/adyen/services/management/client_key_company_level_api.rb +26 -0
- data/lib/adyen/services/management/client_key_merchant_level_api.rb +26 -0
- data/lib/adyen/services/management/my_api_credential_api.rb +76 -0
- data/lib/adyen/services/management/payment_methods_merchant_level_api.rb +76 -0
- data/lib/adyen/services/management/payout_settings_merchant_level_api.rb +66 -0
- data/lib/adyen/services/management/split_configuration_merchant_level_api.rb +106 -0
- data/lib/adyen/services/management/terminal_actions_company_level_api.rb +36 -0
- data/lib/adyen/services/management/terminal_actions_terminal_level_api.rb +26 -0
- data/lib/adyen/services/management/terminal_orders_company_level_api.rb +116 -0
- data/lib/adyen/services/management/terminal_orders_merchant_level_api.rb +116 -0
- data/lib/adyen/services/management/terminal_settings_company_level_api.rb +56 -0
- data/lib/adyen/services/management/terminal_settings_merchant_level_api.rb +56 -0
- data/lib/adyen/services/management/terminal_settings_store_level_api.rb +96 -0
- data/lib/adyen/services/management/terminal_settings_terminal_level_api.rb +56 -0
- data/lib/adyen/services/management/terminals_terminal_level_api.rb +36 -0
- data/lib/adyen/services/management/users_company_level_api.rb +56 -0
- data/lib/adyen/services/management/users_merchant_level_api.rb +56 -0
- data/lib/adyen/services/management/webhooks_company_level_api.rb +86 -0
- data/lib/adyen/services/management/webhooks_merchant_level_api.rb +86 -0
- data/lib/adyen/services/management.rb +164 -0
- data/lib/adyen/services/marketpay.rb +42 -36
- data/lib/adyen/services/payment.rb +149 -0
- data/lib/adyen/services/paymentsApp.rb +67 -0
- data/lib/adyen/services/payout/initialization_api.rb +46 -0
- data/lib/adyen/services/payout/instant_payouts_api.rb +26 -0
- data/lib/adyen/services/payout/reviewing_api.rb +36 -0
- data/lib/adyen/services/payout.rb +34 -0
- data/lib/adyen/services/posMobile.rb +27 -0
- data/lib/adyen/services/posTerminalManagement.rb +82 -0
- data/lib/adyen/services/recurring.rb +70 -13
- data/lib/adyen/services/service.rb +8 -2
- data/lib/adyen/services/storedValue.rb +77 -0
- data/lib/adyen/services/terminalCloudAPI.rb +38 -0
- data/lib/adyen/services/transfers/capital_api.rb +55 -0
- data/lib/adyen/services/transfers/transactions_api.rb +36 -0
- data/lib/adyen/services/transfers/transfers_api.rb +76 -0
- data/lib/adyen/services/transfers.rb +34 -0
- data/lib/adyen/utils/hmac_validator.rb +52 -22
- data/lib/adyen/version.rb +2 -2
- data/lib/adyen-ruby-api-library.rb +23 -15
- data/renovate.json +3 -3
- data/spec/account_spec.rb +20 -20
- data/spec/balance_control_spec.rb +43 -0
- data/spec/balance_platform_spec.rb +129 -0
- data/spec/bin_lookup_spec.rb +69 -11
- data/spec/checkout-oauth_spec.rb +588 -0
- data/spec/checkout_spec.rb +591 -314
- data/spec/client_spec.rb +240 -45
- data/spec/data_protection_spec.rb +4 -4
- data/spec/disputes_spec.rb +45 -0
- data/spec/errors_spec.rb +44 -15
- data/spec/fund_spec.rb +10 -10
- data/spec/hash_with_accessors_spec.rb +18 -8
- data/spec/hop_spec.rb +4 -4
- data/spec/lem_spec.rb +63 -0
- data/spec/management-oauth_spec.rb +62 -0
- data/spec/management_spec.rb +66 -0
- data/spec/mocks/requests/BalanceControl/balance_transfer.json +10 -0
- data/spec/mocks/requests/BalancePlatform/create_account_holder.json +5 -0
- data/spec/mocks/requests/BalancePlatform/update_account_holder.json +10 -0
- data/spec/mocks/requests/Checkout/amount_updates.json +22 -0
- data/spec/mocks/requests/Checkout/apple_pay_sessions.json +5 -0
- data/spec/mocks/requests/Checkout/capture.json +34 -0
- data/spec/mocks/requests/Checkout/generic_cancel.json +5 -0
- data/spec/mocks/requests/Checkout/modifications_request.json +0 -0
- data/spec/mocks/requests/Checkout/psp_cancel.json +4 -0
- data/spec/mocks/requests/Checkout/refund.json +34 -0
- data/spec/mocks/requests/DisputesService/retrieve_applicable_defense_reasons.json +4 -0
- data/spec/mocks/requests/LegalEntityManagement/create_business_line.json +15 -0
- data/spec/mocks/requests/Management/create_store.json +15 -0
- data/spec/mocks/requests/Recurring/create_permit.json +6 -0
- data/spec/mocks/requests/StoredValue/issue_giftcard.json +12 -0
- data/spec/mocks/requests/TerminalCloudAPI/connected_terminals.json +3 -0
- data/spec/mocks/requests/TerminalCloudAPI/sync_payment.json +29 -0
- data/spec/mocks/requests/Transfers/get_transactions.json +82 -0
- data/spec/mocks/requests/Transfers/make_transfer.json +32 -0
- data/spec/mocks/responses/BalanceControl/balance_transfer.json +14 -0
- data/spec/mocks/responses/BalancePlatform/create_account_holder.json +41 -0
- data/spec/mocks/responses/BalancePlatform/get_balance_account.json +15 -0
- data/spec/mocks/responses/BalancePlatform/update_account_holder.json +16 -0
- data/spec/mocks/responses/Checkout/amount_updates.json +24 -0
- data/spec/mocks/responses/Checkout/apple_pay_sessions.json +3 -0
- data/spec/mocks/responses/Checkout/capture.json +37 -0
- data/spec/mocks/responses/Checkout/generic_cancel.json +7 -0
- data/spec/mocks/responses/Checkout/modifications.json +0 -0
- data/spec/mocks/responses/Checkout/psp_cancel.json +7 -0
- data/spec/mocks/responses/Checkout/refund.json +37 -0
- data/spec/mocks/responses/Checkout/stored_payment_methods.json +1 -0
- data/spec/mocks/responses/DisputesService/retrieve_applicable_defense_reasons.json +71 -0
- data/spec/mocks/responses/LegalEntityManagement/create_business_line.json +17 -0
- data/spec/mocks/responses/Management/create_store.json +23 -0
- data/spec/mocks/responses/Management/get_companies.json +42 -0
- data/spec/mocks/responses/Recurring/create_permit.json +4 -0
- data/spec/mocks/responses/StoredValue/issue_giftcard.json +13 -0
- data/spec/mocks/responses/TerminalCloudAPI/connected_terminals.json +5 -0
- data/spec/mocks/responses/TerminalCloudAPI/sync_payment.json +18 -0
- data/spec/mocks/responses/Transfers/get_transactions.json +82 -0
- data/spec/mocks/responses/Transfers/make_transfer.json +36 -0
- data/spec/mocks/responses/Webhooks/backslash_webhook.json +41 -0
- data/spec/mocks/responses/Webhooks/colon_webhook.json +41 -0
- data/spec/mocks/responses/Webhooks/forwardslash_webhook.json +41 -0
- data/spec/mocks/responses/Webhooks/mixed_webhook.json +41 -0
- data/spec/notification_spec.rb +9 -9
- data/spec/payments_spec.rb +39 -22
- data/spec/payouts_spec.rb +39 -15
- data/spec/pos_terminal_management_spec.rb +44 -0
- data/spec/recurring_spec.rb +8 -8
- data/spec/service_spec.rb +4 -0
- data/spec/spec_helper.rb +42 -46
- data/spec/stored_value_spec.rb +44 -0
- data/spec/terminal_cloud_api_spec.rb +91 -0
- data/spec/transfers_spec.rb +64 -0
- data/spec/utils/hmac_validator_spec.rb +53 -23
- data/templates/api-single.mustache +32 -0
- data/templates/api-small.mustache +39 -0
- data/templates/api.mustache +38 -0
- data/templates/config.yaml +10 -0
- metadata +160 -47
- data/.github/dependabot.yml +0 -8
- data/docs/checkout.html +0 -128
- data/docs/index.html +0 -50
- data/docs/install-library.html +0 -61
- data/docs/javascripts/prism.js +0 -5
- data/docs/javascripts/scale.fix.js +0 -17
- data/docs/marketpay.html +0 -171
- data/docs/params.json +0 -1
- data/docs/payment.html +0 -106
- data/docs/payout.html +0 -135
- data/docs/recurring.html +0 -113
- data/docs/stylesheets/github-light.css +0 -115
- data/docs/stylesheets/prism.css +0 -140
- data/docs/stylesheets/styles.css +0 -324
- data/docs/using-library.html +0 -67
- data/lib/adyen/services/bin_lookup.rb +0 -18
- data/lib/adyen/services/data_protection.rb +0 -17
- data/lib/adyen/services/dispute.rb +0 -20
- data/lib/adyen/services/payments.rb +0 -34
- data/lib/adyen/services/payouts.rb +0 -22
- data/lib/adyen/services/postfmapi.rb +0 -19
- data/spec/dispute_spec.rb +0 -17
- data/spec/mocks/requests/DisputeService/defend_dispute.json +0 -5
- data/spec/mocks/requests/DisputeService/delete_dispute_defense_document.json +0 -5
- data/spec/mocks/requests/DisputeService/retrieve_applicable_defense_reasons.json +0 -4
- data/spec/mocks/requests/DisputeService/supply_defense_document.json +0 -11
- data/spec/mocks/requests/Recurring/store_token.json +0 -15
- data/spec/mocks/responses/DisputeService/defend_dispute.json +0 -5
- data/spec/mocks/responses/DisputeService/delete_dispute_defense_document.json +0 -5
- data/spec/mocks/responses/DisputeService/retrieve_applicable_defense_reasons.json +0 -28
- data/spec/mocks/responses/DisputeService/supply_defense_document.json +0 -5
- data/spec/mocks/responses/Recurring/store_token.json +0 -7
- data/spec/postfmapi_spec.rb +0 -16
data/spec/payouts_spec.rb
CHANGED
@@ -1,19 +1,43 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'json'
|
2
3
|
|
3
|
-
RSpec.describe Adyen::
|
4
|
-
|
5
|
-
|
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
|
-
#
|
8
|
-
|
9
|
-
|
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
|
-
|
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
|
data/spec/recurring_spec.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
require
|
2
|
-
require_relative
|
1
|
+
require 'spec_helper'
|
2
|
+
require_relative '../lib/adyen/errors'
|
3
3
|
|
4
|
-
RSpec.describe Adyen::
|
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
|
-
[
|
12
|
-
[
|
13
|
-
[
|
14
|
-
[
|
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,
|
17
|
+
generate_tests(client, 'Recurring', test_sets, client.recurring)
|
18
18
|
end
|
data/spec/service_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
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
|
-
|
26
|
+
'Content-Type'.to_sym => 'application/json'
|
35
27
|
}
|
36
28
|
|
37
29
|
# authentication headers
|
38
|
-
if
|
39
|
-
headers[
|
40
|
-
elsif
|
41
|
-
|
42
|
-
|
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,
|
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
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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 =
|
97
|
-
client.ws_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 =
|
94
|
+
client.api_key = 'api_key'
|
100
95
|
else
|
101
|
-
raise ArgumentError
|
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(:
|
7
|
+
let(:webhook_request_item) do
|
8
8
|
{
|
9
|
-
additionalData
|
10
|
-
hmacSignature
|
9
|
+
'additionalData' => {
|
10
|
+
'hmacSignature' => expected_sign
|
11
11
|
},
|
12
|
-
amount
|
13
|
-
value
|
14
|
-
currency
|
12
|
+
'amount' => {
|
13
|
+
'value' => 1130,
|
14
|
+
'currency' => 'EUR'
|
15
15
|
},
|
16
|
-
pspReference
|
17
|
-
eventCode
|
18
|
-
merchantAccountCode
|
19
|
-
merchantReference
|
20
|
-
paymentMethod
|
21
|
-
success
|
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(
|
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.
|
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.
|
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
|
-
|
41
|
+
webhook_request_item['additionalData'] = { 'hmacSignature' => 'invalidHMACsign' }
|
48
42
|
|
49
|
-
expect(validator.
|
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
|