adyen-ruby-api-library 7.2.0 → 7.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc8273f0430a4f263253bff4a97356616958dbabea34e1bb46de537ee8ddc244
4
- data.tar.gz: 3e538becadaa36c48aa4c1af68543601be2deca4dba36ec144792e68104a65a3
3
+ metadata.gz: 5f92203448587aeac3de504e35af2298e7b279dbec39272caf1b3502f79a6f77
4
+ data.tar.gz: 2366da0ada0249bbeae5d3f21f051150f2e687054122e782e4f671128a8fb471
5
5
  SHA512:
6
- metadata.gz: 55ee3ccc92e7615e05329cbc12439aa6862b277db43bd4d33a9b97d9baa22843d31b8e816cc970a4636db7698487baa5f423b37de25c3bae2363c18e4dedbc6e
7
- data.tar.gz: 9c8d918b1790baf72aa4da31df12f87d6f90b97ed806d181dc32051d6f36f7a555d59bfc1e0def1fa3299f87d8494ae2d855a7a7871ddbfc485c43e7afb8eddc
6
+ metadata.gz: f10ac14eb9a75e8fd4c587f0419503982e59bcb5344c3a5bc771110bead40b163cd6d1051dc5fbe17cb1ccfd4e8021206f74e0bc057a1b1504a75489c8ad5b22
7
+ data.tar.gz: 6fdc37b92694ef969c8dce58fd1a89fa9a6e1e8c3b033ceb48532a5c452a8f28d484e9f6869ac55c4c9f18b3ecc5417090dd1c90bc41152a1034a1c091bd80c8
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,24 @@ 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
+ if Gem::Version.new(Faraday::VERSION) >= Gem::Version.new('2.1')
27
+ # for faraday 2.1 and higher
28
+ @adapter_options = adapter_options || Faraday.default_adapter_options
29
+ else
30
+ # for faraday 1.x and 2.0
31
+ @adapter_options = adapter_options || {}
32
+ end
25
33
  @mock_service_url_base = mock_service_url_base || "http://localhost:#{mock_port}"
26
34
  @live_url_prefix = live_url_prefix
27
35
  @connection_options = connection_options || Faraday::ConnectionOptions.new
@@ -113,44 +121,16 @@ module Adyen
113
121
  # get URL for requested endpoint
114
122
  url = service_url(service, action.is_a?(String) ? action : action.fetch(:url), version)
115
123
 
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
124
+ auth_type = auth_type(service, request_data)
134
125
 
135
126
  # initialize Faraday connection object
136
127
  conn = Faraday.new(url, @connection_options) do |faraday|
137
- faraday.adapter @adapter
128
+ faraday.adapter @adapter, **@adapter_options
138
129
  faraday.headers['Content-Type'] = 'application/json'
139
130
  faraday.headers['User-Agent'] = "#{Adyen::NAME}/#{Adyen::VERSION}"
140
131
 
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
132
+ # set header based on auth_type and service
133
+ auth_header(auth_type, faraday)
154
134
 
155
135
  # add optional headers if specified in request
156
136
  # will overwrite default headers if overlapping
@@ -298,6 +278,49 @@ module Adyen
298
278
  def terminal_cloud_api
299
279
  @terminal_cloud_api ||= Adyen::TerminalCloudAPI.new(self)
300
280
  end
281
+
282
+ private
283
+
284
+ def auth_header(auth_type, faraday)
285
+ case auth_type
286
+ when "basic"
287
+ if Gem::Version.new(Faraday::VERSION) >= Gem::Version.new('2.0')
288
+ # for faraday 2.0 and higher
289
+ faraday.request :authorization, :basic, @ws_user, @ws_password
290
+ else
291
+ # for faraday 1.x
292
+ faraday.basic_auth(@ws_user, @ws_password)
293
+ end
294
+ when "api-key"
295
+ faraday.headers["x-api-key"] = @api_key
296
+ when "oauth"
297
+ faraday.headers["Authorization"] = "Bearer #{@oauth_token}"
298
+ end
299
+ end
300
+
301
+ def auth_type(service, request_data)
302
+ # make sure valid authentication has been provided
303
+ validate_auth_type(service, request_data)
304
+ # Will prioritize authentication methods in this order:
305
+ # api-key, oauth, basic
306
+ return "api-key" unless @api_key.nil?
307
+ return "oauth" unless @oauth_token.nil?
308
+ "basic"
309
+ end
310
+
311
+ def validate_auth_type(service, request_data)
312
+ # ensure authentication has been provided
313
+ if @api_key.nil? && @oauth_token.nil? && (@ws_password.nil? || @ws_user.nil?)
314
+ raise Adyen::AuthenticationError.new(
315
+ 'No authentication found - please set api_key, oauth_token, or ws_user and ws_password',
316
+ request_data
317
+ )
318
+ end
319
+ if service == "PaymentSetupAndVerification" && @api_key.nil? && @oauth_token.nil? && @ws_password.nil? && @ws_user.nil?
320
+ raise Adyen::AuthenticationError.new('Checkout service requires API-key or oauth_token', request_data),
321
+ 'Checkout service requires API-key or oauth_token'
322
+ end
323
+ end
301
324
  end
302
325
  end
303
326
  # 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.1'.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.1
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-10-09 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