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