gocardless_pro 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +13 -4
- data/lib/gocardless_pro.rb +1 -0
- data/lib/gocardless_pro/api_service.rb +2 -0
- data/lib/gocardless_pro/client.rb +4 -3
- data/lib/gocardless_pro/error/invalid_state_error.rb +17 -0
- data/lib/gocardless_pro/middlewares/raise_gocardless_errors.rb +50 -0
- data/lib/gocardless_pro/request.rb +38 -1
- data/lib/gocardless_pro/resources/creditor.rb +2 -2
- data/lib/gocardless_pro/resources/creditor_bank_account.rb +11 -11
- data/lib/gocardless_pro/resources/customer_bank_account.rb +2 -2
- data/lib/gocardless_pro/resources/event.rb +2 -2
- data/lib/gocardless_pro/resources/mandate.rb +2 -2
- data/lib/gocardless_pro/resources/payment.rb +7 -7
- data/lib/gocardless_pro/resources/payout.rb +7 -6
- data/lib/gocardless_pro/resources/redirect_flow.rb +2 -2
- data/lib/gocardless_pro/resources/refund.rb +2 -2
- data/lib/gocardless_pro/resources/subscription.rb +2 -2
- data/lib/gocardless_pro/response.rb +2 -54
- data/lib/gocardless_pro/services/bank_details_lookups_service.rb +3 -0
- data/lib/gocardless_pro/services/creditor_bank_accounts_service.rb +31 -2
- data/lib/gocardless_pro/services/creditors_service.rb +21 -1
- data/lib/gocardless_pro/services/customer_bank_accounts_service.rb +34 -2
- data/lib/gocardless_pro/services/customers_service.rb +21 -1
- data/lib/gocardless_pro/services/events_service.rb +5 -0
- data/lib/gocardless_pro/services/mandate_pdfs_service.rb +3 -0
- data/lib/gocardless_pro/services/mandates_service.rb +47 -3
- data/lib/gocardless_pro/services/payments_service.rb +47 -3
- data/lib/gocardless_pro/services/payouts_service.rb +5 -0
- data/lib/gocardless_pro/services/redirect_flows_service.rb +28 -2
- data/lib/gocardless_pro/services/refunds_service.rb +21 -1
- data/lib/gocardless_pro/services/subscriptions_service.rb +34 -2
- data/lib/gocardless_pro/version.rb +1 -1
- data/spec/api_service_spec.rb +106 -0
- data/spec/middlewares/raise_gocardless_errors_spec.rb +98 -0
- data/spec/resources/bank_details_lookup_spec.rb +102 -19
- data/spec/resources/creditor_bank_account_spec.rb +416 -40
- data/spec/resources/creditor_spec.rb +414 -53
- data/spec/resources/customer_bank_account_spec.rb +452 -40
- data/spec/resources/customer_spec.rb +457 -45
- data/spec/resources/event_spec.rb +171 -72
- data/spec/resources/mandate_pdf_spec.rb +100 -17
- data/spec/resources/mandate_spec.rb +501 -44
- data/spec/resources/payment_spec.rb +531 -48
- data/spec/resources/payout_spec.rb +189 -45
- data/spec/resources/redirect_flow_spec.rb +277 -43
- data/spec/resources/refund_spec.rb +349 -34
- data/spec/resources/subscription_spec.rb +531 -53
- data/spec/response_spec.rb +12 -79
- data/spec/services/bank_details_lookups_service_spec.rb +67 -2
- data/spec/services/creditor_bank_accounts_service_spec.rb +309 -31
- data/spec/services/creditors_service_spec.rb +343 -33
- data/spec/services/customer_bank_accounts_service_spec.rb +335 -32
- data/spec/services/customers_service_spec.rb +364 -36
- data/spec/services/events_service_spec.rb +185 -24
- data/spec/services/mandate_pdfs_service_spec.rb +66 -2
- data/spec/services/mandates_service_spec.rb +341 -33
- data/spec/services/payments_service_spec.rb +355 -35
- data/spec/services/payouts_service_spec.rb +206 -26
- data/spec/services/redirect_flows_service_spec.rb +137 -7
- data/spec/services/refunds_service_spec.rb +301 -27
- data/spec/services/subscriptions_service_spec.rb +377 -38
- metadata +6 -3
@@ -7,33 +7,40 @@ describe GoCardlessPro::Services::PayoutsService do
|
|
7
7
|
)
|
8
8
|
end
|
9
9
|
|
10
|
+
let(:response_headers) { { 'Content-Type' => 'application/json' } }
|
11
|
+
|
10
12
|
describe '#list' do
|
11
13
|
describe 'with no filters' do
|
12
14
|
subject(:get_list_response) { client.payouts.list }
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
'payouts' => [{
|
16
|
+
let(:body) do
|
17
|
+
{
|
18
|
+
'payouts' => [{
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
20
|
+
'amount' => 'amount-input',
|
21
|
+
'arrival_date' => 'arrival_date-input',
|
22
|
+
'created_at' => 'created_at-input',
|
23
|
+
'currency' => 'currency-input',
|
24
|
+
'deducted_fees' => 'deducted_fees-input',
|
25
|
+
'id' => 'id-input',
|
26
|
+
'links' => 'links-input',
|
27
|
+
'payout_type' => 'payout_type-input',
|
28
|
+
'reference' => 'reference-input',
|
29
|
+
'status' => 'status-input'
|
30
|
+
}],
|
31
|
+
meta: {
|
32
|
+
cursors: {
|
33
|
+
before: nil,
|
34
|
+
after: 'ABC123'
|
34
35
|
}
|
35
|
-
}
|
36
|
-
|
36
|
+
}
|
37
|
+
}.to_json
|
38
|
+
end
|
39
|
+
|
40
|
+
before do
|
41
|
+
stub_request(:get, %r{.*api.gocardless.com/payouts}).to_return(
|
42
|
+
body: body,
|
43
|
+
headers: response_headers
|
37
44
|
)
|
38
45
|
end
|
39
46
|
|
@@ -52,6 +59,8 @@ describe GoCardlessPro::Services::PayoutsService do
|
|
52
59
|
|
53
60
|
expect(get_list_response.records.first.id).to eq('id-input')
|
54
61
|
|
62
|
+
expect(get_list_response.records.first.payout_type).to eq('payout_type-input')
|
63
|
+
|
55
64
|
expect(get_list_response.records.first.reference).to eq('reference-input')
|
56
65
|
|
57
66
|
expect(get_list_response.records.first.status).to eq('status-input')
|
@@ -63,6 +72,29 @@ describe GoCardlessPro::Services::PayoutsService do
|
|
63
72
|
end
|
64
73
|
|
65
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/payouts})
|
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/payouts})
|
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
|
66
98
|
end
|
67
99
|
end
|
68
100
|
|
@@ -79,6 +111,7 @@ describe GoCardlessPro::Services::PayoutsService do
|
|
79
111
|
'deducted_fees' => 'deducted_fees-input',
|
80
112
|
'id' => 'id-input',
|
81
113
|
'links' => 'links-input',
|
114
|
+
'payout_type' => 'payout_type-input',
|
82
115
|
'reference' => 'reference-input',
|
83
116
|
'status' => 'status-input'
|
84
117
|
}],
|
@@ -87,7 +120,7 @@ describe GoCardlessPro::Services::PayoutsService do
|
|
87
120
|
limit: 1
|
88
121
|
}
|
89
122
|
}.to_json,
|
90
|
-
headers:
|
123
|
+
headers: response_headers
|
91
124
|
)
|
92
125
|
end
|
93
126
|
|
@@ -103,6 +136,7 @@ describe GoCardlessPro::Services::PayoutsService do
|
|
103
136
|
'deducted_fees' => 'deducted_fees-input',
|
104
137
|
'id' => 'id-input',
|
105
138
|
'links' => 'links-input',
|
139
|
+
'payout_type' => 'payout_type-input',
|
106
140
|
'reference' => 'reference-input',
|
107
141
|
'status' => 'status-input'
|
108
142
|
}],
|
@@ -111,7 +145,7 @@ describe GoCardlessPro::Services::PayoutsService do
|
|
111
145
|
cursors: {}
|
112
146
|
}
|
113
147
|
}.to_json,
|
114
|
-
headers:
|
148
|
+
headers: response_headers
|
115
149
|
)
|
116
150
|
end
|
117
151
|
|
@@ -120,6 +154,123 @@ describe GoCardlessPro::Services::PayoutsService do
|
|
120
154
|
expect(first_response_stub).to have_been_requested
|
121
155
|
expect(second_response_stub).to have_been_requested
|
122
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/payouts$}).to_return(
|
163
|
+
body: {
|
164
|
+
'payouts' => [{
|
165
|
+
|
166
|
+
'amount' => 'amount-input',
|
167
|
+
'arrival_date' => 'arrival_date-input',
|
168
|
+
'created_at' => 'created_at-input',
|
169
|
+
'currency' => 'currency-input',
|
170
|
+
'deducted_fees' => 'deducted_fees-input',
|
171
|
+
'id' => 'id-input',
|
172
|
+
'links' => 'links-input',
|
173
|
+
'payout_type' => 'payout_type-input',
|
174
|
+
'reference' => 'reference-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/payouts\?after=AB345})
|
186
|
+
.to_timeout.then
|
187
|
+
.to_return(
|
188
|
+
body: {
|
189
|
+
'payouts' => [{
|
190
|
+
|
191
|
+
'amount' => 'amount-input',
|
192
|
+
'arrival_date' => 'arrival_date-input',
|
193
|
+
'created_at' => 'created_at-input',
|
194
|
+
'currency' => 'currency-input',
|
195
|
+
'deducted_fees' => 'deducted_fees-input',
|
196
|
+
'id' => 'id-input',
|
197
|
+
'links' => 'links-input',
|
198
|
+
'payout_type' => 'payout_type-input',
|
199
|
+
'reference' => 'reference-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.payouts.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/payouts$}).to_return(
|
218
|
+
body: {
|
219
|
+
'payouts' => [{
|
220
|
+
|
221
|
+
'amount' => 'amount-input',
|
222
|
+
'arrival_date' => 'arrival_date-input',
|
223
|
+
'created_at' => 'created_at-input',
|
224
|
+
'currency' => 'currency-input',
|
225
|
+
'deducted_fees' => 'deducted_fees-input',
|
226
|
+
'id' => 'id-input',
|
227
|
+
'links' => 'links-input',
|
228
|
+
'payout_type' => 'payout_type-input',
|
229
|
+
'reference' => 'reference-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/payouts\?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
|
+
'payouts' => [{
|
248
|
+
|
249
|
+
'amount' => 'amount-input',
|
250
|
+
'arrival_date' => 'arrival_date-input',
|
251
|
+
'created_at' => 'created_at-input',
|
252
|
+
'currency' => 'currency-input',
|
253
|
+
'deducted_fees' => 'deducted_fees-input',
|
254
|
+
'id' => 'id-input',
|
255
|
+
'links' => 'links-input',
|
256
|
+
'payout_type' => 'payout_type-input',
|
257
|
+
'reference' => 'reference-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.payouts.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
|
123
274
|
end
|
124
275
|
|
125
276
|
describe '#get' do
|
@@ -143,11 +294,12 @@ describe GoCardlessPro::Services::PayoutsService do
|
|
143
294
|
'deducted_fees' => 'deducted_fees-input',
|
144
295
|
'id' => 'id-input',
|
145
296
|
'links' => 'links-input',
|
297
|
+
'payout_type' => 'payout_type-input',
|
146
298
|
'reference' => 'reference-input',
|
147
299
|
'status' => 'status-input'
|
148
300
|
}
|
149
301
|
}.to_json,
|
150
|
-
headers:
|
302
|
+
headers: response_headers
|
151
303
|
)
|
152
304
|
end
|
153
305
|
|
@@ -177,11 +329,12 @@ describe GoCardlessPro::Services::PayoutsService do
|
|
177
329
|
'deducted_fees' => 'deducted_fees-input',
|
178
330
|
'id' => 'id-input',
|
179
331
|
'links' => 'links-input',
|
332
|
+
'payout_type' => 'payout_type-input',
|
180
333
|
'reference' => 'reference-input',
|
181
334
|
'status' => 'status-input'
|
182
335
|
}
|
183
336
|
}.to_json,
|
184
|
-
headers:
|
337
|
+
headers: response_headers
|
185
338
|
)
|
186
339
|
end
|
187
340
|
|
@@ -195,7 +348,7 @@ describe GoCardlessPro::Services::PayoutsService do
|
|
195
348
|
stub_url = '/payouts/:identity'.gsub(':identity', id)
|
196
349
|
stub_request(:get, /.*api.gocardless.com#{stub_url}/).to_return(
|
197
350
|
body: '',
|
198
|
-
headers:
|
351
|
+
headers: response_headers
|
199
352
|
)
|
200
353
|
end
|
201
354
|
|
@@ -211,5 +364,32 @@ describe GoCardlessPro::Services::PayoutsService do
|
|
211
364
|
expect { get_response }.to_not raise_error(/bad URI/)
|
212
365
|
end
|
213
366
|
end
|
367
|
+
|
368
|
+
describe 'retry behaviour' do
|
369
|
+
before { allow_any_instance_of(GoCardlessPro::Request).to receive(:sleep) }
|
370
|
+
|
371
|
+
it 'retries timeouts' do
|
372
|
+
stub_url = '/payouts/:identity'.gsub(':identity', id)
|
373
|
+
|
374
|
+
stub = stub_request(:get, /.*api.gocardless.com#{stub_url}/)
|
375
|
+
.to_timeout.then.to_return(status: 200, headers: response_headers)
|
376
|
+
|
377
|
+
get_response
|
378
|
+
expect(stub).to have_been_requested.twice
|
379
|
+
end
|
380
|
+
|
381
|
+
it 'retries 5XX errors' do
|
382
|
+
stub_url = '/payouts/:identity'.gsub(':identity', id)
|
383
|
+
|
384
|
+
stub = stub_request(:get, /.*api.gocardless.com#{stub_url}/)
|
385
|
+
.to_return(status: 502,
|
386
|
+
headers: { 'Content-Type' => 'text/html' },
|
387
|
+
body: '<html><body>Response from Cloudflare</body></html>')
|
388
|
+
.then.to_return(status: 200, headers: response_headers)
|
389
|
+
|
390
|
+
get_response
|
391
|
+
expect(stub).to have_been_requested.twice
|
392
|
+
end
|
393
|
+
end
|
214
394
|
end
|
215
395
|
end
|
@@ -7,6 +7,8 @@ describe GoCardlessPro::Services::RedirectFlowsService do
|
|
7
7
|
)
|
8
8
|
end
|
9
9
|
|
10
|
+
let(:response_headers) { { 'Content-Type' => 'application/json' } }
|
11
|
+
|
10
12
|
describe '#create' do
|
11
13
|
subject(:post_create_response) { client.redirect_flows.create(params: new_resource) }
|
12
14
|
context 'with a valid request' do
|
@@ -58,13 +60,36 @@ describe GoCardlessPro::Services::RedirectFlowsService do
|
|
58
60
|
}
|
59
61
|
|
60
62
|
}.to_json,
|
61
|
-
headers:
|
63
|
+
headers: response_headers
|
62
64
|
)
|
63
65
|
end
|
64
66
|
|
65
67
|
it 'creates and returns the resource' do
|
66
68
|
expect(post_create_response).to be_a(GoCardlessPro::Resources::RedirectFlow)
|
67
69
|
end
|
70
|
+
|
71
|
+
describe 'retry behaviour' do
|
72
|
+
before { allow_any_instance_of(GoCardlessPro::Request).to receive(:sleep) }
|
73
|
+
|
74
|
+
it 'retries timeouts' do
|
75
|
+
stub = stub_request(:post, %r{.*api.gocardless.com/redirect_flows})
|
76
|
+
.to_timeout.then.to_return(status: 200, headers: response_headers)
|
77
|
+
|
78
|
+
post_create_response
|
79
|
+
expect(stub).to have_been_requested.twice
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'retries 5XX errors' do
|
83
|
+
stub = stub_request(:post, %r{.*api.gocardless.com/redirect_flows})
|
84
|
+
.to_return(status: 502,
|
85
|
+
headers: { 'Content-Type' => 'text/html' },
|
86
|
+
body: '<html><body>Response from Cloudflare</body></html>')
|
87
|
+
.then.to_return(status: 200, headers: response_headers)
|
88
|
+
|
89
|
+
post_create_response
|
90
|
+
expect(stub).to have_been_requested.twice
|
91
|
+
end
|
92
|
+
end
|
68
93
|
end
|
69
94
|
|
70
95
|
context 'with a request that returns a validation error' do
|
@@ -81,7 +106,7 @@ describe GoCardlessPro::Services::RedirectFlowsService do
|
|
81
106
|
]
|
82
107
|
}
|
83
108
|
}.to_json,
|
84
|
-
headers:
|
109
|
+
headers: response_headers,
|
85
110
|
status: 422
|
86
111
|
)
|
87
112
|
end
|
@@ -90,6 +115,73 @@ describe GoCardlessPro::Services::RedirectFlowsService do
|
|
90
115
|
expect { post_create_response }.to raise_error(GoCardlessPro::ValidationError)
|
91
116
|
end
|
92
117
|
end
|
118
|
+
|
119
|
+
context 'with a request that returns an idempotent creation conflict error' do
|
120
|
+
let(:id) { 'ID123' }
|
121
|
+
|
122
|
+
let(:new_resource) do
|
123
|
+
{
|
124
|
+
|
125
|
+
'created_at' => 'created_at-input',
|
126
|
+
'description' => 'description-input',
|
127
|
+
'id' => 'id-input',
|
128
|
+
'links' => 'links-input',
|
129
|
+
'redirect_url' => 'redirect_url-input',
|
130
|
+
'scheme' => 'scheme-input',
|
131
|
+
'session_token' => 'session_token-input',
|
132
|
+
'success_redirect_url' => 'success_redirect_url-input'
|
133
|
+
}
|
134
|
+
end
|
135
|
+
|
136
|
+
let!(:post_stub) do
|
137
|
+
stub_request(:post, %r{.*api.gocardless.com/redirect_flows}).to_return(
|
138
|
+
body: {
|
139
|
+
error: {
|
140
|
+
type: 'invalid_state',
|
141
|
+
code: 409,
|
142
|
+
errors: [
|
143
|
+
{
|
144
|
+
message: 'A resource has already been created with this idempotency key',
|
145
|
+
reason: 'idempotent_creation_conflict',
|
146
|
+
links: {
|
147
|
+
conflicting_resource_id: id
|
148
|
+
}
|
149
|
+
}
|
150
|
+
]
|
151
|
+
}
|
152
|
+
}.to_json,
|
153
|
+
headers: response_headers,
|
154
|
+
status: 409
|
155
|
+
)
|
156
|
+
end
|
157
|
+
|
158
|
+
let!(:get_stub) do
|
159
|
+
stub_url = "/redirect_flows/#{id}"
|
160
|
+
stub_request(:get, /.*api.gocardless.com#{stub_url}/)
|
161
|
+
.to_return(
|
162
|
+
body: {
|
163
|
+
'redirect_flows' => {
|
164
|
+
|
165
|
+
'created_at' => 'created_at-input',
|
166
|
+
'description' => 'description-input',
|
167
|
+
'id' => 'id-input',
|
168
|
+
'links' => 'links-input',
|
169
|
+
'redirect_url' => 'redirect_url-input',
|
170
|
+
'scheme' => 'scheme-input',
|
171
|
+
'session_token' => 'session_token-input',
|
172
|
+
'success_redirect_url' => 'success_redirect_url-input'
|
173
|
+
}
|
174
|
+
}.to_json,
|
175
|
+
headers: response_headers
|
176
|
+
)
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'fetches the already-created resource' do
|
180
|
+
post_create_response
|
181
|
+
expect(post_stub).to have_been_requested
|
182
|
+
expect(get_stub).to have_been_requested
|
183
|
+
end
|
184
|
+
end
|
93
185
|
end
|
94
186
|
|
95
187
|
describe '#get' do
|
@@ -116,7 +208,7 @@ describe GoCardlessPro::Services::RedirectFlowsService do
|
|
116
208
|
'success_redirect_url' => 'success_redirect_url-input'
|
117
209
|
}
|
118
210
|
}.to_json,
|
119
|
-
headers:
|
211
|
+
headers: response_headers
|
120
212
|
)
|
121
213
|
end
|
122
214
|
|
@@ -149,7 +241,7 @@ describe GoCardlessPro::Services::RedirectFlowsService do
|
|
149
241
|
'success_redirect_url' => 'success_redirect_url-input'
|
150
242
|
}
|
151
243
|
}.to_json,
|
152
|
-
headers:
|
244
|
+
headers: response_headers
|
153
245
|
)
|
154
246
|
end
|
155
247
|
|
@@ -163,7 +255,7 @@ describe GoCardlessPro::Services::RedirectFlowsService do
|
|
163
255
|
stub_url = '/redirect_flows/:identity'.gsub(':identity', id)
|
164
256
|
stub_request(:get, /.*api.gocardless.com#{stub_url}/).to_return(
|
165
257
|
body: '',
|
166
|
-
headers:
|
258
|
+
headers: response_headers
|
167
259
|
)
|
168
260
|
end
|
169
261
|
|
@@ -179,6 +271,33 @@ describe GoCardlessPro::Services::RedirectFlowsService do
|
|
179
271
|
expect { get_response }.to_not raise_error(/bad URI/)
|
180
272
|
end
|
181
273
|
end
|
274
|
+
|
275
|
+
describe 'retry behaviour' do
|
276
|
+
before { allow_any_instance_of(GoCardlessPro::Request).to receive(:sleep) }
|
277
|
+
|
278
|
+
it 'retries timeouts' do
|
279
|
+
stub_url = '/redirect_flows/:identity'.gsub(':identity', id)
|
280
|
+
|
281
|
+
stub = stub_request(:get, /.*api.gocardless.com#{stub_url}/)
|
282
|
+
.to_timeout.then.to_return(status: 200, headers: response_headers)
|
283
|
+
|
284
|
+
get_response
|
285
|
+
expect(stub).to have_been_requested.twice
|
286
|
+
end
|
287
|
+
|
288
|
+
it 'retries 5XX errors' do
|
289
|
+
stub_url = '/redirect_flows/:identity'.gsub(':identity', id)
|
290
|
+
|
291
|
+
stub = stub_request(:get, /.*api.gocardless.com#{stub_url}/)
|
292
|
+
.to_return(status: 502,
|
293
|
+
headers: { 'Content-Type' => 'text/html' },
|
294
|
+
body: '<html><body>Response from Cloudflare</body></html>')
|
295
|
+
.then.to_return(status: 200, headers: response_headers)
|
296
|
+
|
297
|
+
get_response
|
298
|
+
expect(stub).to have_been_requested.twice
|
299
|
+
end
|
300
|
+
end
|
182
301
|
end
|
183
302
|
|
184
303
|
describe '#complete' do
|
@@ -203,7 +322,7 @@ describe GoCardlessPro::Services::RedirectFlowsService do
|
|
203
322
|
'success_redirect_url' => 'success_redirect_url-input'
|
204
323
|
}
|
205
324
|
}.to_json,
|
206
|
-
headers:
|
325
|
+
headers: response_headers
|
207
326
|
)
|
208
327
|
end
|
209
328
|
|
@@ -213,6 +332,17 @@ describe GoCardlessPro::Services::RedirectFlowsService do
|
|
213
332
|
expect(stub).to have_been_requested
|
214
333
|
end
|
215
334
|
|
335
|
+
describe 'retry behaviour' do
|
336
|
+
it "doesn't retry errors" do
|
337
|
+
stub_url = '/redirect_flows/:identity/actions/complete'.gsub(':identity', resource_id)
|
338
|
+
stub = stub_request(:post, /.*api.gocardless.com#{stub_url}/)
|
339
|
+
.to_timeout
|
340
|
+
|
341
|
+
expect { post_response }.to raise_error(Faraday::TimeoutError)
|
342
|
+
expect(stub).to have_been_requested
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
216
346
|
context 'when the request needs a body and custom header' do
|
217
347
|
let(:body) { { foo: 'bar' } }
|
218
348
|
let(:headers) { { 'Foo' => 'Bar' } }
|
@@ -241,7 +371,7 @@ describe GoCardlessPro::Services::RedirectFlowsService do
|
|
241
371
|
'success_redirect_url' => 'success_redirect_url-input'
|
242
372
|
}
|
243
373
|
}.to_json,
|
244
|
-
headers:
|
374
|
+
headers: response_headers
|
245
375
|
)
|
246
376
|
end
|
247
377
|
end
|