gocardless_pro 2.41.0 → 2.41.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.
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/LICENSE.txt +0 -22
  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,1288 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe GoCardlessPro::Services::BillingRequestsService 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 '#list' do
13
- describe 'with no filters' do
14
- subject(:get_list_response) { client.billing_requests.list }
15
-
16
- let(:body) do
17
- {
18
- 'billing_requests' => [{
19
-
20
- 'actions' => 'actions-input',
21
- 'created_at' => 'created_at-input',
22
- 'fallback_enabled' => 'fallback_enabled-input',
23
- 'id' => 'id-input',
24
- 'links' => 'links-input',
25
- 'mandate_request' => 'mandate_request-input',
26
- 'metadata' => 'metadata-input',
27
- 'payment_request' => 'payment_request-input',
28
- 'resources' => 'resources-input',
29
- 'status' => 'status-input',
30
- }],
31
- meta: {
32
- cursors: {
33
- before: nil,
34
- after: 'ABC123',
35
- },
36
- },
37
- }.to_json
38
- end
39
-
40
- before do
41
- stub_request(:get, %r{.*api.gocardless.com/billing_requests}).to_return(
42
- body: body,
43
- headers: response_headers
44
- )
45
- end
46
-
47
- it 'wraps each item in the resource class' do
48
- expect(get_list_response.records.map(&:class).uniq.first).to eq(GoCardlessPro::Resources::BillingRequest)
49
-
50
- expect(get_list_response.records.first.actions).to eq('actions-input')
51
-
52
- expect(get_list_response.records.first.created_at).to eq('created_at-input')
53
-
54
- expect(get_list_response.records.first.fallback_enabled).to eq('fallback_enabled-input')
55
-
56
- expect(get_list_response.records.first.id).to eq('id-input')
57
-
58
- expect(get_list_response.records.first.mandate_request).to eq('mandate_request-input')
59
-
60
- expect(get_list_response.records.first.metadata).to eq('metadata-input')
61
-
62
- expect(get_list_response.records.first.payment_request).to eq('payment_request-input')
63
-
64
- expect(get_list_response.records.first.resources).to eq('resources-input')
65
-
66
- expect(get_list_response.records.first.status).to eq('status-input')
67
- end
68
-
69
- it 'exposes the cursors for before and after' do
70
- expect(get_list_response.before).to eq(nil)
71
- expect(get_list_response.after).to eq('ABC123')
72
- end
73
-
74
- specify { expect(get_list_response.api_response.headers).to eql('content-type' => 'application/json') }
75
-
76
- describe 'retry behaviour' do
77
- before { allow_any_instance_of(GoCardlessPro::Request).to receive(:sleep) }
78
-
79
- it 'retries timeouts' do
80
- stub = stub_request(:get, %r{.*api.gocardless.com/billing_requests}).
81
- to_timeout.then.to_return(status: 200, headers: response_headers, body: body)
82
-
83
- get_list_response
84
- expect(stub).to have_been_requested.twice
85
- end
86
-
87
- it 'retries 5XX errors' do
88
- stub = stub_request(:get, %r{.*api.gocardless.com/billing_requests}).
89
- to_return(status: 502,
90
- headers: { 'Content-Type' => 'text/html' },
91
- body: '<html><body>Response from Cloudflare</body></html>').
92
- then.to_return(status: 200, headers: response_headers, body: body)
93
-
94
- get_list_response
95
- expect(stub).to have_been_requested.twice
96
- end
97
- end
98
- end
99
- end
100
-
101
- describe '#all' do
102
- let!(:first_response_stub) do
103
- stub_request(:get, %r{.*api.gocardless.com/billing_requests$}).to_return(
104
- body: {
105
- 'billing_requests' => [{
106
-
107
- 'actions' => 'actions-input',
108
- 'created_at' => 'created_at-input',
109
- 'fallback_enabled' => 'fallback_enabled-input',
110
- 'id' => 'id-input',
111
- 'links' => 'links-input',
112
- 'mandate_request' => 'mandate_request-input',
113
- 'metadata' => 'metadata-input',
114
- 'payment_request' => 'payment_request-input',
115
- 'resources' => 'resources-input',
116
- 'status' => 'status-input',
117
- }],
118
- meta: {
119
- cursors: { after: 'AB345' },
120
- limit: 1,
121
- },
122
- }.to_json,
123
- headers: response_headers
124
- )
125
- end
126
-
127
- let!(:second_response_stub) do
128
- stub_request(:get, %r{.*api.gocardless.com/billing_requests\?after=AB345}).to_return(
129
- body: {
130
- 'billing_requests' => [{
131
-
132
- 'actions' => 'actions-input',
133
- 'created_at' => 'created_at-input',
134
- 'fallback_enabled' => 'fallback_enabled-input',
135
- 'id' => 'id-input',
136
- 'links' => 'links-input',
137
- 'mandate_request' => 'mandate_request-input',
138
- 'metadata' => 'metadata-input',
139
- 'payment_request' => 'payment_request-input',
140
- 'resources' => 'resources-input',
141
- 'status' => 'status-input',
142
- }],
143
- meta: {
144
- limit: 2,
145
- cursors: {},
146
- },
147
- }.to_json,
148
- headers: response_headers
149
- )
150
- end
151
-
152
- it 'automatically makes the extra requests' do
153
- expect(client.billing_requests.all.to_a.length).to eq(2)
154
- expect(first_response_stub).to have_been_requested
155
- expect(second_response_stub).to have_been_requested
156
- end
157
-
158
- describe 'retry behaviour' do
159
- before { allow_any_instance_of(GoCardlessPro::Request).to receive(:sleep) }
160
-
161
- it 'retries timeouts' do
162
- first_response_stub = stub_request(:get, %r{.*api.gocardless.com/billing_requests$}).to_return(
163
- body: {
164
- 'billing_requests' => [{
165
-
166
- 'actions' => 'actions-input',
167
- 'created_at' => 'created_at-input',
168
- 'fallback_enabled' => 'fallback_enabled-input',
169
- 'id' => 'id-input',
170
- 'links' => 'links-input',
171
- 'mandate_request' => 'mandate_request-input',
172
- 'metadata' => 'metadata-input',
173
- 'payment_request' => 'payment_request-input',
174
- 'resources' => 'resources-input',
175
- 'status' => 'status-input',
176
- }],
177
- meta: {
178
- cursors: { after: 'AB345' },
179
- limit: 1,
180
- },
181
- }.to_json,
182
- headers: response_headers
183
- )
184
-
185
- second_response_stub = stub_request(:get, %r{.*api.gocardless.com/billing_requests\?after=AB345}).
186
- to_timeout.then.
187
- to_return(
188
- body: {
189
- 'billing_requests' => [{
190
-
191
- 'actions' => 'actions-input',
192
- 'created_at' => 'created_at-input',
193
- 'fallback_enabled' => 'fallback_enabled-input',
194
- 'id' => 'id-input',
195
- 'links' => 'links-input',
196
- 'mandate_request' => 'mandate_request-input',
197
- 'metadata' => 'metadata-input',
198
- 'payment_request' => 'payment_request-input',
199
- 'resources' => 'resources-input',
200
- 'status' => 'status-input',
201
- }],
202
- meta: {
203
- limit: 2,
204
- cursors: {},
205
- },
206
- }.to_json,
207
- headers: response_headers
208
- )
209
-
210
- client.billing_requests.all.to_a
211
-
212
- expect(first_response_stub).to have_been_requested
213
- expect(second_response_stub).to have_been_requested.twice
214
- end
215
-
216
- it 'retries 5XX errors' do
217
- first_response_stub = stub_request(:get, %r{.*api.gocardless.com/billing_requests$}).to_return(
218
- body: {
219
- 'billing_requests' => [{
220
-
221
- 'actions' => 'actions-input',
222
- 'created_at' => 'created_at-input',
223
- 'fallback_enabled' => 'fallback_enabled-input',
224
- 'id' => 'id-input',
225
- 'links' => 'links-input',
226
- 'mandate_request' => 'mandate_request-input',
227
- 'metadata' => 'metadata-input',
228
- 'payment_request' => 'payment_request-input',
229
- 'resources' => 'resources-input',
230
- 'status' => 'status-input',
231
- }],
232
- meta: {
233
- cursors: { after: 'AB345' },
234
- limit: 1,
235
- },
236
- }.to_json,
237
- headers: response_headers
238
- )
239
-
240
- second_response_stub = stub_request(:get, %r{.*api.gocardless.com/billing_requests\?after=AB345}).
241
- to_return(
242
- status: 502,
243
- body: '<html><body>Response from Cloudflare</body></html>',
244
- headers: { 'Content-Type' => 'text/html' }
245
- ).then.to_return(
246
- body: {
247
- 'billing_requests' => [{
248
-
249
- 'actions' => 'actions-input',
250
- 'created_at' => 'created_at-input',
251
- 'fallback_enabled' => 'fallback_enabled-input',
252
- 'id' => 'id-input',
253
- 'links' => 'links-input',
254
- 'mandate_request' => 'mandate_request-input',
255
- 'metadata' => 'metadata-input',
256
- 'payment_request' => 'payment_request-input',
257
- 'resources' => 'resources-input',
258
- 'status' => 'status-input',
259
- }],
260
- meta: {
261
- limit: 2,
262
- cursors: {},
263
- },
264
- }.to_json,
265
- headers: response_headers
266
- )
267
-
268
- client.billing_requests.all.to_a
269
-
270
- expect(first_response_stub).to have_been_requested
271
- expect(second_response_stub).to have_been_requested.twice
272
- end
273
- end
274
- end
275
-
276
- describe '#create' do
277
- subject(:post_create_response) { client.billing_requests.create(params: new_resource) }
278
- context 'with a valid request' do
279
- let(:new_resource) do
280
- {
281
-
282
- 'actions' => 'actions-input',
283
- 'created_at' => 'created_at-input',
284
- 'fallback_enabled' => 'fallback_enabled-input',
285
- 'id' => 'id-input',
286
- 'links' => 'links-input',
287
- 'mandate_request' => 'mandate_request-input',
288
- 'metadata' => 'metadata-input',
289
- 'payment_request' => 'payment_request-input',
290
- 'resources' => 'resources-input',
291
- 'status' => 'status-input',
292
- }
293
- end
294
-
295
- before do
296
- stub_request(:post, %r{.*api.gocardless.com/billing_requests}).
297
- with(
298
- body: {
299
- 'billing_requests' => {
300
-
301
- 'actions' => 'actions-input',
302
- 'created_at' => 'created_at-input',
303
- 'fallback_enabled' => 'fallback_enabled-input',
304
- 'id' => 'id-input',
305
- 'links' => 'links-input',
306
- 'mandate_request' => 'mandate_request-input',
307
- 'metadata' => 'metadata-input',
308
- 'payment_request' => 'payment_request-input',
309
- 'resources' => 'resources-input',
310
- 'status' => 'status-input',
311
- },
312
- }
313
- ).
314
- to_return(
315
- body: {
316
- 'billing_requests' =>
317
-
318
- {
319
-
320
- 'actions' => 'actions-input',
321
- 'created_at' => 'created_at-input',
322
- 'fallback_enabled' => 'fallback_enabled-input',
323
- 'id' => 'id-input',
324
- 'links' => 'links-input',
325
- 'mandate_request' => 'mandate_request-input',
326
- 'metadata' => 'metadata-input',
327
- 'payment_request' => 'payment_request-input',
328
- 'resources' => 'resources-input',
329
- 'status' => 'status-input',
330
- },
331
-
332
- }.to_json,
333
- headers: response_headers
334
- )
335
- end
336
-
337
- it 'creates and returns the resource' do
338
- expect(post_create_response).to be_a(GoCardlessPro::Resources::BillingRequest)
339
- end
340
-
341
- describe 'retry behaviour' do
342
- before { allow_any_instance_of(GoCardlessPro::Request).to receive(:sleep) }
343
-
344
- it 'retries timeouts' do
345
- stub = stub_request(:post, %r{.*api.gocardless.com/billing_requests}).
346
- to_timeout.then.to_return(status: 200, headers: response_headers)
347
-
348
- post_create_response
349
- expect(stub).to have_been_requested.twice
350
- end
351
-
352
- it 'retries 5XX errors' do
353
- stub = stub_request(:post, %r{.*api.gocardless.com/billing_requests}).
354
- to_return(status: 502,
355
- headers: { 'Content-Type' => 'text/html' },
356
- body: '<html><body>Response from Cloudflare</body></html>').
357
- then.to_return(status: 200, headers: response_headers)
358
-
359
- post_create_response
360
- expect(stub).to have_been_requested.twice
361
- end
362
- end
363
- end
364
-
365
- context 'with a request that returns a validation error' do
366
- let(:new_resource) { {} }
367
-
368
- before do
369
- stub_request(:post, %r{.*api.gocardless.com/billing_requests}).to_return(
370
- body: {
371
- error: {
372
- type: 'validation_failed',
373
- code: 422,
374
- errors: [
375
- { message: 'test error message', field: 'test_field' },
376
- ],
377
- },
378
- }.to_json,
379
- headers: response_headers,
380
- status: 422
381
- )
382
- end
383
-
384
- it 'throws the correct error' do
385
- expect { post_create_response }.to raise_error(GoCardlessPro::ValidationError)
386
- end
387
- end
388
-
389
- context 'with a request that returns an idempotent creation conflict error' do
390
- let(:id) { 'ID123' }
391
-
392
- let(:new_resource) do
393
- {
394
-
395
- 'actions' => 'actions-input',
396
- 'created_at' => 'created_at-input',
397
- 'fallback_enabled' => 'fallback_enabled-input',
398
- 'id' => 'id-input',
399
- 'links' => 'links-input',
400
- 'mandate_request' => 'mandate_request-input',
401
- 'metadata' => 'metadata-input',
402
- 'payment_request' => 'payment_request-input',
403
- 'resources' => 'resources-input',
404
- 'status' => 'status-input',
405
- }
406
- end
407
-
408
- let!(:post_stub) do
409
- stub_request(:post, %r{.*api.gocardless.com/billing_requests}).to_return(
410
- body: {
411
- error: {
412
- type: 'invalid_state',
413
- code: 409,
414
- errors: [
415
- {
416
- message: 'A resource has already been created with this idempotency key',
417
- reason: 'idempotent_creation_conflict',
418
- links: {
419
- conflicting_resource_id: id,
420
- },
421
- },
422
- ],
423
- },
424
- }.to_json,
425
- headers: response_headers,
426
- status: 409
427
- )
428
- end
429
-
430
- let!(:get_stub) do
431
- stub_url = "/billing_requests/#{id}"
432
- stub_request(:get, /.*api.gocardless.com#{stub_url}/).
433
- to_return(
434
- body: {
435
- 'billing_requests' => {
436
-
437
- 'actions' => 'actions-input',
438
- 'created_at' => 'created_at-input',
439
- 'fallback_enabled' => 'fallback_enabled-input',
440
- 'id' => 'id-input',
441
- 'links' => 'links-input',
442
- 'mandate_request' => 'mandate_request-input',
443
- 'metadata' => 'metadata-input',
444
- 'payment_request' => 'payment_request-input',
445
- 'resources' => 'resources-input',
446
- 'status' => 'status-input',
447
- },
448
- }.to_json,
449
- headers: response_headers
450
- )
451
- end
452
-
453
- context 'with default behaviour' do
454
- it 'fetches the already-created resource' do
455
- post_create_response
456
- expect(post_stub).to have_been_requested
457
- expect(get_stub).to have_been_requested
458
- end
459
- end
460
-
461
- context 'with on_idempotency_conflict: :raise' do
462
- let(:client) do
463
- GoCardlessPro::Client.new(
464
- access_token: 'SECRET_TOKEN',
465
- on_idempotency_conflict: :raise
466
- )
467
- end
468
-
469
- it 'raises an IdempotencyConflict error' do
470
- expect { post_create_response }.
471
- to raise_error(GoCardlessPro::IdempotencyConflict)
472
- end
473
- end
474
- end
475
- end
476
-
477
- describe '#get' do
478
- let(:id) { 'ID123' }
479
-
480
- subject(:get_response) { client.billing_requests.get(id) }
481
-
482
- context 'passing in a custom header' do
483
- let!(:stub) do
484
- stub_url = '/billing_requests/:identity'.gsub(':identity', id)
485
- stub_request(:get, /.*api.gocardless.com#{stub_url}/).
486
- with(headers: { 'Foo' => 'Bar' }).
487
- to_return(
488
- body: {
489
- 'billing_requests' => {
490
-
491
- 'actions' => 'actions-input',
492
- 'created_at' => 'created_at-input',
493
- 'fallback_enabled' => 'fallback_enabled-input',
494
- 'id' => 'id-input',
495
- 'links' => 'links-input',
496
- 'mandate_request' => 'mandate_request-input',
497
- 'metadata' => 'metadata-input',
498
- 'payment_request' => 'payment_request-input',
499
- 'resources' => 'resources-input',
500
- 'status' => 'status-input',
501
- },
502
- }.to_json,
503
- headers: response_headers
504
- )
505
- end
506
-
507
- subject(:get_response) do
508
- client.billing_requests.get(id, headers: {
509
- 'Foo' => 'Bar',
510
- })
511
- end
512
-
513
- it 'includes the header' do
514
- get_response
515
- expect(stub).to have_been_requested
516
- end
517
- end
518
-
519
- context 'when there is a billing_request to return' do
520
- before do
521
- stub_url = '/billing_requests/:identity'.gsub(':identity', id)
522
- stub_request(:get, /.*api.gocardless.com#{stub_url}/).to_return(
523
- body: {
524
- 'billing_requests' => {
525
-
526
- 'actions' => 'actions-input',
527
- 'created_at' => 'created_at-input',
528
- 'fallback_enabled' => 'fallback_enabled-input',
529
- 'id' => 'id-input',
530
- 'links' => 'links-input',
531
- 'mandate_request' => 'mandate_request-input',
532
- 'metadata' => 'metadata-input',
533
- 'payment_request' => 'payment_request-input',
534
- 'resources' => 'resources-input',
535
- 'status' => 'status-input',
536
- },
537
- }.to_json,
538
- headers: response_headers
539
- )
540
- end
541
-
542
- it 'wraps the response in a resource' do
543
- expect(get_response).to be_a(GoCardlessPro::Resources::BillingRequest)
544
- end
545
- end
546
-
547
- context 'when nothing is returned' do
548
- before do
549
- stub_url = '/billing_requests/:identity'.gsub(':identity', id)
550
- stub_request(:get, /.*api.gocardless.com#{stub_url}/).to_return(
551
- body: '',
552
- headers: response_headers
553
- )
554
- end
555
-
556
- it 'returns nil' do
557
- expect(get_response).to be_nil
558
- end
559
- end
560
-
561
- context "when an ID is specified which can't be included in a valid URI" do
562
- let(:id) { '`' }
563
-
564
- it "doesn't raise an error" do
565
- expect { get_response }.to_not raise_error(/bad URI/)
566
- end
567
- end
568
-
569
- describe 'retry behaviour' do
570
- before { allow_any_instance_of(GoCardlessPro::Request).to receive(:sleep) }
571
-
572
- it 'retries timeouts' do
573
- stub_url = '/billing_requests/:identity'.gsub(':identity', id)
574
-
575
- stub = stub_request(:get, /.*api.gocardless.com#{stub_url}/).
576
- to_timeout.then.to_return(status: 200, headers: response_headers)
577
-
578
- get_response
579
- expect(stub).to have_been_requested.twice
580
- end
581
-
582
- it 'retries 5XX errors, other than 500s' do
583
- stub_url = '/billing_requests/:identity'.gsub(':identity', id)
584
-
585
- stub = stub_request(:get, /.*api.gocardless.com#{stub_url}/).
586
- to_return(status: 502,
587
- headers: { 'Content-Type' => 'text/html' },
588
- body: '<html><body>Response from Cloudflare</body></html>').
589
- then.to_return(status: 200, headers: response_headers)
590
-
591
- get_response
592
- expect(stub).to have_been_requested.twice
593
- end
594
-
595
- it 'retries 500 errors returned by the API' do
596
- stub_url = '/billing_requests/:identity'.gsub(':identity', id)
597
-
598
- gocardless_error = {
599
- 'error' => {
600
- 'message' => 'Internal server error',
601
- 'documentation_url' => 'https://developer.gocardless.com/#gocardless',
602
- 'errors' => [{
603
- 'message' => 'Internal server error',
604
- 'reason' => 'internal_server_error',
605
- }],
606
- 'type' => 'gocardless',
607
- 'code' => 500,
608
- 'request_id' => 'dummy_request_id',
609
- 'id' => 'dummy_exception_id',
610
- },
611
- }
612
-
613
- stub = stub_request(:get, /.*api.gocardless.com#{stub_url}/).
614
- to_return(status: 500,
615
- headers: response_headers,
616
- body: gocardless_error.to_json).
617
- then.to_return(status: 200, headers: response_headers)
618
-
619
- get_response
620
- expect(stub).to have_been_requested.twice
621
- end
622
- end
623
- end
624
-
625
- describe '#collect_customer_details' do
626
- subject(:post_response) { client.billing_requests.collect_customer_details(resource_id) }
627
-
628
- let(:resource_id) { 'ABC123' }
629
-
630
- let!(:stub) do
631
- # /billing_requests/%v/actions/collect_customer_details
632
- stub_url = '/billing_requests/:identity/actions/collect_customer_details'.gsub(':identity', resource_id)
633
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).to_return(
634
-
635
- body: {
636
- 'billing_requests' => {
637
-
638
- 'actions' => 'actions-input',
639
- 'created_at' => 'created_at-input',
640
- 'fallback_enabled' => 'fallback_enabled-input',
641
- 'id' => 'id-input',
642
- 'links' => 'links-input',
643
- 'mandate_request' => 'mandate_request-input',
644
- 'metadata' => 'metadata-input',
645
- 'payment_request' => 'payment_request-input',
646
- 'resources' => 'resources-input',
647
- 'status' => 'status-input',
648
- },
649
- }.to_json,
650
-
651
- headers: response_headers
652
- )
653
- end
654
-
655
- it 'wraps the response and calls the right endpoint' do
656
- expect(post_response).to be_a(GoCardlessPro::Resources::BillingRequest)
657
-
658
- expect(stub).to have_been_requested
659
- end
660
-
661
- describe 'retry behaviour' do
662
- it "doesn't retry errors" do
663
- stub_url = '/billing_requests/:identity/actions/collect_customer_details'.gsub(':identity', resource_id)
664
- stub = stub_request(:post, /.*api.gocardless.com#{stub_url}/).
665
- to_timeout
666
-
667
- expect { post_response }.to raise_error(Faraday::ConnectionFailed)
668
- expect(stub).to have_been_requested
669
- end
670
- end
671
-
672
- context 'when the request needs a body and custom header' do
673
- let(:body) { { foo: 'bar' } }
674
- let(:headers) { { 'Foo' => 'Bar' } }
675
- subject(:post_response) { client.billing_requests.collect_customer_details(resource_id, body, headers) }
676
-
677
- let(:resource_id) { 'ABC123' }
678
-
679
- let!(:stub) do
680
- # /billing_requests/%v/actions/collect_customer_details
681
- stub_url = '/billing_requests/:identity/actions/collect_customer_details'.gsub(':identity', resource_id)
682
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).
683
- with(
684
- body: { foo: 'bar' },
685
- headers: { 'Foo' => 'Bar' }
686
- ).to_return(
687
- body: {
688
- 'billing_requests' => {
689
-
690
- 'actions' => 'actions-input',
691
- 'created_at' => 'created_at-input',
692
- 'fallback_enabled' => 'fallback_enabled-input',
693
- 'id' => 'id-input',
694
- 'links' => 'links-input',
695
- 'mandate_request' => 'mandate_request-input',
696
- 'metadata' => 'metadata-input',
697
- 'payment_request' => 'payment_request-input',
698
- 'resources' => 'resources-input',
699
- 'status' => 'status-input',
700
- },
701
- }.to_json,
702
- headers: response_headers
703
- )
704
- end
705
- end
706
- end
707
-
708
- describe '#collect_bank_account' do
709
- subject(:post_response) { client.billing_requests.collect_bank_account(resource_id) }
710
-
711
- let(:resource_id) { 'ABC123' }
712
-
713
- let!(:stub) do
714
- # /billing_requests/%v/actions/collect_bank_account
715
- stub_url = '/billing_requests/:identity/actions/collect_bank_account'.gsub(':identity', resource_id)
716
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).to_return(
717
-
718
- body: {
719
- 'billing_requests' => {
720
-
721
- 'actions' => 'actions-input',
722
- 'created_at' => 'created_at-input',
723
- 'fallback_enabled' => 'fallback_enabled-input',
724
- 'id' => 'id-input',
725
- 'links' => 'links-input',
726
- 'mandate_request' => 'mandate_request-input',
727
- 'metadata' => 'metadata-input',
728
- 'payment_request' => 'payment_request-input',
729
- 'resources' => 'resources-input',
730
- 'status' => 'status-input',
731
- },
732
- }.to_json,
733
-
734
- headers: response_headers
735
- )
736
- end
737
-
738
- it 'wraps the response and calls the right endpoint' do
739
- expect(post_response).to be_a(GoCardlessPro::Resources::BillingRequest)
740
-
741
- expect(stub).to have_been_requested
742
- end
743
-
744
- describe 'retry behaviour' do
745
- it "doesn't retry errors" do
746
- stub_url = '/billing_requests/:identity/actions/collect_bank_account'.gsub(':identity', resource_id)
747
- stub = stub_request(:post, /.*api.gocardless.com#{stub_url}/).
748
- to_timeout
749
-
750
- expect { post_response }.to raise_error(Faraday::ConnectionFailed)
751
- expect(stub).to have_been_requested
752
- end
753
- end
754
-
755
- context 'when the request needs a body and custom header' do
756
- let(:body) { { foo: 'bar' } }
757
- let(:headers) { { 'Foo' => 'Bar' } }
758
- subject(:post_response) { client.billing_requests.collect_bank_account(resource_id, body, headers) }
759
-
760
- let(:resource_id) { 'ABC123' }
761
-
762
- let!(:stub) do
763
- # /billing_requests/%v/actions/collect_bank_account
764
- stub_url = '/billing_requests/:identity/actions/collect_bank_account'.gsub(':identity', resource_id)
765
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).
766
- with(
767
- body: { foo: 'bar' },
768
- headers: { 'Foo' => 'Bar' }
769
- ).to_return(
770
- body: {
771
- 'billing_requests' => {
772
-
773
- 'actions' => 'actions-input',
774
- 'created_at' => 'created_at-input',
775
- 'fallback_enabled' => 'fallback_enabled-input',
776
- 'id' => 'id-input',
777
- 'links' => 'links-input',
778
- 'mandate_request' => 'mandate_request-input',
779
- 'metadata' => 'metadata-input',
780
- 'payment_request' => 'payment_request-input',
781
- 'resources' => 'resources-input',
782
- 'status' => 'status-input',
783
- },
784
- }.to_json,
785
- headers: response_headers
786
- )
787
- end
788
- end
789
- end
790
-
791
- describe '#fulfil' do
792
- subject(:post_response) { client.billing_requests.fulfil(resource_id) }
793
-
794
- let(:resource_id) { 'ABC123' }
795
-
796
- let!(:stub) do
797
- # /billing_requests/%v/actions/fulfil
798
- stub_url = '/billing_requests/:identity/actions/fulfil'.gsub(':identity', resource_id)
799
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).to_return(
800
-
801
- body: {
802
- 'billing_requests' => {
803
-
804
- 'actions' => 'actions-input',
805
- 'created_at' => 'created_at-input',
806
- 'fallback_enabled' => 'fallback_enabled-input',
807
- 'id' => 'id-input',
808
- 'links' => 'links-input',
809
- 'mandate_request' => 'mandate_request-input',
810
- 'metadata' => 'metadata-input',
811
- 'payment_request' => 'payment_request-input',
812
- 'resources' => 'resources-input',
813
- 'status' => 'status-input',
814
- },
815
- }.to_json,
816
-
817
- headers: response_headers
818
- )
819
- end
820
-
821
- it 'wraps the response and calls the right endpoint' do
822
- expect(post_response).to be_a(GoCardlessPro::Resources::BillingRequest)
823
-
824
- expect(stub).to have_been_requested
825
- end
826
-
827
- describe 'retry behaviour' do
828
- it "doesn't retry errors" do
829
- stub_url = '/billing_requests/:identity/actions/fulfil'.gsub(':identity', resource_id)
830
- stub = stub_request(:post, /.*api.gocardless.com#{stub_url}/).
831
- to_timeout
832
-
833
- expect { post_response }.to raise_error(Faraday::ConnectionFailed)
834
- expect(stub).to have_been_requested
835
- end
836
- end
837
-
838
- context 'when the request needs a body and custom header' do
839
- let(:body) { { foo: 'bar' } }
840
- let(:headers) { { 'Foo' => 'Bar' } }
841
- subject(:post_response) { client.billing_requests.fulfil(resource_id, body, headers) }
842
-
843
- let(:resource_id) { 'ABC123' }
844
-
845
- let!(:stub) do
846
- # /billing_requests/%v/actions/fulfil
847
- stub_url = '/billing_requests/:identity/actions/fulfil'.gsub(':identity', resource_id)
848
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).
849
- with(
850
- body: { foo: 'bar' },
851
- headers: { 'Foo' => 'Bar' }
852
- ).to_return(
853
- body: {
854
- 'billing_requests' => {
855
-
856
- 'actions' => 'actions-input',
857
- 'created_at' => 'created_at-input',
858
- 'fallback_enabled' => 'fallback_enabled-input',
859
- 'id' => 'id-input',
860
- 'links' => 'links-input',
861
- 'mandate_request' => 'mandate_request-input',
862
- 'metadata' => 'metadata-input',
863
- 'payment_request' => 'payment_request-input',
864
- 'resources' => 'resources-input',
865
- 'status' => 'status-input',
866
- },
867
- }.to_json,
868
- headers: response_headers
869
- )
870
- end
871
- end
872
- end
873
-
874
- describe '#choose_currency' do
875
- subject(:post_response) { client.billing_requests.choose_currency(resource_id) }
876
-
877
- let(:resource_id) { 'ABC123' }
878
-
879
- let!(:stub) do
880
- # /billing_requests/%v/actions/choose_currency
881
- stub_url = '/billing_requests/:identity/actions/choose_currency'.gsub(':identity', resource_id)
882
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).to_return(
883
-
884
- body: {
885
- 'billing_requests' => {
886
-
887
- 'actions' => 'actions-input',
888
- 'created_at' => 'created_at-input',
889
- 'fallback_enabled' => 'fallback_enabled-input',
890
- 'id' => 'id-input',
891
- 'links' => 'links-input',
892
- 'mandate_request' => 'mandate_request-input',
893
- 'metadata' => 'metadata-input',
894
- 'payment_request' => 'payment_request-input',
895
- 'resources' => 'resources-input',
896
- 'status' => 'status-input',
897
- },
898
- }.to_json,
899
-
900
- headers: response_headers
901
- )
902
- end
903
-
904
- it 'wraps the response and calls the right endpoint' do
905
- expect(post_response).to be_a(GoCardlessPro::Resources::BillingRequest)
906
-
907
- expect(stub).to have_been_requested
908
- end
909
-
910
- describe 'retry behaviour' do
911
- it "doesn't retry errors" do
912
- stub_url = '/billing_requests/:identity/actions/choose_currency'.gsub(':identity', resource_id)
913
- stub = stub_request(:post, /.*api.gocardless.com#{stub_url}/).
914
- to_timeout
915
-
916
- expect { post_response }.to raise_error(Faraday::ConnectionFailed)
917
- expect(stub).to have_been_requested
918
- end
919
- end
920
-
921
- context 'when the request needs a body and custom header' do
922
- let(:body) { { foo: 'bar' } }
923
- let(:headers) { { 'Foo' => 'Bar' } }
924
- subject(:post_response) { client.billing_requests.choose_currency(resource_id, body, headers) }
925
-
926
- let(:resource_id) { 'ABC123' }
927
-
928
- let!(:stub) do
929
- # /billing_requests/%v/actions/choose_currency
930
- stub_url = '/billing_requests/:identity/actions/choose_currency'.gsub(':identity', resource_id)
931
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).
932
- with(
933
- body: { foo: 'bar' },
934
- headers: { 'Foo' => 'Bar' }
935
- ).to_return(
936
- body: {
937
- 'billing_requests' => {
938
-
939
- 'actions' => 'actions-input',
940
- 'created_at' => 'created_at-input',
941
- 'fallback_enabled' => 'fallback_enabled-input',
942
- 'id' => 'id-input',
943
- 'links' => 'links-input',
944
- 'mandate_request' => 'mandate_request-input',
945
- 'metadata' => 'metadata-input',
946
- 'payment_request' => 'payment_request-input',
947
- 'resources' => 'resources-input',
948
- 'status' => 'status-input',
949
- },
950
- }.to_json,
951
- headers: response_headers
952
- )
953
- end
954
- end
955
- end
956
-
957
- describe '#confirm_payer_details' do
958
- subject(:post_response) { client.billing_requests.confirm_payer_details(resource_id) }
959
-
960
- let(:resource_id) { 'ABC123' }
961
-
962
- let!(:stub) do
963
- # /billing_requests/%v/actions/confirm_payer_details
964
- stub_url = '/billing_requests/:identity/actions/confirm_payer_details'.gsub(':identity', resource_id)
965
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).to_return(
966
-
967
- body: {
968
- 'billing_requests' => {
969
-
970
- 'actions' => 'actions-input',
971
- 'created_at' => 'created_at-input',
972
- 'fallback_enabled' => 'fallback_enabled-input',
973
- 'id' => 'id-input',
974
- 'links' => 'links-input',
975
- 'mandate_request' => 'mandate_request-input',
976
- 'metadata' => 'metadata-input',
977
- 'payment_request' => 'payment_request-input',
978
- 'resources' => 'resources-input',
979
- 'status' => 'status-input',
980
- },
981
- }.to_json,
982
-
983
- headers: response_headers
984
- )
985
- end
986
-
987
- it 'wraps the response and calls the right endpoint' do
988
- expect(post_response).to be_a(GoCardlessPro::Resources::BillingRequest)
989
-
990
- expect(stub).to have_been_requested
991
- end
992
-
993
- describe 'retry behaviour' do
994
- it "doesn't retry errors" do
995
- stub_url = '/billing_requests/:identity/actions/confirm_payer_details'.gsub(':identity', resource_id)
996
- stub = stub_request(:post, /.*api.gocardless.com#{stub_url}/).
997
- to_timeout
998
-
999
- expect { post_response }.to raise_error(Faraday::ConnectionFailed)
1000
- expect(stub).to have_been_requested
1001
- end
1002
- end
1003
-
1004
- context 'when the request needs a body and custom header' do
1005
- let(:body) { { foo: 'bar' } }
1006
- let(:headers) { { 'Foo' => 'Bar' } }
1007
- subject(:post_response) { client.billing_requests.confirm_payer_details(resource_id, body, headers) }
1008
-
1009
- let(:resource_id) { 'ABC123' }
1010
-
1011
- let!(:stub) do
1012
- # /billing_requests/%v/actions/confirm_payer_details
1013
- stub_url = '/billing_requests/:identity/actions/confirm_payer_details'.gsub(':identity', resource_id)
1014
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).
1015
- with(
1016
- body: { foo: 'bar' },
1017
- headers: { 'Foo' => 'Bar' }
1018
- ).to_return(
1019
- body: {
1020
- 'billing_requests' => {
1021
-
1022
- 'actions' => 'actions-input',
1023
- 'created_at' => 'created_at-input',
1024
- 'fallback_enabled' => 'fallback_enabled-input',
1025
- 'id' => 'id-input',
1026
- 'links' => 'links-input',
1027
- 'mandate_request' => 'mandate_request-input',
1028
- 'metadata' => 'metadata-input',
1029
- 'payment_request' => 'payment_request-input',
1030
- 'resources' => 'resources-input',
1031
- 'status' => 'status-input',
1032
- },
1033
- }.to_json,
1034
- headers: response_headers
1035
- )
1036
- end
1037
- end
1038
- end
1039
-
1040
- describe '#cancel' do
1041
- subject(:post_response) { client.billing_requests.cancel(resource_id) }
1042
-
1043
- let(:resource_id) { 'ABC123' }
1044
-
1045
- let!(:stub) do
1046
- # /billing_requests/%v/actions/cancel
1047
- stub_url = '/billing_requests/:identity/actions/cancel'.gsub(':identity', resource_id)
1048
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).to_return(
1049
-
1050
- body: {
1051
- 'billing_requests' => {
1052
-
1053
- 'actions' => 'actions-input',
1054
- 'created_at' => 'created_at-input',
1055
- 'fallback_enabled' => 'fallback_enabled-input',
1056
- 'id' => 'id-input',
1057
- 'links' => 'links-input',
1058
- 'mandate_request' => 'mandate_request-input',
1059
- 'metadata' => 'metadata-input',
1060
- 'payment_request' => 'payment_request-input',
1061
- 'resources' => 'resources-input',
1062
- 'status' => 'status-input',
1063
- },
1064
- }.to_json,
1065
-
1066
- headers: response_headers
1067
- )
1068
- end
1069
-
1070
- it 'wraps the response and calls the right endpoint' do
1071
- expect(post_response).to be_a(GoCardlessPro::Resources::BillingRequest)
1072
-
1073
- expect(stub).to have_been_requested
1074
- end
1075
-
1076
- describe 'retry behaviour' do
1077
- it "doesn't retry errors" do
1078
- stub_url = '/billing_requests/:identity/actions/cancel'.gsub(':identity', resource_id)
1079
- stub = stub_request(:post, /.*api.gocardless.com#{stub_url}/).
1080
- to_timeout
1081
-
1082
- expect { post_response }.to raise_error(Faraday::ConnectionFailed)
1083
- expect(stub).to have_been_requested
1084
- end
1085
- end
1086
-
1087
- context 'when the request needs a body and custom header' do
1088
- let(:body) { { foo: 'bar' } }
1089
- let(:headers) { { 'Foo' => 'Bar' } }
1090
- subject(:post_response) { client.billing_requests.cancel(resource_id, body, headers) }
1091
-
1092
- let(:resource_id) { 'ABC123' }
1093
-
1094
- let!(:stub) do
1095
- # /billing_requests/%v/actions/cancel
1096
- stub_url = '/billing_requests/:identity/actions/cancel'.gsub(':identity', resource_id)
1097
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).
1098
- with(
1099
- body: { foo: 'bar' },
1100
- headers: { 'Foo' => 'Bar' }
1101
- ).to_return(
1102
- body: {
1103
- 'billing_requests' => {
1104
-
1105
- 'actions' => 'actions-input',
1106
- 'created_at' => 'created_at-input',
1107
- 'fallback_enabled' => 'fallback_enabled-input',
1108
- 'id' => 'id-input',
1109
- 'links' => 'links-input',
1110
- 'mandate_request' => 'mandate_request-input',
1111
- 'metadata' => 'metadata-input',
1112
- 'payment_request' => 'payment_request-input',
1113
- 'resources' => 'resources-input',
1114
- 'status' => 'status-input',
1115
- },
1116
- }.to_json,
1117
- headers: response_headers
1118
- )
1119
- end
1120
- end
1121
- end
1122
-
1123
- describe '#notify' do
1124
- subject(:post_response) { client.billing_requests.notify(resource_id) }
1125
-
1126
- let(:resource_id) { 'ABC123' }
1127
-
1128
- let!(:stub) do
1129
- # /billing_requests/%v/actions/notify
1130
- stub_url = '/billing_requests/:identity/actions/notify'.gsub(':identity', resource_id)
1131
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).to_return(
1132
-
1133
- body: {
1134
- 'billing_requests' => {
1135
-
1136
- 'actions' => 'actions-input',
1137
- 'created_at' => 'created_at-input',
1138
- 'fallback_enabled' => 'fallback_enabled-input',
1139
- 'id' => 'id-input',
1140
- 'links' => 'links-input',
1141
- 'mandate_request' => 'mandate_request-input',
1142
- 'metadata' => 'metadata-input',
1143
- 'payment_request' => 'payment_request-input',
1144
- 'resources' => 'resources-input',
1145
- 'status' => 'status-input',
1146
- },
1147
- }.to_json,
1148
-
1149
- headers: response_headers
1150
- )
1151
- end
1152
-
1153
- it 'wraps the response and calls the right endpoint' do
1154
- expect(post_response).to be_a(GoCardlessPro::Resources::BillingRequest)
1155
-
1156
- expect(stub).to have_been_requested
1157
- end
1158
-
1159
- describe 'retry behaviour' do
1160
- it "doesn't retry errors" do
1161
- stub_url = '/billing_requests/:identity/actions/notify'.gsub(':identity', resource_id)
1162
- stub = stub_request(:post, /.*api.gocardless.com#{stub_url}/).
1163
- to_timeout
1164
-
1165
- expect { post_response }.to raise_error(Faraday::ConnectionFailed)
1166
- expect(stub).to have_been_requested
1167
- end
1168
- end
1169
-
1170
- context 'when the request needs a body and custom header' do
1171
- let(:body) { { foo: 'bar' } }
1172
- let(:headers) { { 'Foo' => 'Bar' } }
1173
- subject(:post_response) { client.billing_requests.notify(resource_id, body, headers) }
1174
-
1175
- let(:resource_id) { 'ABC123' }
1176
-
1177
- let!(:stub) do
1178
- # /billing_requests/%v/actions/notify
1179
- stub_url = '/billing_requests/:identity/actions/notify'.gsub(':identity', resource_id)
1180
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).
1181
- with(
1182
- body: { foo: 'bar' },
1183
- headers: { 'Foo' => 'Bar' }
1184
- ).to_return(
1185
- body: {
1186
- 'billing_requests' => {
1187
-
1188
- 'actions' => 'actions-input',
1189
- 'created_at' => 'created_at-input',
1190
- 'fallback_enabled' => 'fallback_enabled-input',
1191
- 'id' => 'id-input',
1192
- 'links' => 'links-input',
1193
- 'mandate_request' => 'mandate_request-input',
1194
- 'metadata' => 'metadata-input',
1195
- 'payment_request' => 'payment_request-input',
1196
- 'resources' => 'resources-input',
1197
- 'status' => 'status-input',
1198
- },
1199
- }.to_json,
1200
- headers: response_headers
1201
- )
1202
- end
1203
- end
1204
- end
1205
-
1206
- describe '#fallback' do
1207
- subject(:post_response) { client.billing_requests.fallback(resource_id) }
1208
-
1209
- let(:resource_id) { 'ABC123' }
1210
-
1211
- let!(:stub) do
1212
- # /billing_requests/%v/actions/fallback
1213
- stub_url = '/billing_requests/:identity/actions/fallback'.gsub(':identity', resource_id)
1214
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).to_return(
1215
-
1216
- body: {
1217
- 'billing_requests' => {
1218
-
1219
- 'actions' => 'actions-input',
1220
- 'created_at' => 'created_at-input',
1221
- 'fallback_enabled' => 'fallback_enabled-input',
1222
- 'id' => 'id-input',
1223
- 'links' => 'links-input',
1224
- 'mandate_request' => 'mandate_request-input',
1225
- 'metadata' => 'metadata-input',
1226
- 'payment_request' => 'payment_request-input',
1227
- 'resources' => 'resources-input',
1228
- 'status' => 'status-input',
1229
- },
1230
- }.to_json,
1231
-
1232
- headers: response_headers
1233
- )
1234
- end
1235
-
1236
- it 'wraps the response and calls the right endpoint' do
1237
- expect(post_response).to be_a(GoCardlessPro::Resources::BillingRequest)
1238
-
1239
- expect(stub).to have_been_requested
1240
- end
1241
-
1242
- describe 'retry behaviour' do
1243
- it "doesn't retry errors" do
1244
- stub_url = '/billing_requests/:identity/actions/fallback'.gsub(':identity', resource_id)
1245
- stub = stub_request(:post, /.*api.gocardless.com#{stub_url}/).
1246
- to_timeout
1247
-
1248
- expect { post_response }.to raise_error(Faraday::ConnectionFailed)
1249
- expect(stub).to have_been_requested
1250
- end
1251
- end
1252
-
1253
- context 'when the request needs a body and custom header' do
1254
- let(:body) { { foo: 'bar' } }
1255
- let(:headers) { { 'Foo' => 'Bar' } }
1256
- subject(:post_response) { client.billing_requests.fallback(resource_id, body, headers) }
1257
-
1258
- let(:resource_id) { 'ABC123' }
1259
-
1260
- let!(:stub) do
1261
- # /billing_requests/%v/actions/fallback
1262
- stub_url = '/billing_requests/:identity/actions/fallback'.gsub(':identity', resource_id)
1263
- stub_request(:post, /.*api.gocardless.com#{stub_url}/).
1264
- with(
1265
- body: { foo: 'bar' },
1266
- headers: { 'Foo' => 'Bar' }
1267
- ).to_return(
1268
- body: {
1269
- 'billing_requests' => {
1270
-
1271
- 'actions' => 'actions-input',
1272
- 'created_at' => 'created_at-input',
1273
- 'fallback_enabled' => 'fallback_enabled-input',
1274
- 'id' => 'id-input',
1275
- 'links' => 'links-input',
1276
- 'mandate_request' => 'mandate_request-input',
1277
- 'metadata' => 'metadata-input',
1278
- 'payment_request' => 'payment_request-input',
1279
- 'resources' => 'resources-input',
1280
- 'status' => 'status-input',
1281
- },
1282
- }.to_json,
1283
- headers: response_headers
1284
- )
1285
- end
1286
- end
1287
- end
1288
- end