gocardless_pro 0.3.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.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +2 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +146 -0
  6. data/circle.yml +3 -0
  7. data/demo.rb +9 -0
  8. data/gocardless_pro.gemspec +26 -0
  9. data/lib/gocardless_pro.rb +73 -0
  10. data/lib/gocardless_pro/api_service.rb +58 -0
  11. data/lib/gocardless_pro/client.rb +135 -0
  12. data/lib/gocardless_pro/error.rb +42 -0
  13. data/lib/gocardless_pro/error/gocardless_error.rb +5 -0
  14. data/lib/gocardless_pro/error/invalid_api_usage_error.rb +5 -0
  15. data/lib/gocardless_pro/error/invalid_state_error.rb +5 -0
  16. data/lib/gocardless_pro/error/validation_error.rb +5 -0
  17. data/lib/gocardless_pro/list_response.rb +29 -0
  18. data/lib/gocardless_pro/paginator.rb +43 -0
  19. data/lib/gocardless_pro/request.rb +69 -0
  20. data/lib/gocardless_pro/resources/creditor.rb +84 -0
  21. data/lib/gocardless_pro/resources/creditor_bank_account.rb +78 -0
  22. data/lib/gocardless_pro/resources/customer.rb +75 -0
  23. data/lib/gocardless_pro/resources/customer_bank_account.rb +80 -0
  24. data/lib/gocardless_pro/resources/event.rb +75 -0
  25. data/lib/gocardless_pro/resources/helper.rb +29 -0
  26. data/lib/gocardless_pro/resources/mandate.rb +70 -0
  27. data/lib/gocardless_pro/resources/payment.rb +87 -0
  28. data/lib/gocardless_pro/resources/payout.rb +66 -0
  29. data/lib/gocardless_pro/resources/redirect_flow.rb +106 -0
  30. data/lib/gocardless_pro/resources/refund.rb +71 -0
  31. data/lib/gocardless_pro/resources/subscription.rb +155 -0
  32. data/lib/gocardless_pro/response.rb +77 -0
  33. data/lib/gocardless_pro/services/base_service.rb +28 -0
  34. data/lib/gocardless_pro/services/creditor_bank_accounts_service.rb +119 -0
  35. data/lib/gocardless_pro/services/creditors_service.rb +113 -0
  36. data/lib/gocardless_pro/services/customer_bank_accounts_service.rb +154 -0
  37. data/lib/gocardless_pro/services/customers_service.rb +113 -0
  38. data/lib/gocardless_pro/services/events_service.rb +80 -0
  39. data/lib/gocardless_pro/services/helpers_service.rb +99 -0
  40. data/lib/gocardless_pro/services/mandates_service.rb +173 -0
  41. data/lib/gocardless_pro/services/payments_service.rb +168 -0
  42. data/lib/gocardless_pro/services/payouts_service.rb +82 -0
  43. data/lib/gocardless_pro/services/redirect_flows_service.rb +98 -0
  44. data/lib/gocardless_pro/services/refunds_service.rb +132 -0
  45. data/lib/gocardless_pro/services/subscriptions_service.rb +134 -0
  46. data/lib/gocardless_pro/version.rb +8 -0
  47. data/spec/api_service_spec.rb +73 -0
  48. data/spec/client_spec.rb +19 -0
  49. data/spec/error_spec.rb +44 -0
  50. data/spec/resources/creditor_bank_account_spec.rb +109 -0
  51. data/spec/resources/creditor_spec.rb +125 -0
  52. data/spec/resources/customer_bank_account_spec.rb +109 -0
  53. data/spec/resources/customer_spec.rb +135 -0
  54. data/spec/resources/event_spec.rb +113 -0
  55. data/spec/resources/helper_spec.rb +23 -0
  56. data/spec/resources/mandate_spec.rb +97 -0
  57. data/spec/resources/payment_spec.rb +129 -0
  58. data/spec/resources/payout_spec.rb +89 -0
  59. data/spec/resources/redirect_flow_spec.rb +97 -0
  60. data/spec/resources/refund_spec.rb +77 -0
  61. data/spec/resources/subscription_spec.rb +165 -0
  62. data/spec/response_spec.rb +89 -0
  63. data/spec/services/creditor_bank_accounts_service_spec.rb +413 -0
  64. data/spec/services/creditors_service_spec.rb +388 -0
  65. data/spec/services/customer_bank_accounts_service_spec.rb +452 -0
  66. data/spec/services/customers_service_spec.rb +429 -0
  67. data/spec/services/events_service_spec.rb +217 -0
  68. data/spec/services/helpers_service_spec.rb +122 -0
  69. data/spec/services/mandates_service_spec.rb +495 -0
  70. data/spec/services/payments_service_spec.rb +546 -0
  71. data/spec/services/payouts_service_spec.rb +217 -0
  72. data/spec/services/redirect_flows_service_spec.rb +254 -0
  73. data/spec/services/refunds_service_spec.rb +323 -0
  74. data/spec/services/subscriptions_service_spec.rb +557 -0
  75. data/spec/spec_helper.rb +91 -0
  76. metadata +224 -0
@@ -0,0 +1,217 @@
1
+ require 'spec_helper'
2
+
3
+ describe GoCardlessPro::Services::PayoutsService do
4
+ let(:client) do
5
+ GoCardlessPro::Client.new(
6
+ access_token: "SECRET_TOKEN"
7
+ )
8
+ end
9
+
10
+
11
+
12
+
13
+
14
+
15
+ describe "#list" do
16
+ describe "with no filters" do
17
+ subject(:get_list_response) { client.payouts.list }
18
+
19
+ before do
20
+ stub_request(:get, /.*api.gocardless.com\/payouts/).to_return(
21
+ body: {
22
+ payouts: [{
23
+
24
+ "amount" => "amount-input",
25
+ "created_at" => "created_at-input",
26
+ "currency" => "currency-input",
27
+ "id" => "id-input",
28
+ "links" => "links-input",
29
+ "reference" => "reference-input",
30
+ "status" => "status-input",
31
+ }],
32
+ meta: {
33
+ cursors: {
34
+ before: nil,
35
+ after: "ABC123"
36
+ }
37
+ }
38
+ }.to_json,
39
+ :headers => {'Content-Type' => 'application/json'}
40
+ )
41
+ end
42
+
43
+ it "wraps each item in the resource class" do
44
+ expect(get_list_response.records.map { |x| x.class }.uniq.first).to eq(GoCardlessPro::Resources::Payout)
45
+
46
+
47
+
48
+ expect(get_list_response.records.first.amount).to eq("amount-input")
49
+
50
+
51
+
52
+ expect(get_list_response.records.first.created_at).to eq("created_at-input")
53
+
54
+
55
+
56
+ expect(get_list_response.records.first.currency).to eq("currency-input")
57
+
58
+
59
+
60
+ expect(get_list_response.records.first.id).to eq("id-input")
61
+
62
+
63
+
64
+
65
+
66
+ expect(get_list_response.records.first.reference).to eq("reference-input")
67
+
68
+
69
+
70
+ expect(get_list_response.records.first.status).to eq("status-input")
71
+
72
+
73
+ end
74
+
75
+ it "exposes the cursors for before and after" do
76
+ expect(get_list_response.before).to eq(nil)
77
+ expect(get_list_response.after).to eq("ABC123")
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "#all" do
83
+ let!(:first_response_stub) do
84
+ stub_request(:get, /.*api.gocardless.com\/payouts$/).to_return(
85
+ body: {
86
+ payouts: [{
87
+
88
+ "amount" => "amount-input",
89
+ "created_at" => "created_at-input",
90
+ "currency" => "currency-input",
91
+ "id" => "id-input",
92
+ "links" => "links-input",
93
+ "reference" => "reference-input",
94
+ "status" => "status-input",
95
+ }],
96
+ meta: {
97
+ cursors: { after: 'AB345' },
98
+ limit: 1
99
+ }
100
+ }.to_json,
101
+ :headers => {'Content-Type' => 'application/json'}
102
+ )
103
+ end
104
+
105
+ let!(:second_response_stub) do
106
+ stub_request(:get, /.*api.gocardless.com\/payouts\?after=AB345/).to_return(
107
+ body: {
108
+ payouts: [{
109
+
110
+ "amount" => "amount-input",
111
+ "created_at" => "created_at-input",
112
+ "currency" => "currency-input",
113
+ "id" => "id-input",
114
+ "links" => "links-input",
115
+ "reference" => "reference-input",
116
+ "status" => "status-input",
117
+ }],
118
+ meta: {
119
+ limit: 2,
120
+ cursors: {}
121
+ }
122
+ }.to_json,
123
+ :headers => {'Content-Type' => 'application/json'}
124
+ )
125
+ end
126
+
127
+ it "automatically makes the extra requests" do
128
+ expect(client.payouts.all.to_a.length).to eq(2)
129
+ expect(first_response_stub).to have_been_requested
130
+ expect(second_response_stub).to have_been_requested
131
+ end
132
+ end
133
+
134
+
135
+
136
+
137
+
138
+
139
+ describe "#get" do
140
+ let(:id) { "ID123" }
141
+
142
+ subject(:get_response) { client.payouts.get(id) }
143
+
144
+ context "passing in a custom header" do
145
+ let!(:stub) do
146
+ stub_request(:get, /.*api.gocardless.com\/payouts\/ID123/)
147
+ .with(headers: { 'Foo' => 'Bar' })
148
+ .to_return(
149
+ body: {
150
+ payouts: {
151
+
152
+ "amount" => "amount-input",
153
+ "created_at" => "created_at-input",
154
+ "currency" => "currency-input",
155
+ "id" => "id-input",
156
+ "links" => "links-input",
157
+ "reference" => "reference-input",
158
+ "status" => "status-input",
159
+ }
160
+ }.to_json,
161
+ :headers => {'Content-Type' => 'application/json'}
162
+ )
163
+ end
164
+
165
+ subject(:get_response) do
166
+ client.payouts.get(id, headers: {
167
+ 'Foo' => 'Bar'
168
+ })
169
+ end
170
+
171
+ it "includes the header" do
172
+ get_response
173
+ expect(stub).to have_been_requested
174
+ end
175
+ end
176
+
177
+ context "when there is a payout to return" do
178
+ before do
179
+ stub_request(:get, /.*api.gocardless.com\/payouts\/ID123/).to_return(
180
+ body: {
181
+ payouts: {
182
+
183
+ "amount" => "amount-input",
184
+ "created_at" => "created_at-input",
185
+ "currency" => "currency-input",
186
+ "id" => "id-input",
187
+ "links" => "links-input",
188
+ "reference" => "reference-input",
189
+ "status" => "status-input",
190
+ }
191
+ }.to_json,
192
+ :headers => {'Content-Type' => 'application/json'}
193
+ )
194
+ end
195
+
196
+ it "wraps the response in a resource" do
197
+ expect(get_response).to be_a(GoCardlessPro::Resources::Payout)
198
+ end
199
+ end
200
+
201
+ context "when nothing is returned" do
202
+ before do
203
+ stub_request(:get, /.*api.gocardless.com\/payouts\/ID123/).to_return(
204
+ body: "",
205
+ headers: { 'Content-Type' => 'application/json' }
206
+ )
207
+ end
208
+
209
+ it "returns nil" do
210
+ expect(get_response).to be_nil
211
+ end
212
+ end
213
+ end
214
+
215
+
216
+
217
+ end
@@ -0,0 +1,254 @@
1
+ require 'spec_helper'
2
+
3
+ describe GoCardlessPro::Services::RedirectFlowsService do
4
+ let(:client) do
5
+ GoCardlessPro::Client.new(
6
+ access_token: "SECRET_TOKEN"
7
+ )
8
+ end
9
+
10
+
11
+
12
+
13
+
14
+
15
+ describe "#create" do
16
+ subject(:post_create_response) { client.redirect_flows.create(params: new_resource) }
17
+ context "with a valid request" do
18
+ let(:new_resource) do
19
+ {
20
+
21
+ "created_at" => "created_at-input",
22
+ "description" => "description-input",
23
+ "id" => "id-input",
24
+ "links" => "links-input",
25
+ "redirect_url" => "redirect_url-input",
26
+ "scheme" => "scheme-input",
27
+ "session_token" => "session_token-input",
28
+ "success_redirect_url" => "success_redirect_url-input",
29
+ }
30
+ end
31
+
32
+ before do
33
+ stub_request(:post, /.*api.gocardless.com\/redirect_flows/).
34
+ with(
35
+ body: {
36
+ redirect_flows: {
37
+
38
+ "created_at" => "created_at-input",
39
+ "description" => "description-input",
40
+ "id" => "id-input",
41
+ "links" => "links-input",
42
+ "redirect_url" => "redirect_url-input",
43
+ "scheme" => "scheme-input",
44
+ "session_token" => "session_token-input",
45
+ "success_redirect_url" => "success_redirect_url-input",
46
+ }
47
+ }
48
+ ).
49
+ to_return(
50
+ body: {
51
+ redirect_flows: {
52
+
53
+ "created_at" => "created_at-input",
54
+ "description" => "description-input",
55
+ "id" => "id-input",
56
+ "links" => "links-input",
57
+ "redirect_url" => "redirect_url-input",
58
+ "scheme" => "scheme-input",
59
+ "session_token" => "session_token-input",
60
+ "success_redirect_url" => "success_redirect_url-input",
61
+ }
62
+ }.to_json,
63
+ :headers => {'Content-Type' => 'application/json'}
64
+ )
65
+ end
66
+
67
+ it "creates and returns the resource" do
68
+ expect(post_create_response).to be_a(GoCardlessPro::Resources::RedirectFlow)
69
+ end
70
+ end
71
+
72
+ context "with a request that returns a validation error" do
73
+ let(:new_resource) { {} }
74
+
75
+ before do
76
+ stub_request(:post, /.*api.gocardless.com\/redirect_flows/).to_return(
77
+ body: {
78
+ error: {
79
+ type: 'validation_failed',
80
+ code: 422,
81
+ errors: [
82
+ { message: 'test error message', field: 'test_field' }
83
+ ]
84
+ }
85
+ }.to_json,
86
+ headers: {'Content-Type' => 'application/json'},
87
+ status: 422
88
+ )
89
+ end
90
+
91
+ it "throws the correct error" do
92
+ expect { post_create_response }.to raise_error(GoCardlessPro::ValidationError)
93
+ end
94
+ end
95
+ end
96
+
97
+
98
+
99
+
100
+
101
+ describe "#get" do
102
+ let(:id) { "ID123" }
103
+
104
+ subject(:get_response) { client.redirect_flows.get(id) }
105
+
106
+ context "passing in a custom header" do
107
+ let!(:stub) do
108
+ stub_request(:get, /.*api.gocardless.com\/redirect_flows\/ID123/)
109
+ .with(headers: { 'Foo' => 'Bar' })
110
+ .to_return(
111
+ body: {
112
+ redirect_flows: {
113
+
114
+ "created_at" => "created_at-input",
115
+ "description" => "description-input",
116
+ "id" => "id-input",
117
+ "links" => "links-input",
118
+ "redirect_url" => "redirect_url-input",
119
+ "scheme" => "scheme-input",
120
+ "session_token" => "session_token-input",
121
+ "success_redirect_url" => "success_redirect_url-input",
122
+ }
123
+ }.to_json,
124
+ :headers => {'Content-Type' => 'application/json'}
125
+ )
126
+ end
127
+
128
+ subject(:get_response) do
129
+ client.redirect_flows.get(id, headers: {
130
+ 'Foo' => 'Bar'
131
+ })
132
+ end
133
+
134
+ it "includes the header" do
135
+ get_response
136
+ expect(stub).to have_been_requested
137
+ end
138
+ end
139
+
140
+ context "when there is a redirect_flow to return" do
141
+ before do
142
+ stub_request(:get, /.*api.gocardless.com\/redirect_flows\/ID123/).to_return(
143
+ body: {
144
+ redirect_flows: {
145
+
146
+ "created_at" => "created_at-input",
147
+ "description" => "description-input",
148
+ "id" => "id-input",
149
+ "links" => "links-input",
150
+ "redirect_url" => "redirect_url-input",
151
+ "scheme" => "scheme-input",
152
+ "session_token" => "session_token-input",
153
+ "success_redirect_url" => "success_redirect_url-input",
154
+ }
155
+ }.to_json,
156
+ :headers => {'Content-Type' => 'application/json'}
157
+ )
158
+ end
159
+
160
+ it "wraps the response in a resource" do
161
+ expect(get_response).to be_a(GoCardlessPro::Resources::RedirectFlow)
162
+ end
163
+ end
164
+
165
+ context "when nothing is returned" do
166
+ before do
167
+ stub_request(:get, /.*api.gocardless.com\/redirect_flows\/ID123/).to_return(
168
+ body: "",
169
+ headers: { 'Content-Type' => 'application/json' }
170
+ )
171
+ end
172
+
173
+ it "returns nil" do
174
+ expect(get_response).to be_nil
175
+ end
176
+ end
177
+ end
178
+
179
+
180
+
181
+
182
+
183
+
184
+ describe "#complete" do
185
+
186
+
187
+ subject(:post_response) { client.redirect_flows.complete(resource_id) }
188
+
189
+ let(:resource_id) { "ABC123" }
190
+
191
+ let!(:stub) do
192
+ # /redirect_flows/%v/actions/complete
193
+ stub_url = "/redirect_flows/:identity/actions/complete".gsub(':identity', resource_id)
194
+ stub_request(:post, /.*api.gocardless.com#{stub_url}/).to_return(
195
+ body: {
196
+ redirect_flows: {
197
+
198
+ "created_at" => "created_at-input",
199
+ "description" => "description-input",
200
+ "id" => "id-input",
201
+ "links" => "links-input",
202
+ "redirect_url" => "redirect_url-input",
203
+ "scheme" => "scheme-input",
204
+ "session_token" => "session_token-input",
205
+ "success_redirect_url" => "success_redirect_url-input",
206
+ }
207
+ }.to_json,
208
+ headers: {'Content-Type' => 'application/json'},
209
+ )
210
+ end
211
+
212
+ it "wraps the response and calls the right endpoint" do
213
+ expect(post_response).to be_a(GoCardlessPro::Resources::RedirectFlow)
214
+
215
+ expect(stub).to have_been_requested
216
+ end
217
+
218
+ context "when the request needs a body and custom header" do
219
+
220
+ let(:body) { { foo: 'bar' } }
221
+ let(:headers) { { 'Foo' => 'Bar' } }
222
+ subject(:post_response) { client.redirect_flows.complete(resource_id, body, headers) }
223
+
224
+ let(:resource_id) { "ABC123" }
225
+
226
+ let!(:stub) do
227
+ # /redirect_flows/%v/actions/complete
228
+ stub_url = "/redirect_flows/:identity/actions/complete".gsub(':identity', resource_id)
229
+ stub_request(:post, /.*api.gocardless.com#{stub_url}/).
230
+ with(
231
+ body: { foo: 'bar' },
232
+ headers: { 'Foo' => 'Bar' }
233
+ ).to_return(
234
+ body: {
235
+ redirect_flows: {
236
+
237
+ "created_at" => "created_at-input",
238
+ "description" => "description-input",
239
+ "id" => "id-input",
240
+ "links" => "links-input",
241
+ "redirect_url" => "redirect_url-input",
242
+ "scheme" => "scheme-input",
243
+ "session_token" => "session_token-input",
244
+ "success_redirect_url" => "success_redirect_url-input",
245
+ }
246
+ }.to_json,
247
+ headers: {'Content-Type' => 'application/json'},
248
+ )
249
+ end
250
+ end
251
+ end
252
+
253
+
254
+ end