adyen-ruby-api-library 7.2.0 → 7.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc8273f0430a4f263253bff4a97356616958dbabea34e1bb46de537ee8ddc244
4
- data.tar.gz: 3e538becadaa36c48aa4c1af68543601be2deca4dba36ec144792e68104a65a3
3
+ metadata.gz: c1300892927a3672dfbd9089c748994ba1f039f25ecc5af6e7ef1d115d775ec1
4
+ data.tar.gz: 10a3cec4cbbb95fb24675f189e4f40cb11cd75f787b46744c889241d1b51e2b7
5
5
  SHA512:
6
- metadata.gz: 55ee3ccc92e7615e05329cbc12439aa6862b277db43bd4d33a9b97d9baa22843d31b8e816cc970a4636db7698487baa5f423b37de25c3bae2363c18e4dedbc6e
7
- data.tar.gz: 9c8d918b1790baf72aa4da31df12f87d6f90b97ed806d181dc32051d6f36f7a555d59bfc1e0def1fa3299f87d8494ae2d855a7a7871ddbfc485c43e7afb8eddc
6
+ metadata.gz: 131fa5d5a45b91f260e4e407a7512da5ae9e77857b22ecff4af3e0d8adfe34d9da8fe44b18cb30ee47b741318fb85656b679a3a71cf1608166de5345c0ec4a99
7
+ data.tar.gz: 56320c824a2a9d2ac463fe791a5617db494b23bc0bb014dbb3e74d33d3639f6e9610e8e7d4b83b6b9aa0c48642c869bff3fd957d3638da442144e5be4581a917
data/README.md CHANGED
@@ -215,6 +215,18 @@ statusRequest =
215
215
  response = adyen.terminal_cloud_api.sync(statusRequest)
216
216
  ```
217
217
 
218
+ ## OAuth usage (for Partners)
219
+ If you are using our OAuth service to make API requests on your customer's behalf, and you already got your Access Token as explained in the [OAuth Integration Guide](https://docs.adyen.com/development-resources/oauth/integration/#page-introduction), you can setup your Client like in the following example:
220
+
221
+ ~~~~ruby
222
+ adyen = Adyen::Client.new
223
+
224
+ adyen.oauth_token = "oauth_token"
225
+
226
+ ~~~~
227
+
228
+ The APIs available to use through OAuth in this library depend on the [OAuth Scopes](https://docs.adyen.com/development-resources/oauth/scopes/) defined when [Registering your OAuth client](https://docs.adyen.com/development-resources/oauth/integration/#step-1-register-your-client).
229
+
218
230
  ## Feedback
219
231
  We value your input! Help us enhance our API Libraries and improve the integration experience by providing your feedback. Please take a moment to fill out [our feedback form](https://forms.gle/A4EERrR6CWgKWe5r9) to share your thoughts, suggestions or ideas.
220
232
 
data/lib/adyen/client.rb CHANGED
@@ -12,16 +12,18 @@ require_relative './result'
12
12
 
13
13
  module Adyen
14
14
  class Client
15
- attr_accessor :ws_user, :ws_password, :api_key, :client, :adapter
16
- attr_reader :env, :connection_options
15
+ attr_accessor :ws_user, :ws_password, :api_key, :oauth_token, :client, :adapter
16
+ attr_reader :env, :connection_options, :adapter_options
17
17
 
18
- def initialize(ws_user: nil, ws_password: nil, api_key: nil, env: :live, adapter: nil, mock_port: 3001,
19
- live_url_prefix: nil, mock_service_url_base: nil, connection_options: nil)
18
+ def initialize(ws_user: nil, ws_password: nil, api_key: nil, oauth_token: nil, env: :live, adapter: nil, mock_port: 3001,
19
+ live_url_prefix: nil, mock_service_url_base: nil, connection_options: nil, adapter_options: nil)
20
20
  @ws_user = ws_user
21
21
  @ws_password = ws_password
22
22
  @api_key = api_key
23
+ @oauth_token = oauth_token
23
24
  @env = env
24
25
  @adapter = adapter || Faraday.default_adapter
26
+ @adapter_options = adapter_options || Faraday.default_adapter_options
25
27
  @mock_service_url_base = mock_service_url_base || "http://localhost:#{mock_port}"
26
28
  @live_url_prefix = live_url_prefix
27
29
  @connection_options = connection_options || Faraday::ConnectionOptions.new
@@ -113,44 +115,16 @@ module Adyen
113
115
  # get URL for requested endpoint
114
116
  url = service_url(service, action.is_a?(String) ? action : action.fetch(:url), version)
115
117
 
116
- # make sure right authentication has been provided
117
- # will use api_key if present, otherwise ws_user and ws_password
118
- if @api_key.nil?
119
- if service == 'PaymentSetupAndVerification'
120
- raise Adyen::AuthenticationError.new('Checkout service requires API-key', request_data),
121
- 'Checkout service requires API-key'
122
- elsif @ws_password.nil? || @ws_user.nil?
123
- raise Adyen::AuthenticationError.new(
124
- 'No authentication found - please set api_key or ws_user and ws_password',
125
- request_data
126
- ),
127
- 'No authentication found - please set api_key or ws_user and ws_password'
128
- else
129
- auth_type = 'basic'
130
- end
131
- else
132
- auth_type = 'api-key'
133
- end
118
+ auth_type = auth_type(service, request_data)
134
119
 
135
120
  # initialize Faraday connection object
136
121
  conn = Faraday.new(url, @connection_options) do |faraday|
137
- faraday.adapter @adapter
122
+ faraday.adapter @adapter, **@adapter_options
138
123
  faraday.headers['Content-Type'] = 'application/json'
139
124
  faraday.headers['User-Agent'] = "#{Adyen::NAME}/#{Adyen::VERSION}"
140
125
 
141
- # set auth type based on service
142
- case auth_type
143
- when 'basic'
144
- if Gem::Version.new(Faraday::VERSION) >= Gem::Version.new('2.0')
145
- # for faraday 2.0 and higher
146
- faraday.request :authorization, :basic, @ws_user, @ws_password
147
- else
148
- # for faraday 1.x
149
- faraday.basic_auth(@ws_user, @ws_password)
150
- end
151
- when 'api-key'
152
- faraday.headers['x-api-key'] = @api_key
153
- end
126
+ # set header based on auth_type and service
127
+ auth_header(auth_type, faraday)
154
128
 
155
129
  # add optional headers if specified in request
156
130
  # will overwrite default headers if overlapping
@@ -298,6 +272,49 @@ module Adyen
298
272
  def terminal_cloud_api
299
273
  @terminal_cloud_api ||= Adyen::TerminalCloudAPI.new(self)
300
274
  end
275
+
276
+ private
277
+
278
+ def auth_header(auth_type, faraday)
279
+ case auth_type
280
+ when "basic"
281
+ if Gem::Version.new(Faraday::VERSION) >= Gem::Version.new('2.0')
282
+ # for faraday 2.0 and higher
283
+ faraday.request :authorization, :basic, @ws_user, @ws_password
284
+ else
285
+ # for faraday 1.x
286
+ faraday.basic_auth(@ws_user, @ws_password)
287
+ end
288
+ when "api-key"
289
+ faraday.headers["x-api-key"] = @api_key
290
+ when "oauth"
291
+ faraday.headers["Authorization"] = "Bearer #{@oauth_token}"
292
+ end
293
+ end
294
+
295
+ def auth_type(service, request_data)
296
+ # make sure valid authentication has been provided
297
+ validate_auth_type(service, request_data)
298
+ # Will prioritize authentication methods in this order:
299
+ # api-key, oauth, basic
300
+ return "api-key" unless @api_key.nil?
301
+ return "oauth" unless @oauth_token.nil?
302
+ "basic"
303
+ end
304
+
305
+ def validate_auth_type(service, request_data)
306
+ # ensure authentication has been provided
307
+ if @api_key.nil? && @oauth_token.nil? && (@ws_password.nil? || @ws_user.nil?)
308
+ raise Adyen::AuthenticationError.new(
309
+ 'No authentication found - please set api_key, oauth_token, or ws_user and ws_password',
310
+ request_data
311
+ )
312
+ end
313
+ if service == "PaymentSetupAndVerification" && @api_key.nil? && @oauth_token.nil? && @ws_password.nil? && @ws_user.nil?
314
+ raise Adyen::AuthenticationError.new('Checkout service requires API-key or oauth_token', request_data),
315
+ 'Checkout service requires API-key or oauth_token'
316
+ end
317
+ end
301
318
  end
302
319
  end
303
320
  # rubocop:enable all
data/lib/adyen/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Adyen
2
2
  NAME = 'adyen-ruby-api-library'.freeze
3
- VERSION = '7.2.0'.freeze
3
+ VERSION = '7.3.0'.freeze
4
4
  end
@@ -0,0 +1,621 @@
1
+ require "spec_helper"
2
+ require "json"
3
+
4
+ # rubocop:disable Metrics/BlockLength
5
+ RSpec.describe "Adyen::Checkout OAuth authentication", service: "checkout" do
6
+ before(:all) do
7
+ @shared_values = {
8
+ client: create_client(:oauth),
9
+ service: "Checkout",
10
+ }
11
+ @auth_header = { "Authorization": "Bearer #{@shared_values[:client].oauth_token}" }
12
+ end
13
+
14
+ # must be created manually because every field in the response is an array
15
+ it "makes a payment_methods call", focus: true do
16
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/payment_methods.json"))
17
+
18
+ response_body = json_from_file("mocks/responses/Checkout/payment_methods.json")
19
+
20
+ url = @shared_values[:client].service_url(@shared_values[:service], "paymentMethods", @shared_values[:client].checkout.version)
21
+ WebMock.stub_request(:post, url).
22
+ with(
23
+ body: request_body,
24
+ headers: @auth_header
25
+ ).
26
+ to_return(
27
+ body: response_body
28
+ )
29
+
30
+ result = @shared_values[:client].checkout.payments_api.payment_methods(request_body)
31
+ response_hash = result.response
32
+
33
+ expect(result.status).
34
+ to eq(200)
35
+ expect(response_hash).
36
+ to eq(JSON.parse(response_body))
37
+ expect(response_hash).
38
+ to be_a Adyen::HashWithAccessors
39
+ expect(response_hash).
40
+ to be_a_kind_of Hash
41
+ end
42
+
43
+ it "makes a paymentMethods/balance call" do
44
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/payment_methods_balance.json"))
45
+
46
+ response_body = json_from_file("mocks/responses/Checkout/payment_methods_balance.json")
47
+
48
+ url = @shared_values[:client].service_url(@shared_values[:service], "paymentMethods/balance", @shared_values[:client].checkout.version)
49
+ WebMock.stub_request(:post, url).
50
+ with(
51
+ body: request_body,
52
+ headers: @auth_header
53
+ ).
54
+ to_return(
55
+ body: response_body
56
+ )
57
+
58
+ result = @shared_values[:client].checkout.orders_api.get_balance_of_gift_card(request_body)
59
+ # result.response is already a Ruby hash (rather than an unparsed JSON string)
60
+ response_hash = result.response
61
+
62
+ expect(result.status).
63
+ to eq(200)
64
+ expect(response_hash).
65
+ to eq(JSON.parse(response_body))
66
+ expect(response_hash).
67
+ to be_a Adyen::HashWithAccessors
68
+ expect(response_hash).
69
+ to be_a_kind_of Hash
70
+ expect(response_hash["balance"]).
71
+ to eq("100")
72
+ end
73
+
74
+ # must be created manually due to payments/details format
75
+ it "makes a payments/details call" do
76
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/payment-details.json"))
77
+
78
+ response_body = json_from_file("mocks/responses/Checkout/payment-details.json")
79
+
80
+ url = @shared_values[:client].service_url(@shared_values[:service], "payments/details", @shared_values[:client].checkout.version)
81
+ WebMock.stub_request(:post, url).
82
+ with(
83
+ body: request_body,
84
+ headers: @auth_header
85
+ ).
86
+ to_return(
87
+ body: response_body
88
+ )
89
+
90
+ result = @shared_values[:client].checkout.payments_api.payments_details(request_body)
91
+ # result.response is already a Ruby hash (rather than an unparsed JSON string)
92
+ response_hash = result.response
93
+
94
+ expect(result.status).
95
+ to eq(200)
96
+ expect(response_hash).
97
+ to eq(JSON.parse(response_body))
98
+ expect(response_hash).
99
+ to be_a Adyen::HashWithAccessors
100
+ expect(response_hash).
101
+ to be_a_kind_of Hash
102
+ expect(response_hash["resultCode"]).
103
+ to eq("RedirectShopper")
104
+ expect(response_hash.resultCode).
105
+ to eq("RedirectShopper")
106
+ end
107
+
108
+ # must be created manually due to payments/result format
109
+ it "makes a payments/result call" do
110
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/payment-result.json"))
111
+
112
+ response_body = json_from_file("mocks/responses/Checkout/payment-result.json")
113
+
114
+ url = @shared_values[:client].service_url(@shared_values[:service], "payments/result", @shared_values[:client].checkout.version)
115
+ WebMock.stub_request(:post, url).
116
+ with(
117
+ body: request_body,
118
+ headers: @auth_header
119
+ ).
120
+ to_return(
121
+ body: response_body
122
+ )
123
+
124
+ result = @shared_values[:client].checkout.classic_checkout_sdk_api.verify_payment_result(request_body)
125
+ response_hash = result.response
126
+
127
+ expect(result.status).
128
+ to eq(200)
129
+ expect(response_hash).
130
+ to eq(JSON.parse(response_body))
131
+ expect(response_hash).
132
+ to be_a Adyen::HashWithAccessors
133
+ expect(response_hash).
134
+ to be_a_kind_of Hash
135
+ expect(response_hash["resultCode"]).
136
+ to eq("Authorised")
137
+ expect(response_hash.resultCode).
138
+ to eq("Authorised")
139
+ end
140
+
141
+ # must be created manually due to paymentsLinks format
142
+ it "makes a paymentLinks call" do
143
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/payment_links.json"))
144
+
145
+ response_body = json_from_file("mocks/responses/Checkout/payment_links.json")
146
+
147
+ url = @shared_values[:client].service_url(@shared_values[:service], "paymentLinks", @shared_values[:client].checkout.version)
148
+ WebMock.stub_request(:post, url).
149
+ with(
150
+ body: request_body,
151
+ headers: @auth_header
152
+ ).
153
+ to_return(
154
+ body: response_body
155
+ )
156
+
157
+ result = @shared_values[:client].checkout.payment_links_api.payment_links(request_body)
158
+ response_hash = result.response
159
+
160
+ expect(result.status).
161
+ to eq(200)
162
+ expect(response_hash).
163
+ to eq(JSON.parse(response_body))
164
+ expect(response_hash).
165
+ to be_a Adyen::HashWithAccessors
166
+ expect(response_hash).
167
+ to be_a_kind_of Hash
168
+ end
169
+
170
+ # must be created manually due to paymentsLinks/{linkId} format
171
+ it "makes a get paymentLinks/{linkId} call" do
172
+ response_body = json_from_file("mocks/responses/Checkout/get-payment-link.json")
173
+
174
+ url = @shared_values[:client].service_url(@shared_values[:service], "paymentLinks/1", @shared_values[:client].checkout.version)
175
+ WebMock.stub_request(:get, url).
176
+ with(
177
+ headers: @auth_header
178
+ ).
179
+ to_return(
180
+ body: response_body
181
+ )
182
+
183
+ result = @shared_values[:client].checkout.payment_links_api.get_payment_link("1")
184
+ response_hash = result.response
185
+
186
+ expect(result.status).
187
+ to eq(200)
188
+ expect(response_hash).
189
+ to eq(JSON.parse(response_body))
190
+ expect(response_hash).
191
+ to be_a Adyen::HashWithAccessors
192
+ expect(response_hash).
193
+ to be_a_kind_of Hash
194
+ expect(response_hash["status"]).
195
+ to eq("active")
196
+ expect(response_hash.id).
197
+ to eq("MockId")
198
+ end
199
+
200
+ # must be created manually due to paymentsLinks/{linkId} format
201
+ it "makes a patch paymentLinks/{linkId} call" do
202
+ request_body = {
203
+ :status => "expired",
204
+ }
205
+
206
+ response_body = json_from_file("mocks/responses/Checkout/update-payment-link.json")
207
+
208
+ url = @shared_values[:client].service_url(@shared_values[:service], "paymentLinks/1", @shared_values[:client].checkout.version)
209
+ WebMock.stub_request(:patch, url).
210
+ with(
211
+ body: request_body,
212
+ headers: @auth_header
213
+ ).
214
+ to_return(
215
+ body: response_body
216
+ )
217
+
218
+ result = @shared_values[:client].checkout.payment_links_api.update_payment_link(request_body, "1")
219
+ response_hash = result.response
220
+
221
+ expect(result.status).
222
+ to eq(200)
223
+ expect(response_hash).
224
+ to eq(JSON.parse(response_body))
225
+ expect(response_hash).
226
+ to be_a Adyen::HashWithAccessors
227
+ expect(response_hash).
228
+ to be_a_kind_of Hash
229
+ expect(response_hash["status"]).
230
+ to eq("expired")
231
+ expect(response_hash.id).
232
+ to eq("MockId")
233
+ end
234
+
235
+ it "makes an orders call" do
236
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/orders.json"))
237
+
238
+ response_body = json_from_file("mocks/responses/Checkout/orders.json")
239
+
240
+ url = @shared_values[:client].service_url(@shared_values[:service], "orders", @shared_values[:client].checkout.version)
241
+ WebMock.stub_request(:post, url).
242
+ with(
243
+ body: request_body,
244
+ headers: @auth_header
245
+ ).
246
+ to_return(
247
+ body: response_body
248
+ )
249
+
250
+ result = @shared_values[:client].checkout.orders_api.orders(request_body)
251
+ response_hash = result.response
252
+
253
+ expect(result.status).
254
+ to eq(200)
255
+ expect(response_hash).
256
+ to eq(JSON.parse(response_body))
257
+ expect(response_hash).
258
+ to be_a Adyen::HashWithAccessors
259
+ expect(response_hash).
260
+ to be_a_kind_of Hash
261
+ expect(response_hash["remainingAmount"]["value"]).
262
+ to eq(100)
263
+ end
264
+
265
+ it "makes an orders/cancel call" do
266
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/orders_cancel.json"))
267
+
268
+ response_body = json_from_file("mocks/responses/Checkout/orders_cancel.json")
269
+
270
+ url = @shared_values[:client].service_url(@shared_values[:service], "orders/cancel", @shared_values[:client].checkout.version)
271
+ WebMock.stub_request(:post, url).
272
+ with(
273
+ body: request_body,
274
+ headers: @auth_header
275
+ ).
276
+ to_return(
277
+ body: response_body
278
+ )
279
+
280
+ result = @shared_values[:client].checkout.orders_api.cancel_order(request_body)
281
+ response_hash = result.response
282
+
283
+ expect(result.status).
284
+ to eq(200)
285
+ expect(response_hash).
286
+ to eq(JSON.parse(response_body))
287
+ expect(response_hash).
288
+ to be_a Adyen::HashWithAccessors
289
+ expect(response_hash).
290
+ to be_a_kind_of Hash
291
+ expect(response_hash["resultCode"]).
292
+ to eq("cancelled")
293
+ end
294
+
295
+ it "makes an applePay/sessions call" do
296
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/apple_pay_sessions.json"))
297
+
298
+ response_body = json_from_file("mocks/responses/Checkout/apple_pay_sessions.json")
299
+
300
+ url = @shared_values[:client].service_url(@shared_values[:service], "applePay/sessions", @shared_values[:client].checkout.version)
301
+ WebMock.stub_request(:post, url).
302
+ with(
303
+ body: request_body,
304
+ headers: @auth_header
305
+ ).
306
+ to_return(
307
+ body: response_body
308
+ )
309
+
310
+ result = @shared_values[:client].checkout.utility_api.get_apple_pay_session(request_body)
311
+ response_hash = result.response
312
+
313
+ expect(result.status).
314
+ to eq(200)
315
+ expect(response_hash).
316
+ to eq(JSON.parse(response_body))
317
+ expect(response_hash).
318
+ to be_a Adyen::HashWithAccessors
319
+ expect(response_hash).
320
+ to be_a_kind_of Hash
321
+ expect(response_hash["data"]).
322
+ to eq("LARGE_BLOB_HERE")
323
+ end
324
+
325
+ it "makes a sessions call" do
326
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/sessions.json"))
327
+
328
+ response_body = json_from_file("mocks/responses/Checkout/sessions-success.json")
329
+
330
+ url = @shared_values[:client].service_url(@shared_values[:service], "sessions", @shared_values[:client].checkout.version)
331
+ WebMock.stub_request(:post, url).
332
+ with(
333
+ body: request_body,
334
+ headers: @auth_header
335
+ )
336
+ .to_return(body: response_body, status: 201)
337
+
338
+ result = @shared_values[:client].checkout.payments_api.sessions(request_body)
339
+ response_hash = result.response
340
+
341
+ expect(result.status).
342
+ to eq(201)
343
+ expect(response_hash).
344
+ to eq(JSON.parse(response_body))
345
+ expect(response_hash).
346
+ to be_a Adyen::HashWithAccessors
347
+ expect(response_hash).
348
+ to be_a_kind_of Hash
349
+ end
350
+
351
+ it "makes a capture call" do
352
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/capture.json"))
353
+
354
+ response_body = json_from_file("mocks/responses/Checkout/capture.json")
355
+
356
+ url = @shared_values[:client].service_url(@shared_values[:service], "payments/12345/captures", @shared_values[:client].checkout.version)
357
+ WebMock.stub_request(:post, url).
358
+ with(
359
+ body: request_body,
360
+ headers: @auth_header
361
+ )
362
+ .to_return(body: response_body, status: 201)
363
+
364
+ result = @shared_values[:client].checkout.modifications_api.capture_authorised_payment(request_body, "12345")
365
+ response_hash = result.response
366
+
367
+ expect(result.status).
368
+ to eq(201)
369
+ expect(response_hash).
370
+ to eq(JSON.parse(response_body))
371
+ expect(response_hash).
372
+ to be_a Adyen::HashWithAccessors
373
+ expect(response_hash).
374
+ to be_a_kind_of Hash
375
+ expect(response_hash.reference).
376
+ to eq("123456789")
377
+ expect(response_hash.pspReference).
378
+ to eq("12345")
379
+ end
380
+
381
+ it "makes a psp specific cancel call" do
382
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/psp_cancel.json"))
383
+
384
+ response_body = json_from_file("mocks/responses/Checkout/psp_cancel.json")
385
+
386
+ url = @shared_values[:client].service_url(@shared_values[:service], "payments/12345/cancels", @shared_values[:client].checkout.version)
387
+ WebMock.stub_request(:post, url).
388
+ with(
389
+ body: request_body,
390
+ headers: @auth_header
391
+ )
392
+ .to_return(body: response_body, status: 201)
393
+
394
+ result = @shared_values[:client].checkout.modifications_api.cancel_authorised_payment_by_psp_reference(request_body, "12345")
395
+ response_hash = result.response
396
+
397
+ expect(result.status).
398
+ to eq(201)
399
+ expect(response_hash).
400
+ to eq(JSON.parse(response_body))
401
+ expect(response_hash).
402
+ to be_a Adyen::HashWithAccessors
403
+ expect(response_hash).
404
+ to be_a_kind_of Hash
405
+ expect(response_hash.reference).
406
+ to eq("123456789")
407
+ expect(response_hash.pspReference).
408
+ to eq("12345")
409
+ end
410
+
411
+ it "makes a psp specific refunds call" do
412
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/refund.json"))
413
+
414
+ response_body = json_from_file("mocks/responses/Checkout/refund.json")
415
+
416
+ url = @shared_values[:client].service_url(@shared_values[:service], "payments/12345/refunds", @shared_values[:client].checkout.version)
417
+ WebMock.stub_request(:post, url).
418
+ with(
419
+ body: request_body,
420
+ headers: @auth_header
421
+ )
422
+ .to_return(body: response_body, status: 201)
423
+
424
+ result = @shared_values[:client].checkout.modifications_api.refund_captured_payment(request_body, "12345")
425
+ response_hash = result.response
426
+
427
+ expect(result.status).
428
+ to eq(201)
429
+ expect(response_hash).
430
+ to eq(JSON.parse(response_body))
431
+ expect(response_hash).
432
+ to be_a Adyen::HashWithAccessors
433
+ expect(response_hash).
434
+ to be_a_kind_of Hash
435
+ expect(response_hash.reference).
436
+ to eq("123456789")
437
+ expect(response_hash.pspReference).
438
+ to eq("12345")
439
+ end
440
+
441
+ it "makes a psp specific reversals call" do
442
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/psp_cancel.json"))
443
+
444
+ response_body = json_from_file("mocks/responses/Checkout/psp_cancel.json")
445
+
446
+ url = @shared_values[:client].service_url(@shared_values[:service], "payments/12345/reversals", @shared_values[:client].checkout.version)
447
+ WebMock.stub_request(:post, url).
448
+ with(
449
+ body: request_body,
450
+ headers: @auth_header
451
+ )
452
+ .to_return(body: response_body, status: 201)
453
+
454
+ result = @shared_values[:client].checkout.modifications_api.refund_or_cancel_payment(request_body, "12345")
455
+ response_hash = result.response
456
+
457
+ expect(result.status).
458
+ to eq(201)
459
+ expect(response_hash).
460
+ to eq(JSON.parse(response_body))
461
+ expect(response_hash).
462
+ to be_a Adyen::HashWithAccessors
463
+ expect(response_hash).
464
+ to be_a_kind_of Hash
465
+ expect(response_hash.reference).
466
+ to eq("123456789")
467
+ expect(response_hash.pspReference).
468
+ to eq("12345")
469
+ end
470
+
471
+ it "makes a psp specific amountUpdates call" do
472
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/amount_updates.json"))
473
+
474
+ response_body = json_from_file("mocks/responses/Checkout/amount_updates.json")
475
+
476
+ url = @shared_values[:client].service_url(@shared_values[:service], "payments/12345/amountUpdates", @shared_values[:client].checkout.version)
477
+ WebMock.stub_request(:post, url).
478
+ with(
479
+ body: request_body,
480
+ headers: @auth_header
481
+ )
482
+ .to_return(body: response_body, status: 201)
483
+
484
+ result = @shared_values[:client].checkout.modifications_api.update_authorised_amount(request_body, "12345")
485
+ response_hash = result.response
486
+
487
+ expect(result.status).
488
+ to eq(201)
489
+ expect(response_hash).
490
+ to eq(JSON.parse(response_body))
491
+ expect(response_hash).
492
+ to be_a Adyen::HashWithAccessors
493
+ expect(response_hash).
494
+ to be_a_kind_of Hash
495
+ expect(response_hash.reference).
496
+ to eq("123456789")
497
+ expect(response_hash.pspReference).
498
+ to eq("12345")
499
+ end
500
+
501
+ it "makes a generic cancel call" do
502
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/generic_cancel.json"))
503
+
504
+ response_body = json_from_file("mocks/responses/Checkout/generic_cancel.json")
505
+
506
+ url = @shared_values[:client].service_url(@shared_values[:service], "cancels", @shared_values[:client].checkout.version)
507
+ WebMock.stub_request(:post, url).
508
+ with(
509
+ body: request_body,
510
+ headers: @auth_header
511
+ )
512
+ .to_return(body: response_body, status: 201)
513
+
514
+ result = @shared_values[:client].checkout.modifications_api.cancel_authorised_payment(request_body)
515
+ response_hash = result.response
516
+
517
+ expect(result.status).
518
+ to eq(201)
519
+ expect(response_hash).
520
+ to eq(JSON.parse(response_body))
521
+ expect(response_hash).
522
+ to be_a Adyen::HashWithAccessors
523
+ expect(response_hash).
524
+ to be_a_kind_of Hash
525
+ expect(response_hash.reference).
526
+ to eq("123456789")
527
+ expect(response_hash.pspReference).
528
+ to eq("12345")
529
+ end
530
+
531
+ it "makes a get storedPaymentMethods call" do
532
+ response_body = json_from_file("mocks/responses/Checkout/stored_payment_methods.json")
533
+
534
+ url = @shared_values[:client].service_url(@shared_values[:service], "storedPaymentMethods?merchantAccount=TestMerchantAccount&shopperReference=test-1234", @shared_values[:client].checkout.version)
535
+ WebMock.stub_request(:get, url).
536
+ with(
537
+ headers: @auth_header
538
+ ).
539
+ to_return(
540
+ body: response_body
541
+ )
542
+
543
+ result = @shared_values[:client].checkout.recurring_api.get_tokens_for_stored_payment_details(query_params: {"merchantAccount" => "TestMerchantAccount", "shopperReference" => "test-1234"})
544
+ response_hash = result.response
545
+
546
+ expect(result.status).
547
+ to eq(200)
548
+ expect(response_hash).
549
+ to eq(JSON.parse(response_body))
550
+ expect(response_hash).
551
+ to be_a Adyen::HashWithAccessors
552
+ expect(response_hash).
553
+ to be_a_kind_of Hash
554
+ expect(response_hash["shopperReference"]).
555
+ to eq("test-1234")
556
+ end
557
+
558
+ it "makes a delete storedPaymentMethods call" do
559
+
560
+ url = @shared_values[:client].service_url(@shared_values[:service], "storedPaymentMethods/RL8FW7WZM6KXWD82?merchantAccount=TestMerchantAccount&shopperReference=test-1234", @shared_values[:client].checkout.version)
561
+ WebMock.stub_request(:delete, url).
562
+ with(
563
+ headers: @auth_header
564
+ ).
565
+ to_return(
566
+ body: "{}"
567
+ )
568
+
569
+ result = @shared_values[:client].checkout.recurring_api.delete_token_for_stored_payment_details("RL8FW7WZM6KXWD82", query_params:{"merchantAccount" => "TestMerchantAccount", "shopperReference" => "test-1234"})
570
+ response_hash = result.response
571
+
572
+ expect(result.status).
573
+ to eq(200)
574
+ end
575
+
576
+ it "tests sending the application headers" do
577
+ response_body = json_from_file("mocks/responses/Checkout/stored_payment_methods.json")
578
+
579
+ url = @shared_values[:client].service_url(@shared_values[:service], "storedPaymentMethods?merchantAccount=TestMerchantAccount&shopperReference=test-1234", @shared_values[:client].checkout.version)
580
+ WebMock.stub_request(:get, url).
581
+ with(
582
+ headers: @auth_header
583
+ ).
584
+ to_return(
585
+ body: response_body
586
+ )
587
+
588
+ result = @shared_values[:client].checkout.recurring_api.get_tokens_for_stored_payment_details(query_params:{"merchantAccount" => "TestMerchantAccount", "shopperReference" => "test-1234"})
589
+ expect(
590
+ a_request(:get, "http://localhost:3001/v70/storedPaymentMethods?merchantAccount=TestMerchantAccount&shopperReference=test-1234")
591
+ .with(headers: {
592
+ 'Accept' => '*/*',
593
+ 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
594
+ 'Adyen-Library-Name' => 'adyen-ruby-api-library',
595
+ 'Adyen-Library-Version' => Adyen::VERSION,
596
+ 'Content-Type' => 'application/json',
597
+ 'User-Agent' => 'adyen-ruby-api-library/' + Adyen::VERSION,
598
+ 'Authorization'=>'Bearer oauth_token'
599
+ })
600
+ ).to have_been_made.once
601
+ end
602
+
603
+ # must be created manually because every field in the response is an array
604
+ it "makes a LIVE paymentMethods call" do
605
+ request_body = JSON.parse(json_from_file("mocks/requests/Checkout/payment_methods.json"))
606
+
607
+ response_body = json_from_file("mocks/responses/Checkout/payment_methods.json")
608
+
609
+ adyen = Adyen::Client.new
610
+ adyen.api_key = 'AF5XXXXXXXXXXXXXXXXXXXX'
611
+ adyen.env = :live
612
+ adyen.live_url_prefix = "prefix"
613
+ url = adyen.service_url("Checkout", "paymentMethods", @shared_values[:client].checkout.version)
614
+
615
+ expect(url).
616
+ to eq("https://prefix-checkout-live.adyenpayments.com/checkout/v70/paymentMethods")
617
+
618
+ end
619
+ end
620
+
621
+ # rubocop:enable Metrics/BlockLength
data/spec/client_spec.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe Adyen do
4
- before(:all) do
4
+ before(:each) do
5
5
  @shared_values = {
6
- client: nil
6
+ client: Adyen::Client.new(env: :test)
7
7
  }
8
8
  end
9
9
 
@@ -32,6 +32,11 @@ RSpec.describe Adyen do
32
32
  .to raise_error(Adyen::AuthenticationError)
33
33
  end
34
34
 
35
+ it "fails a checkout call without oauth token" do
36
+ expect{ @shared_values[:client].checkout.payments_api.payment_methods("{}") }.
37
+ to raise_error(Adyen::AuthenticationError)
38
+ end
39
+
35
40
  it 'fails a checkout call without api key' do
36
41
  expect { @shared_values[:client].checkout.payments_api.payment_methods('{}') }
37
42
  .to raise_error(Adyen::AuthenticationError)
@@ -125,52 +130,52 @@ RSpec.describe Adyen do
125
130
  client.checkout.payments_api.payments_details(request_body)
126
131
  end
127
132
 
128
- it "checks the creation of checkout url" do
133
+ it "checks the creation of checkout url" do
129
134
  client = Adyen::Client.new(api_key: "api_key", env: :test)
130
135
  expect(client.service_url("Checkout", "paymentMethods", "70")).
131
136
  to eq("https://checkout-test.adyen.com/v70/paymentMethods")
132
- end
137
+ end
133
138
 
134
- it "checks the creation of checkout url" do
139
+ it "checks the creation of checkout url" do
135
140
  client = Adyen::Client.new(api_key: "api_key", env: :live, live_url_prefix: "YourLiveUrlPrefix")
136
141
  expect(client.service_url("Checkout", "paymentMethods", "70")).
137
142
  to eq("https://YourLiveUrlPrefix-checkout-live.adyenpayments.com/checkout/v70/paymentMethods")
138
- end
139
- it "checks the creation of lem url" do
143
+ end
144
+ it "checks the creation of lem url" do
140
145
  client = Adyen::Client.new(api_key: "api_key", env: :live)
141
146
  expect(client.service_url("LegalEntityManagement", "businessLines", "3")).
142
147
  to eq("https://kyc-live.adyen.com/lem/v3/businessLines")
143
- end
148
+ end
144
149
 
145
- it "checks the creation of balancePlatform url" do
150
+ it "checks the creation of balancePlatform url" do
146
151
  client = Adyen::Client.new(api_key: "api_key", env: :live)
147
152
  expect(client.service_url("BalancePlatform", "legalEntities", "1")).
148
153
  to eq("https://balanceplatform-api-live.adyen.com/bcl/v1/legalEntities")
149
- end
154
+ end
150
155
 
151
- it "checks the creation of balancePlatform url" do
156
+ it "checks the creation of balancePlatform url" do
152
157
  client = Adyen::Client.new(api_key: "api_key", env: :test)
153
158
  expect(client.service_url("BalancePlatform", "legalEntities", "1")).
154
159
  to eq("https://balanceplatform-api-test.adyen.com/bcl/v1/legalEntities")
155
- end
160
+ end
156
161
 
157
- it "checks the creation of transfers url" do
162
+ it "checks the creation of transfers url" do
158
163
  client = Adyen::Client.new(api_key: "api_key", env: :test)
159
164
  expect(client.service_url("Transfers", "transactions", "1")).
160
165
  to eq("https://balanceplatform-api-test.adyen.com/btl/v1/transactions")
161
- end
166
+ end
162
167
 
163
- it "checks the creation of management url" do
168
+ it "checks the creation of management url" do
164
169
  client = Adyen::Client.new(api_key: "api_key", env: :test)
165
170
  expect(client.service_url("Management", "companies", "1")).
166
171
  to eq("https://management-test.adyen.com/v1/companies")
167
- end
172
+ end
168
173
 
169
- it "checks the creation of binLookup url" do
174
+ it "checks the creation of binLookup url" do
170
175
  client = Adyen::Client.new(api_key: "api_key", env: :test)
171
176
  expect(client.service_url("BinLookup", "getCostEstimate", "54")).
172
177
  to eq("https://pal-test.adyen.com/pal/servlet/BinLookup/v54/getCostEstimate")
173
- end
178
+ end
174
179
 
175
180
  it "check the creation of storedValue url" do
176
181
  client = Adyen::Client.new(api_key: "api_key", env: :test)
@@ -253,6 +258,6 @@ RSpec.describe Adyen do
253
258
  client = Adyen::Client.new(api_key: 'api_key', env: :test)
254
259
  expect(client.service_url('TerminalCloudAPI', 'connectedTerminals', nil))
255
260
  .to eq('https://terminal-api-test.adyen.com/connectedTerminals')
256
-
261
+
257
262
  end
258
263
  end
@@ -0,0 +1,62 @@
1
+ require "spec_helper"
2
+ require "json"
3
+
4
+ # rubocop:disable Metrics/BlockLength
5
+
6
+ RSpec.describe "Adyen::Management OAuth Authentication", service: "Management" do
7
+ before(:all) do
8
+ @shared_values = {
9
+ client: create_client(:oauth),
10
+ service: "Management",
11
+ }
12
+ @auth_header = { "Authorization": "Bearer #{@shared_values[:client].oauth_token}" }
13
+ end
14
+
15
+ # must be created manually because every field in the response is an array
16
+ it "makes a companies GET call" do
17
+ response_body = json_from_file("mocks/responses/Management/get_companies.json")
18
+
19
+ url = @shared_values[:client].service_url(@shared_values[:service], "companies", @shared_values[:client].management.version)
20
+ WebMock.stub_request(:get, url).
21
+ with(
22
+ headers: @auth_header
23
+ ).
24
+ to_return(
25
+ body: response_body
26
+ )
27
+
28
+ result = @shared_values[:client].management.account_company_level_api.list_company_accounts()
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 create_store POST call" do
42
+ request_body = JSON.parse(json_from_file("mocks/responses/LegalEntityManagement/create_business_line.json"))
43
+
44
+ response_body = json_from_file("mocks/responses/LegalEntityManagement/create_business_line.json")
45
+
46
+ url = @shared_values[:client].service_url(@shared_values[:service], "merchants/merchantID/stores", @shared_values[:client].management.version)
47
+ WebMock.stub_request(:post, url).
48
+ with(
49
+ body: request_body,
50
+ headers: @auth_header
51
+ ).
52
+ to_return(
53
+ body: response_body
54
+ )
55
+
56
+ result = @shared_values[:client].management.account_store_level_api.create_store_by_merchant_id(request_body, 'merchantID')
57
+ response_hash = result.response
58
+
59
+ expect(result.status).
60
+ to eq(200)
61
+ end
62
+ end
data/spec/spec_helper.rb CHANGED
@@ -29,6 +29,8 @@ def create_test(client, service, method_name, parent_object)
29
29
  # authentication headers
30
30
  if !client.api_key.nil?
31
31
  headers['x-api-key'] = client.api_key
32
+ elsif !client.oauth_token.nil?
33
+ headers["Authorization"] = "Bearer #{client.oauth_token}"
32
34
  elsif !client.ws_user.nil? && !client.ws_password.nil?
33
35
  auth_header = "Basic #{Base64.encode64("#{client.ws_user}:#{client.ws_password}")}"
34
36
  headers['Authorization'] = auth_header.strip
@@ -79,13 +81,15 @@ def generate_tests(client, service, test_sets, parent_object)
79
81
  end
80
82
 
81
83
  # create and return a client for testing
82
- # auth_type must be one of [:basic, :api_key]
84
+ # auth_type must be one of [:basic, :api_key, :oauth]
83
85
  def create_client(auth_type)
84
86
  client = Adyen::Client.new
85
87
  client.env = :mock
86
88
  if auth_type == :basic
87
89
  client.ws_user = 'user'
88
90
  client.ws_password = 'password'
91
+ elsif auth_type == :oauth
92
+ client.oauth_token = 'oauth_token'
89
93
  elsif auth_type == :api_key
90
94
  client.api_key = 'api_key'
91
95
  else
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adyen-ruby-api-library
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.2.0
4
+ version: 7.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adyen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-11 00:00:00.000000000 Z
11
+ date: 2023-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -203,6 +203,7 @@ files:
203
203
  - spec/balance_control_spec.rb
204
204
  - spec/balance_platform_spec.rb
205
205
  - spec/bin_lookup_spec.rb
206
+ - spec/checkout-oauth_spec.rb
206
207
  - spec/checkout_spec.rb
207
208
  - spec/client_spec.rb
208
209
  - spec/data_protection_spec.rb
@@ -212,6 +213,7 @@ files:
212
213
  - spec/hash_with_accessors_spec.rb
213
214
  - spec/hop_spec.rb
214
215
  - spec/lem_spec.rb
216
+ - spec/management-oauth_spec.rb
215
217
  - spec/management_spec.rb
216
218
  - spec/mocks/requests/Account/check_account_holder.json
217
219
  - spec/mocks/requests/Account/close_account.json