gocardless_pro 2.41.0 → 2.41.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/lib/gocardless_pro/api_service.rb +4 -5
  3. data/lib/gocardless_pro/client.rb +3 -3
  4. data/lib/gocardless_pro/error/invalid_state_error.rb +1 -0
  5. data/lib/gocardless_pro/error.rb +1 -0
  6. data/lib/gocardless_pro/middlewares/raise_gocardless_errors.rb +7 -9
  7. data/lib/gocardless_pro/request.rb +5 -7
  8. data/lib/gocardless_pro/resources/bank_authorisation.rb +0 -2
  9. data/lib/gocardless_pro/resources/bank_details_lookup.rb +0 -2
  10. data/lib/gocardless_pro/resources/billing_request.rb +0 -2
  11. data/lib/gocardless_pro/resources/billing_request_flow.rb +0 -2
  12. data/lib/gocardless_pro/resources/billing_request_template.rb +0 -2
  13. data/lib/gocardless_pro/resources/block.rb +0 -2
  14. data/lib/gocardless_pro/resources/creditor.rb +0 -2
  15. data/lib/gocardless_pro/resources/creditor_bank_account.rb +0 -2
  16. data/lib/gocardless_pro/resources/currency_exchange_rate.rb +0 -2
  17. data/lib/gocardless_pro/resources/customer.rb +0 -2
  18. data/lib/gocardless_pro/resources/customer_bank_account.rb +0 -2
  19. data/lib/gocardless_pro/resources/customer_notification.rb +0 -2
  20. data/lib/gocardless_pro/resources/event.rb +0 -2
  21. data/lib/gocardless_pro/resources/instalment_schedule.rb +0 -2
  22. data/lib/gocardless_pro/resources/institution.rb +0 -2
  23. data/lib/gocardless_pro/resources/mandate.rb +0 -2
  24. data/lib/gocardless_pro/resources/mandate_import.rb +0 -2
  25. data/lib/gocardless_pro/resources/mandate_import_entry.rb +0 -2
  26. data/lib/gocardless_pro/resources/mandate_pdf.rb +0 -2
  27. data/lib/gocardless_pro/resources/payer_authorisation.rb +0 -2
  28. data/lib/gocardless_pro/resources/payment.rb +0 -2
  29. data/lib/gocardless_pro/resources/payout.rb +0 -2
  30. data/lib/gocardless_pro/resources/payout_item.rb +0 -2
  31. data/lib/gocardless_pro/resources/redirect_flow.rb +0 -2
  32. data/lib/gocardless_pro/resources/refund.rb +0 -2
  33. data/lib/gocardless_pro/resources/scenario_simulator.rb +0 -2
  34. data/lib/gocardless_pro/resources/scheme_identifier.rb +0 -2
  35. data/lib/gocardless_pro/resources/subscription.rb +0 -2
  36. data/lib/gocardless_pro/resources/tax_rate.rb +0 -2
  37. data/lib/gocardless_pro/resources/verification_detail.rb +0 -2
  38. data/lib/gocardless_pro/resources/webhook.rb +0 -2
  39. data/lib/gocardless_pro/services/bank_authorisations_service.rb +3 -1
  40. data/lib/gocardless_pro/services/billing_request_flows_service.rb +3 -1
  41. data/lib/gocardless_pro/services/billing_request_templates_service.rb +6 -2
  42. data/lib/gocardless_pro/services/billing_requests_service.rb +27 -9
  43. data/lib/gocardless_pro/services/blocks_service.rb +9 -3
  44. data/lib/gocardless_pro/services/creditor_bank_accounts_service.rb +6 -2
  45. data/lib/gocardless_pro/services/creditors_service.rb +9 -3
  46. data/lib/gocardless_pro/services/customer_bank_accounts_service.rb +9 -3
  47. data/lib/gocardless_pro/services/customer_notifications_service.rb +3 -1
  48. data/lib/gocardless_pro/services/customers_service.rb +9 -3
  49. data/lib/gocardless_pro/services/events_service.rb +3 -1
  50. data/lib/gocardless_pro/services/instalment_schedules_service.rb +9 -3
  51. data/lib/gocardless_pro/services/mandate_imports_service.rb +9 -3
  52. data/lib/gocardless_pro/services/mandates_service.rb +12 -4
  53. data/lib/gocardless_pro/services/payer_authorisations_service.rb +12 -4
  54. data/lib/gocardless_pro/services/payments_service.rb +12 -4
  55. data/lib/gocardless_pro/services/payouts_service.rb +6 -2
  56. data/lib/gocardless_pro/services/redirect_flows_service.rb +6 -2
  57. data/lib/gocardless_pro/services/refunds_service.rb +6 -2
  58. data/lib/gocardless_pro/services/scenario_simulators_service.rb +3 -1
  59. data/lib/gocardless_pro/services/scheme_identifiers_service.rb +3 -1
  60. data/lib/gocardless_pro/services/subscriptions_service.rb +15 -5
  61. data/lib/gocardless_pro/services/tax_rates_service.rb +3 -1
  62. data/lib/gocardless_pro/services/webhooks_service.rb +6 -2
  63. data/lib/gocardless_pro/version.rb +1 -2
  64. data/lib/gocardless_pro/webhook.rb +5 -4
  65. data/lib/gocardless_pro.rb +2 -4
  66. metadata +5 -195
  67. data/.github/workflows/tests.yml +0 -40
  68. data/.gitignore +0 -1
  69. data/.rspec +0 -2
  70. data/.rubocop.yml +0 -5
  71. data/.travis.yml +0 -10
  72. data/Gemfile +0 -10
  73. data/demo.rb +0 -9
  74. data/gocardless_pro.gemspec +0 -39
  75. data/spec/api_response_spec.rb +0 -28
  76. data/spec/api_service_spec.rb +0 -188
  77. data/spec/client_spec.rb +0 -19
  78. data/spec/error_spec.rb +0 -53
  79. data/spec/middlewares/raise_gocardless_errors_spec.rb +0 -127
  80. data/spec/resources/bank_authorisation_spec.rb +0 -259
  81. data/spec/resources/bank_details_lookup_spec.rb +0 -121
  82. data/spec/resources/billing_request_flow_spec.rb +0 -257
  83. data/spec/resources/billing_request_spec.rb +0 -962
  84. data/spec/resources/billing_request_template_spec.rb +0 -515
  85. data/spec/resources/block_spec.rb +0 -577
  86. data/spec/resources/creditor_bank_account_spec.rb +0 -472
  87. data/spec/resources/creditor_spec.rb +0 -659
  88. data/spec/resources/currency_exchange_rate_spec.rb +0 -103
  89. data/spec/resources/customer_bank_account_spec.rb +0 -509
  90. data/spec/resources/customer_notification_spec.rb +0 -75
  91. data/spec/resources/customer_spec.rb +0 -616
  92. data/spec/resources/event_spec.rb +0 -210
  93. data/spec/resources/instalment_schedule_spec.rb +0 -636
  94. data/spec/resources/institution_spec.rb +0 -113
  95. data/spec/resources/mandate_import_entry_spec.rb +0 -206
  96. data/spec/resources/mandate_import_spec.rb +0 -344
  97. data/spec/resources/mandate_pdf_spec.rb +0 -117
  98. data/spec/resources/mandate_spec.rb +0 -600
  99. data/spec/resources/payer_authorisation_spec.rb +0 -422
  100. data/spec/resources/payment_spec.rb +0 -617
  101. data/spec/resources/payout_item_spec.rb +0 -101
  102. data/spec/resources/payout_spec.rb +0 -284
  103. data/spec/resources/redirect_flow_spec.rb +0 -347
  104. data/spec/resources/refund_spec.rb +0 -409
  105. data/spec/resources/scenario_simulator_spec.rb +0 -65
  106. data/spec/resources/scheme_identifier_spec.rb +0 -484
  107. data/spec/resources/subscription_spec.rb +0 -828
  108. data/spec/resources/tax_rate_spec.rb +0 -198
  109. data/spec/resources/verification_detail_spec.rb +0 -145
  110. data/spec/resources/webhook_spec.rb +0 -325
  111. data/spec/response_spec.rb +0 -34
  112. data/spec/services/bank_authorisations_service_spec.rb +0 -353
  113. data/spec/services/bank_details_lookups_service_spec.rb +0 -144
  114. data/spec/services/billing_request_flows_service_spec.rb +0 -291
  115. data/spec/services/billing_request_templates_service_spec.rb +0 -806
  116. data/spec/services/billing_requests_service_spec.rb +0 -1288
  117. data/spec/services/blocks_service_spec.rb +0 -840
  118. data/spec/services/creditor_bank_accounts_service_spec.rb +0 -725
  119. data/spec/services/creditors_service_spec.rb +0 -977
  120. data/spec/services/currency_exchange_rates_service_spec.rb +0 -223
  121. data/spec/services/customer_bank_accounts_service_spec.rb +0 -787
  122. data/spec/services/customer_notifications_service_spec.rb +0 -86
  123. data/spec/services/customers_service_spec.rb +0 -922
  124. data/spec/services/events_service_spec.rb +0 -401
  125. data/spec/services/instalment_schedules_service_spec.rb +0 -945
  126. data/spec/services/institutions_service_spec.rb +0 -241
  127. data/spec/services/mandate_import_entries_service_spec.rb +0 -345
  128. data/spec/services/mandate_imports_service_spec.rb +0 -460
  129. data/spec/services/mandate_pdfs_service_spec.rb +0 -140
  130. data/spec/services/mandates_service_spec.rb +0 -893
  131. data/spec/services/payer_authorisations_service_spec.rb +0 -563
  132. data/spec/services/payments_service_spec.rb +0 -914
  133. data/spec/services/payout_items_service_spec.rb +0 -221
  134. data/spec/services/payouts_service_spec.rb +0 -520
  135. data/spec/services/redirect_flows_service_spec.rb +0 -452
  136. data/spec/services/refunds_service_spec.rb +0 -668
  137. data/spec/services/scenario_simulators_service_spec.rb +0 -76
  138. data/spec/services/scheme_identifiers_service_spec.rb +0 -754
  139. data/spec/services/subscriptions_service_spec.rb +0 -1164
  140. data/spec/services/tax_rates_service_spec.rb +0 -381
  141. data/spec/services/verification_details_service_spec.rb +0 -168
  142. data/spec/services/webhooks_service_spec.rb +0 -547
  143. data/spec/spec_helper.rb +0 -90
  144. data/spec/webhook_spec.rb +0 -122
@@ -1,914 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe GoCardlessPro::Services::PaymentsService do
4
- let(:client) do
5
- GoCardlessPro::Client.new(
6
- access_token: 'SECRET_TOKEN'
7
- )
8
- end
9
-
10
- let(:response_headers) { { 'Content-Type' => 'application/json' } }
11
-
12
- describe '#create' do
13
- subject(:post_create_response) { client.payments.create(params: new_resource) }
14
- context 'with a valid request' do
15
- let(:new_resource) do
16
- {
17
-
18
- 'amount' => 'amount-input',
19
- 'amount_refunded' => 'amount_refunded-input',
20
- 'charge_date' => 'charge_date-input',
21
- 'created_at' => 'created_at-input',
22
- 'currency' => 'currency-input',
23
- 'description' => 'description-input',
24
- 'fx' => 'fx-input',
25
- 'id' => 'id-input',
26
- 'links' => 'links-input',
27
- 'metadata' => 'metadata-input',
28
- 'reference' => 'reference-input',
29
- 'retry_if_possible' => 'retry_if_possible-input',
30
- 'status' => 'status-input',
31
- }
32
- end
33
-
34
- before do
35
- stub_request(:post, %r{.*api.gocardless.com/payments}).
36
- with(
37
- body: {
38
- 'payments' => {
39
-
40
- 'amount' => 'amount-input',
41
- 'amount_refunded' => 'amount_refunded-input',
42
- 'charge_date' => 'charge_date-input',
43
- 'created_at' => 'created_at-input',
44
- 'currency' => 'currency-input',
45
- 'description' => 'description-input',
46
- 'fx' => 'fx-input',
47
- 'id' => 'id-input',
48
- 'links' => 'links-input',
49
- 'metadata' => 'metadata-input',
50
- 'reference' => 'reference-input',
51
- 'retry_if_possible' => 'retry_if_possible-input',
52
- 'status' => 'status-input',
53
- },
54
- }
55
- ).
56
- to_return(
57
- body: {
58
- 'payments' =>
59
-
60
- {
61
-
62
- 'amount' => 'amount-input',
63
- 'amount_refunded' => 'amount_refunded-input',
64
- 'charge_date' => 'charge_date-input',
65
- 'created_at' => 'created_at-input',
66
- 'currency' => 'currency-input',
67
- 'description' => 'description-input',
68
- 'fx' => 'fx-input',
69
- 'id' => 'id-input',
70
- 'links' => 'links-input',
71
- 'metadata' => 'metadata-input',
72
- 'reference' => 'reference-input',
73
- 'retry_if_possible' => 'retry_if_possible-input',
74
- 'status' => 'status-input',
75
- },
76
-
77
- }.to_json,
78
- headers: response_headers
79
- )
80
- end
81
-
82
- it 'creates and returns the resource' do
83
- expect(post_create_response).to be_a(GoCardlessPro::Resources::Payment)
84
- end
85
-
86
- describe 'retry behaviour' do
87
- before { allow_any_instance_of(GoCardlessPro::Request).to receive(:sleep) }
88
-
89
- it 'retries timeouts' do
90
- stub = stub_request(:post, %r{.*api.gocardless.com/payments}).
91
- to_timeout.then.to_return(status: 200, headers: response_headers)
92
-
93
- post_create_response
94
- expect(stub).to have_been_requested.twice
95
- end
96
-
97
- it 'retries 5XX errors' do
98
- stub = stub_request(:post, %r{.*api.gocardless.com/payments}).
99
- to_return(status: 502,
100
- headers: { 'Content-Type' => 'text/html' },
101
- body: '<html><body>Response from Cloudflare</body></html>').
102
- then.to_return(status: 200, headers: response_headers)
103
-
104
- post_create_response
105
- expect(stub).to have_been_requested.twice
106
- end
107
- end
108
- end
109
-
110
- context 'with a request that returns a validation error' do
111
- let(:new_resource) { {} }
112
-
113
- before do
114
- stub_request(:post, %r{.*api.gocardless.com/payments}).to_return(
115
- body: {
116
- error: {
117
- type: 'validation_failed',
118
- code: 422,
119
- errors: [
120
- { message: 'test error message', field: 'test_field' },
121
- ],
122
- },
123
- }.to_json,
124
- headers: response_headers,
125
- status: 422
126
- )
127
- end
128
-
129
- it 'throws the correct error' do
130
- expect { post_create_response }.to raise_error(GoCardlessPro::ValidationError)
131
- end
132
- end
133
-
134
- context 'with a request that returns an idempotent creation conflict error' do
135
- let(:id) { 'ID123' }
136
-
137
- let(:new_resource) do
138
- {
139
-
140
- 'amount' => 'amount-input',
141
- 'amount_refunded' => 'amount_refunded-input',
142
- 'charge_date' => 'charge_date-input',
143
- 'created_at' => 'created_at-input',
144
- 'currency' => 'currency-input',
145
- 'description' => 'description-input',
146
- 'fx' => 'fx-input',
147
- 'id' => 'id-input',
148
- 'links' => 'links-input',
149
- 'metadata' => 'metadata-input',
150
- 'reference' => 'reference-input',
151
- 'retry_if_possible' => 'retry_if_possible-input',
152
- 'status' => 'status-input',
153
- }
154
- end
155
-
156
- let!(:post_stub) do
157
- stub_request(:post, %r{.*api.gocardless.com/payments}).to_return(
158
- body: {
159
- error: {
160
- type: 'invalid_state',
161
- code: 409,
162
- errors: [
163
- {
164
- message: 'A resource has already been created with this idempotency key',
165
- reason: 'idempotent_creation_conflict',
166
- links: {
167
- conflicting_resource_id: id,
168
- },
169
- },
170
- ],
171
- },
172
- }.to_json,
173
- headers: response_headers,
174
- status: 409
175
- )
176
- end
177
-
178
- let!(:get_stub) do
179
- stub_url = "/payments/#{id}"
180
- stub_request(:get, /.*api.gocardless.com#{stub_url}/).
181
- to_return(
182
- body: {
183
- 'payments' => {
184
-
185
- 'amount' => 'amount-input',
186
- 'amount_refunded' => 'amount_refunded-input',
187
- 'charge_date' => 'charge_date-input',
188
- 'created_at' => 'created_at-input',
189
- 'currency' => 'currency-input',
190
- 'description' => 'description-input',
191
- 'fx' => 'fx-input',
192
- 'id' => 'id-input',
193
- 'links' => 'links-input',
194
- 'metadata' => 'metadata-input',
195
- 'reference' => 'reference-input',
196
- 'retry_if_possible' => 'retry_if_possible-input',
197
- 'status' => 'status-input',
198
- },
199
- }.to_json,
200
- headers: response_headers
201
- )
202
- end
203
-
204
- context 'with default behaviour' do
205
- it 'fetches the already-created resource' do
206
- post_create_response
207
- expect(post_stub).to have_been_requested
208
- expect(get_stub).to have_been_requested
209
- end
210
- end
211
-
212
- context 'with on_idempotency_conflict: :raise' do
213
- let(:client) do
214
- GoCardlessPro::Client.new(
215
- access_token: 'SECRET_TOKEN',
216
- on_idempotency_conflict: :raise
217
- )
218
- end
219
-
220
- it 'raises an IdempotencyConflict error' do
221
- expect { post_create_response }.
222
- to raise_error(GoCardlessPro::IdempotencyConflict)
223
- end
224
- end
225
- end
226
- end
227
-
228
- describe '#list' do
229
- describe 'with no filters' do
230
- subject(:get_list_response) { client.payments.list }
231
-
232
- let(:body) do
233
- {
234
- 'payments' => [{
235
-
236
- 'amount' => 'amount-input',
237
- 'amount_refunded' => 'amount_refunded-input',
238
- 'charge_date' => 'charge_date-input',
239
- 'created_at' => 'created_at-input',
240
- 'currency' => 'currency-input',
241
- 'description' => 'description-input',
242
- 'fx' => 'fx-input',
243
- 'id' => 'id-input',
244
- 'links' => 'links-input',
245
- 'metadata' => 'metadata-input',
246
- 'reference' => 'reference-input',
247
- 'retry_if_possible' => 'retry_if_possible-input',
248
- 'status' => 'status-input',
249
- }],
250
- meta: {
251
- cursors: {
252
- before: nil,
253
- after: 'ABC123',
254
- },
255
- },
256
- }.to_json
257
- end
258
-
259
- before do
260
- stub_request(:get, %r{.*api.gocardless.com/payments}).to_return(
261
- body: body,
262
- headers: response_headers
263
- )
264
- end
265
-
266
- it 'wraps each item in the resource class' do
267
- expect(get_list_response.records.map(&:class).uniq.first).to eq(GoCardlessPro::Resources::Payment)
268
-
269
- expect(get_list_response.records.first.amount).to eq('amount-input')
270
-
271
- expect(get_list_response.records.first.amount_refunded).to eq('amount_refunded-input')
272
-
273
- expect(get_list_response.records.first.charge_date).to eq('charge_date-input')
274
-
275
- expect(get_list_response.records.first.created_at).to eq('created_at-input')
276
-
277
- expect(get_list_response.records.first.currency).to eq('currency-input')
278
-
279
- expect(get_list_response.records.first.description).to eq('description-input')
280
-
281
- expect(get_list_response.records.first.fx).to eq('fx-input')
282
-
283
- expect(get_list_response.records.first.id).to eq('id-input')
284
-
285
- expect(get_list_response.records.first.metadata).to eq('metadata-input')
286
-
287
- expect(get_list_response.records.first.reference).to eq('reference-input')
288
-
289
- expect(get_list_response.records.first.retry_if_possible).to eq('retry_if_possible-input')
290
-
291
- expect(get_list_response.records.first.status).to eq('status-input')
292
- end
293
-
294
- it 'exposes the cursors for before and after' do
295
- expect(get_list_response.before).to eq(nil)
296
- expect(get_list_response.after).to eq('ABC123')
297
- end
298
-
299
- specify { expect(get_list_response.api_response.headers).to eql('content-type' => 'application/json') }
300
-
301
- describe 'retry behaviour' do
302
- before { allow_any_instance_of(GoCardlessPro::Request).to receive(:sleep) }
303
-
304
- it 'retries timeouts' do
305
- stub = stub_request(:get, %r{.*api.gocardless.com/payments}).
306
- to_timeout.then.to_return(status: 200, headers: response_headers, body: body)
307
-
308
- get_list_response
309
- expect(stub).to have_been_requested.twice
310
- end
311
-
312
- it 'retries 5XX errors' do
313
- stub = stub_request(:get, %r{.*api.gocardless.com/payments}).
314
- to_return(status: 502,
315
- headers: { 'Content-Type' => 'text/html' },
316
- body: '<html><body>Response from Cloudflare</body></html>').
317
- then.to_return(status: 200, headers: response_headers, body: body)
318
-
319
- get_list_response
320
- expect(stub).to have_been_requested.twice
321
- end
322
- end
323
- end
324
- end
325
-
326
- describe '#all' do
327
- let!(:first_response_stub) do
328
- stub_request(:get, %r{.*api.gocardless.com/payments$}).to_return(
329
- body: {
330
- 'payments' => [{
331
-
332
- 'amount' => 'amount-input',
333
- 'amount_refunded' => 'amount_refunded-input',
334
- 'charge_date' => 'charge_date-input',
335
- 'created_at' => 'created_at-input',
336
- 'currency' => 'currency-input',
337
- 'description' => 'description-input',
338
- 'fx' => 'fx-input',
339
- 'id' => 'id-input',
340
- 'links' => 'links-input',
341
- 'metadata' => 'metadata-input',
342
- 'reference' => 'reference-input',
343
- 'retry_if_possible' => 'retry_if_possible-input',
344
- 'status' => 'status-input',
345
- }],
346
- meta: {
347
- cursors: { after: 'AB345' },
348
- limit: 1,
349
- },
350
- }.to_json,
351
- headers: response_headers
352
- )
353
- end
354
-
355
- let!(:second_response_stub) do
356
- stub_request(:get, %r{.*api.gocardless.com/payments\?after=AB345}).to_return(
357
- body: {
358
- 'payments' => [{
359
-
360
- 'amount' => 'amount-input',
361
- 'amount_refunded' => 'amount_refunded-input',
362
- 'charge_date' => 'charge_date-input',
363
- 'created_at' => 'created_at-input',
364
- 'currency' => 'currency-input',
365
- 'description' => 'description-input',
366
- 'fx' => 'fx-input',
367
- 'id' => 'id-input',
368
- 'links' => 'links-input',
369
- 'metadata' => 'metadata-input',
370
- 'reference' => 'reference-input',
371
- 'retry_if_possible' => 'retry_if_possible-input',
372
- 'status' => 'status-input',
373
- }],
374
- meta: {
375
- limit: 2,
376
- cursors: {},
377
- },
378
- }.to_json,
379
- headers: response_headers
380
- )
381
- end
382
-
383
- it 'automatically makes the extra requests' do
384
- expect(client.payments.all.to_a.length).to eq(2)
385
- expect(first_response_stub).to have_been_requested
386
- expect(second_response_stub).to have_been_requested
387
- end
388
-
389
- describe 'retry behaviour' do
390
- before { allow_any_instance_of(GoCardlessPro::Request).to receive(:sleep) }
391
-
392
- it 'retries timeouts' do
393
- first_response_stub = stub_request(:get, %r{.*api.gocardless.com/payments$}).to_return(
394
- body: {
395
- 'payments' => [{
396
-
397
- 'amount' => 'amount-input',
398
- 'amount_refunded' => 'amount_refunded-input',
399
- 'charge_date' => 'charge_date-input',
400
- 'created_at' => 'created_at-input',
401
- 'currency' => 'currency-input',
402
- 'description' => 'description-input',
403
- 'fx' => 'fx-input',
404
- 'id' => 'id-input',
405
- 'links' => 'links-input',
406
- 'metadata' => 'metadata-input',
407
- 'reference' => 'reference-input',
408
- 'retry_if_possible' => 'retry_if_possible-input',
409
- 'status' => 'status-input',
410
- }],
411
- meta: {
412
- cursors: { after: 'AB345' },
413
- limit: 1,
414
- },
415
- }.to_json,
416
- headers: response_headers
417
- )
418
-
419
- second_response_stub = stub_request(:get, %r{.*api.gocardless.com/payments\?after=AB345}).
420
- to_timeout.then.
421
- to_return(
422
- body: {
423
- 'payments' => [{
424
-
425
- 'amount' => 'amount-input',
426
- 'amount_refunded' => 'amount_refunded-input',
427
- 'charge_date' => 'charge_date-input',
428
- 'created_at' => 'created_at-input',
429
- 'currency' => 'currency-input',
430
- 'description' => 'description-input',
431
- 'fx' => 'fx-input',
432
- 'id' => 'id-input',
433
- 'links' => 'links-input',
434
- 'metadata' => 'metadata-input',
435
- 'reference' => 'reference-input',
436
- 'retry_if_possible' => 'retry_if_possible-input',
437
- 'status' => 'status-input',
438
- }],
439
- meta: {
440
- limit: 2,
441
- cursors: {},
442
- },
443
- }.to_json,
444
- headers: response_headers
445
- )
446
-
447
- client.payments.all.to_a
448
-
449
- expect(first_response_stub).to have_been_requested
450
- expect(second_response_stub).to have_been_requested.twice
451
- end
452
-
453
- it 'retries 5XX errors' do
454
- first_response_stub = stub_request(:get, %r{.*api.gocardless.com/payments$}).to_return(
455
- body: {
456
- 'payments' => [{
457
-
458
- 'amount' => 'amount-input',
459
- 'amount_refunded' => 'amount_refunded-input',
460
- 'charge_date' => 'charge_date-input',
461
- 'created_at' => 'created_at-input',
462
- 'currency' => 'currency-input',
463
- 'description' => 'description-input',
464
- 'fx' => 'fx-input',
465
- 'id' => 'id-input',
466
- 'links' => 'links-input',
467
- 'metadata' => 'metadata-input',
468
- 'reference' => 'reference-input',
469
- 'retry_if_possible' => 'retry_if_possible-input',
470
- 'status' => 'status-input',
471
- }],
472
- meta: {
473
- cursors: { after: 'AB345' },
474
- limit: 1,
475
- },
476
- }.to_json,
477
- headers: response_headers
478
- )
479
-
480
- second_response_stub = stub_request(:get, %r{.*api.gocardless.com/payments\?after=AB345}).
481
- to_return(
482
- status: 502,
483
- body: '<html><body>Response from Cloudflare</body></html>',
484
- headers: { 'Content-Type' => 'text/html' }
485
- ).then.to_return(
486
- body: {
487
- 'payments' => [{
488
-
489
- 'amount' => 'amount-input',
490
- 'amount_refunded' => 'amount_refunded-input',
491
- 'charge_date' => 'charge_date-input',
492
- 'created_at' => 'created_at-input',
493
- 'currency' => 'currency-input',
494
- 'description' => 'description-input',
495
- 'fx' => 'fx-input',
496
- 'id' => 'id-input',
497
- 'links' => 'links-input',
498
- 'metadata' => 'metadata-input',
499
- 'reference' => 'reference-input',
500
- 'retry_if_possible' => 'retry_if_possible-input',
501
- 'status' => 'status-input',
502
- }],
503
- meta: {
504
- limit: 2,
505
- cursors: {},
506
- },
507
- }.to_json,
508
- headers: response_headers
509
- )
510
-
511
- client.payments.all.to_a
512
-
513
- expect(first_response_stub).to have_been_requested
514
- expect(second_response_stub).to have_been_requested.twice
515
- end
516
- end
517
- end
518
-
519
- describe '#get' do
520
- let(:id) { 'ID123' }
521
-
522
- subject(:get_response) { client.payments.get(id) }
523
-
524
- context 'passing in a custom header' do
525
- let!(:stub) do
526
- stub_url = '/payments/:identity'.gsub(':identity', id)
527
- stub_request(:get, /.*api.gocardless.com#{stub_url}/).
528
- with(headers: { 'Foo' => 'Bar' }).
529
- to_return(
530
- body: {
531
- 'payments' => {
532
-
533
- 'amount' => 'amount-input',
534
- 'amount_refunded' => 'amount_refunded-input',
535
- 'charge_date' => 'charge_date-input',
536
- 'created_at' => 'created_at-input',
537
- 'currency' => 'currency-input',
538
- 'description' => 'description-input',
539
- 'fx' => 'fx-input',
540
- 'id' => 'id-input',
541
- 'links' => 'links-input',
542
- 'metadata' => 'metadata-input',
543
- 'reference' => 'reference-input',
544
- 'retry_if_possible' => 'retry_if_possible-input',
545
- 'status' => 'status-input',
546
- },
547
- }.to_json,
548
- headers: response_headers
549
- )
550
- end
551
-
552
- subject(:get_response) do
553
- client.payments.get(id, headers: {
554
- 'Foo' => 'Bar',
555
- })
556
- end
557
-
558
- it 'includes the header' do
559
- get_response
560
- expect(stub).to have_been_requested
561
- end
562
- end
563
-
564
- context 'when there is a payment to return' do
565
- before do
566
- stub_url = '/payments/:identity'.gsub(':identity', id)
567
- stub_request(:get, /.*api.gocardless.com#{stub_url}/).to_return(
568
- body: {
569
- 'payments' => {
570
-
571
- 'amount' => 'amount-input',
572
- 'amount_refunded' => 'amount_refunded-input',
573
- 'charge_date' => 'charge_date-input',
574
- 'created_at' => 'created_at-input',
575
- 'currency' => 'currency-input',
576
- 'description' => 'description-input',
577
- 'fx' => 'fx-input',
578
- 'id' => 'id-input',
579
- 'links' => 'links-input',
580
- 'metadata' => 'metadata-input',
581
- 'reference' => 'reference-input',
582
- 'retry_if_possible' => 'retry_if_possible-input',
583
- 'status' => 'status-input',
584
- },
585
- }.to_json,
586
- headers: response_headers
587
- )
588
- end
589
-
590
- it 'wraps the response in a resource' do
591
- expect(get_response).to be_a(GoCardlessPro::Resources::Payment)
592
- end
593
- end
594
-
595
- context 'when nothing is returned' do
596
- before do
597
- stub_url = '/payments/:identity'.gsub(':identity', id)
598
- stub_request(:get, /.*api.gocardless.com#{stub_url}/).to_return(
599
- body: '',
600
- headers: response_headers
601
- )
602
- end
603
-
604
- it 'returns nil' do
605
- expect(get_response).to be_nil
606
- end
607
- end
608
-
609
- context "when an ID is specified which can't be included in a valid URI" do
610
- let(:id) { '`' }
611
-
612
- it "doesn't raise an error" do
613
- expect { get_response }.to_not raise_error(/bad URI/)
614
- end
615
- end
616
-
617
- describe 'retry behaviour' do
618
- before { allow_any_instance_of(GoCardlessPro::Request).to receive(:sleep) }
619
-
620
- it 'retries timeouts' do
621
- stub_url = '/payments/:identity'.gsub(':identity', id)
622
-
623
- stub = stub_request(:get, /.*api.gocardless.com#{stub_url}/).
624
- to_timeout.then.to_return(status: 200, headers: response_headers)
625
-
626
- get_response
627
- expect(stub).to have_been_requested.twice
628
- end
629
-
630
- it 'retries 5XX errors, other than 500s' do
631
- stub_url = '/payments/:identity'.gsub(':identity', id)
632
-
633
- stub = stub_request(:get, /.*api.gocardless.com#{stub_url}/).
634
- to_return(status: 502,
635
- headers: { 'Content-Type' => 'text/html' },
636
- body: '<html><body>Response from Cloudflare</body></html>').
637
- then.to_return(status: 200, headers: response_headers)
638
-
639
- get_response
640
- expect(stub).to have_been_requested.twice
641
- end
642
-
643
- it 'retries 500 errors returned by the API' do
644
- stub_url = '/payments/:identity'.gsub(':identity', id)
645
-
646
- gocardless_error = {
647
- 'error' => {
648
- 'message' => 'Internal server error',
649
- 'documentation_url' => 'https://developer.gocardless.com/#gocardless',
650
- 'errors' => [{
651
- 'message' => 'Internal server error',
652
- 'reason' => 'internal_server_error',
653
- }],
654
- 'type' => 'gocardless',
655
- 'code' => 500,
656
- 'request_id' => 'dummy_request_id',
657
- 'id' => 'dummy_exception_id',
658
- },
659
- }
660
-
661
- stub = stub_request(:get, /.*api.gocardless.com#{stub_url}/).
662
- to_return(status: 500,
663
- headers: response_headers,
664
- body: gocardless_error.to_json).
665
- then.to_return(status: 200, headers: response_headers)
666
-
667
- get_response
668
- expect(stub).to have_been_requested.twice
669
- end
670
- end
671
- end
672
-
673
- describe '#update' do
674
- subject(:put_update_response) { client.payments.update(id, params: update_params) }
675
- let(:id) { 'ABC123' }
676
-
677
- context 'with a valid request' do
678
- let(:update_params) { { 'hello' => 'world' } }
679
-
680
- let!(:stub) do
681
- stub_url = '/payments/:identity'.gsub(':identity', id)
682
- stub_request(:put, /.*api.gocardless.com#{stub_url}/).to_return(
683
- body: {
684
- 'payments' => {
685
-
686
- 'amount' => 'amount-input',
687
- 'amount_refunded' => 'amount_refunded-input',
688
- 'charge_date' => 'charge_date-input',
689
- 'created_at' => 'created_at-input',
690
- 'currency' => 'currency-input',
691
- 'description' => 'description-input',
692
- 'fx' => 'fx-input',
693
- 'id' => 'id-input',
694
- 'links' => 'links-input',
695
- 'metadata' => 'metadata-input',
696
- 'reference' => 'reference-input',
697
- 'retry_if_possible' => 'retry_if_possible-input',
698
- 'status' => 'status-input',
699
- },
700
- }.to_json,
701
- headers: response_headers
702
- )
703
- end
704
-
705
- it 'updates and returns the resource' do
706
- expect(put_update_response).to be_a(GoCardlessPro::Resources::Payment)
707
- expect(stub).to have_been_requested
708
- end
709
-
710
- describe 'retry behaviour' do
711
- before { allow_any_instance_of(GoCardlessPro::Request).to receive(:sleep) }
712
-
713
- it 'retries timeouts' do
714
- stub_url = '/payments/:identity'.gsub(':identity', id)
715
- stub = stub_request(:put, /.*api.gocardless.com#{stub_url}/).
716
- to_timeout.then.to_return(status: 200, headers: response_headers)
717
-
718
- put_update_response
719
- expect(stub).to have_been_requested.twice
720
- end
721
-
722
- it 'retries 5XX errors' do
723
- stub_url = '/payments/:identity'.gsub(':identity', id)
724
- stub = stub_request(:put, /.*api.gocardless.com#{stub_url}/).
725
- to_return(status: 502,
726
- headers: { 'Content-Type' => 'text/html' },
727
- body: '<html><body>Response from Cloudflare</body></html>').
728
- then.to_return(status: 200, headers: response_headers)
729
-
730
- put_update_response
731
- expect(stub).to have_been_requested.twice
732
- end
733
- end
734
- end
735
- end
736
-
737
- describe '#cancel' do
738
- subject(:post_response) { client.payments.cancel(resource_id) }
739
-
740
- let(:resource_id) { 'ABC123' }
741
-
742
- let!(:stub) do
743
- # /payments/%v/actions/cancel
744
- stub_url = '/payments/:identity/actions/cancel'.gsub(':identity', resource_id)
745
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).to_return(
746
-
747
- body: {
748
- 'payments' => {
749
-
750
- 'amount' => 'amount-input',
751
- 'amount_refunded' => 'amount_refunded-input',
752
- 'charge_date' => 'charge_date-input',
753
- 'created_at' => 'created_at-input',
754
- 'currency' => 'currency-input',
755
- 'description' => 'description-input',
756
- 'fx' => 'fx-input',
757
- 'id' => 'id-input',
758
- 'links' => 'links-input',
759
- 'metadata' => 'metadata-input',
760
- 'reference' => 'reference-input',
761
- 'retry_if_possible' => 'retry_if_possible-input',
762
- 'status' => 'status-input',
763
- },
764
- }.to_json,
765
-
766
- headers: response_headers
767
- )
768
- end
769
-
770
- it 'wraps the response and calls the right endpoint' do
771
- expect(post_response).to be_a(GoCardlessPro::Resources::Payment)
772
-
773
- expect(stub).to have_been_requested
774
- end
775
-
776
- describe 'retry behaviour' do
777
- it "doesn't retry errors" do
778
- stub_url = '/payments/:identity/actions/cancel'.gsub(':identity', resource_id)
779
- stub = stub_request(:post, /.*api.gocardless.com#{stub_url}/).
780
- to_timeout
781
-
782
- expect { post_response }.to raise_error(Faraday::ConnectionFailed)
783
- expect(stub).to have_been_requested
784
- end
785
- end
786
-
787
- context 'when the request needs a body and custom header' do
788
- let(:body) { { foo: 'bar' } }
789
- let(:headers) { { 'Foo' => 'Bar' } }
790
- subject(:post_response) { client.payments.cancel(resource_id, body, headers) }
791
-
792
- let(:resource_id) { 'ABC123' }
793
-
794
- let!(:stub) do
795
- # /payments/%v/actions/cancel
796
- stub_url = '/payments/:identity/actions/cancel'.gsub(':identity', resource_id)
797
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).
798
- with(
799
- body: { foo: 'bar' },
800
- headers: { 'Foo' => 'Bar' }
801
- ).to_return(
802
- body: {
803
- 'payments' => {
804
-
805
- 'amount' => 'amount-input',
806
- 'amount_refunded' => 'amount_refunded-input',
807
- 'charge_date' => 'charge_date-input',
808
- 'created_at' => 'created_at-input',
809
- 'currency' => 'currency-input',
810
- 'description' => 'description-input',
811
- 'fx' => 'fx-input',
812
- 'id' => 'id-input',
813
- 'links' => 'links-input',
814
- 'metadata' => 'metadata-input',
815
- 'reference' => 'reference-input',
816
- 'retry_if_possible' => 'retry_if_possible-input',
817
- 'status' => 'status-input',
818
- },
819
- }.to_json,
820
- headers: response_headers
821
- )
822
- end
823
- end
824
- end
825
-
826
- describe '#retry' do
827
- subject(:post_response) { client.payments.retry(resource_id) }
828
-
829
- let(:resource_id) { 'ABC123' }
830
-
831
- let!(:stub) do
832
- # /payments/%v/actions/retry
833
- stub_url = '/payments/:identity/actions/retry'.gsub(':identity', resource_id)
834
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).to_return(
835
-
836
- body: {
837
- 'payments' => {
838
-
839
- 'amount' => 'amount-input',
840
- 'amount_refunded' => 'amount_refunded-input',
841
- 'charge_date' => 'charge_date-input',
842
- 'created_at' => 'created_at-input',
843
- 'currency' => 'currency-input',
844
- 'description' => 'description-input',
845
- 'fx' => 'fx-input',
846
- 'id' => 'id-input',
847
- 'links' => 'links-input',
848
- 'metadata' => 'metadata-input',
849
- 'reference' => 'reference-input',
850
- 'retry_if_possible' => 'retry_if_possible-input',
851
- 'status' => 'status-input',
852
- },
853
- }.to_json,
854
-
855
- headers: response_headers
856
- )
857
- end
858
-
859
- it 'wraps the response and calls the right endpoint' do
860
- expect(post_response).to be_a(GoCardlessPro::Resources::Payment)
861
-
862
- expect(stub).to have_been_requested
863
- end
864
-
865
- describe 'retry behaviour' do
866
- it "doesn't retry errors" do
867
- stub_url = '/payments/:identity/actions/retry'.gsub(':identity', resource_id)
868
- stub = stub_request(:post, /.*api.gocardless.com#{stub_url}/).
869
- to_timeout
870
-
871
- expect { post_response }.to raise_error(Faraday::ConnectionFailed)
872
- expect(stub).to have_been_requested
873
- end
874
- end
875
-
876
- context 'when the request needs a body and custom header' do
877
- let(:body) { { foo: 'bar' } }
878
- let(:headers) { { 'Foo' => 'Bar' } }
879
- subject(:post_response) { client.payments.retry(resource_id, body, headers) }
880
-
881
- let(:resource_id) { 'ABC123' }
882
-
883
- let!(:stub) do
884
- # /payments/%v/actions/retry
885
- stub_url = '/payments/:identity/actions/retry'.gsub(':identity', resource_id)
886
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).
887
- with(
888
- body: { foo: 'bar' },
889
- headers: { 'Foo' => 'Bar' }
890
- ).to_return(
891
- body: {
892
- 'payments' => {
893
-
894
- 'amount' => 'amount-input',
895
- 'amount_refunded' => 'amount_refunded-input',
896
- 'charge_date' => 'charge_date-input',
897
- 'created_at' => 'created_at-input',
898
- 'currency' => 'currency-input',
899
- 'description' => 'description-input',
900
- 'fx' => 'fx-input',
901
- 'id' => 'id-input',
902
- 'links' => 'links-input',
903
- 'metadata' => 'metadata-input',
904
- 'reference' => 'reference-input',
905
- 'retry_if_possible' => 'retry_if_possible-input',
906
- 'status' => 'status-input',
907
- },
908
- }.to_json,
909
- headers: response_headers
910
- )
911
- end
912
- end
913
- end
914
- end