gocardless 1.9.0 → 1.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +1 -4
- data/lib/gocardless.rb +0 -1
- data/lib/gocardless/bill.rb +26 -14
- data/lib/gocardless/client.rb +16 -12
- data/lib/gocardless/merchant.rb +1 -0
- data/lib/gocardless/page.rb +43 -0
- data/lib/gocardless/paginator.rb +86 -0
- data/lib/gocardless/pre_authorization.rb +2 -2
- data/lib/gocardless/resource.rb +18 -12
- data/lib/gocardless/subscription.rb +1 -5
- data/lib/gocardless/user.rb +6 -1
- data/lib/gocardless/version.rb +1 -1
- data/spec/bill_spec.rb +23 -73
- data/spec/client_spec.rb +10 -10
- data/spec/page_spec.rb +93 -0
- data/spec/paginator_spec.rb +134 -0
- data/spec/pre_authorization_spec.rb +11 -48
- data/spec/resource_spec.rb +81 -105
- data/spec/spec_helper.rb +14 -1
- data/spec/subscription_spec.rb +11 -48
- data/spec/user_spec.rb +5 -7
- metadata +8 -3
- data/lib/gocardless/payment.rb +0 -9
data/spec/client_spec.rb
CHANGED
@@ -101,7 +101,7 @@ describe GoCardless::Client do
|
|
101
101
|
describe "with valid params" do
|
102
102
|
let(:oauth_client) { @client.instance_variable_get(:@oauth_client) }
|
103
103
|
let(:fake_token) do
|
104
|
-
|
104
|
+
double(:params => {'scope' => 'manage_merchant:x'}, :token => 'abc')
|
105
105
|
end
|
106
106
|
|
107
107
|
before { oauth_client.auth_code.stub(:get_token).and_return(fake_token) }
|
@@ -182,7 +182,7 @@ describe GoCardless::Client do
|
|
182
182
|
it "uses the correct path prefix" do
|
183
183
|
@client.access_token = 'TOKEN123'
|
184
184
|
token = @client.instance_variable_get(:@access_token)
|
185
|
-
r =
|
185
|
+
r = double
|
186
186
|
r.stub(:parsed)
|
187
187
|
token.should_receive(:get).with { |p,o| p =~ %r|/api/v1/test| }.and_return(r)
|
188
188
|
@client.api_get('/test')
|
@@ -197,7 +197,7 @@ describe GoCardless::Client do
|
|
197
197
|
it "encodes data to json" do
|
198
198
|
@client.access_token = 'TOKEN123'
|
199
199
|
token = @client.instance_variable_get(:@access_token)
|
200
|
-
r =
|
200
|
+
r = double
|
201
201
|
r.stub(:parsed)
|
202
202
|
token.should_receive(:post).with { |p,opts| opts[:body] == '{"a":1}' }.and_return(r)
|
203
203
|
@client.api_post('/test', {:a => 1})
|
@@ -212,7 +212,7 @@ describe GoCardless::Client do
|
|
212
212
|
it "encodes data to json" do
|
213
213
|
@client.access_token = 'TOKEN123'
|
214
214
|
token = @client.instance_variable_get(:@access_token)
|
215
|
-
r =
|
215
|
+
r = double
|
216
216
|
r.stub(:parsed)
|
217
217
|
token.should_receive(:delete).with { |p,opts| opts[:body] == '{"a":1}' }.and_return(r)
|
218
218
|
@client.api_delete('/test', {:a => 1})
|
@@ -227,7 +227,7 @@ describe GoCardless::Client do
|
|
227
227
|
it "looks up the correct merchant" do
|
228
228
|
@client.access_token = 'TOKEN'
|
229
229
|
@client.merchant_id = '123'
|
230
|
-
response =
|
230
|
+
response = double
|
231
231
|
response.should_receive(:parsed)
|
232
232
|
|
233
233
|
token = @client.instance_variable_get(:@access_token)
|
@@ -242,7 +242,7 @@ describe GoCardless::Client do
|
|
242
242
|
it "creates a Merchant object" do
|
243
243
|
@client.access_token = 'TOKEN'
|
244
244
|
@client.merchant_id = '123'
|
245
|
-
response =
|
245
|
+
response = double
|
246
246
|
response.should_receive(:parsed).and_return({:name => 'test', :id => 123})
|
247
247
|
|
248
248
|
token = @client.instance_variable_get(:@access_token)
|
@@ -255,7 +255,7 @@ describe GoCardless::Client do
|
|
255
255
|
end
|
256
256
|
end
|
257
257
|
|
258
|
-
%w
|
258
|
+
%w(subscription pre_authorization user bill).each do |resource|
|
259
259
|
describe "##{resource}" do
|
260
260
|
it "and_return the correct #{GoCardless::Utils.camelize(resource)} object" do
|
261
261
|
@client.access_token = 'TOKEN'
|
@@ -311,12 +311,12 @@ describe GoCardless::Client do
|
|
311
311
|
|
312
312
|
it "confirms the resource when the signature is valid" do
|
313
313
|
# Once for confirm, once to fetch result
|
314
|
-
@client.should_receive(:request).twice.and_return(
|
314
|
+
@client.should_receive(:request).twice.and_return(double(:parsed => {}))
|
315
315
|
@client.confirm_resource(@client.send(:sign_params, @params))
|
316
316
|
end
|
317
317
|
|
318
318
|
it "and_return the correct object when the signature is valid" do
|
319
|
-
@client.stub(:request).and_return(
|
319
|
+
@client.stub(:request).and_return(double(:parsed => {}))
|
320
320
|
subscription = GoCardless::Subscription.new_with_client @client
|
321
321
|
GoCardless::Subscription.should_receive(:find_with_client).and_return subscription
|
322
322
|
|
@@ -373,7 +373,7 @@ describe GoCardless::Client do
|
|
373
373
|
params_indifferent_access = HashWithIndifferentAccess.new(params)
|
374
374
|
expect do
|
375
375
|
@client.response_params_valid? params_indifferent_access
|
376
|
-
end.to_not raise_exception
|
376
|
+
end.to_not raise_exception
|
377
377
|
end
|
378
378
|
|
379
379
|
it "rejects other params not required for the signature" do
|
data/spec/page_spec.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'gocardless/page'
|
3
|
+
|
4
|
+
describe GoCardless::Page do
|
5
|
+
#let(:resource_class) { Class.new(GoCardless::Resource) { } }
|
6
|
+
let(:resource_class) { GoCardless::Resource }
|
7
|
+
let(:links) {{ "next" => 2, "last" => 2 }}
|
8
|
+
let(:data) {[ { :id => 'a' }, { :id => 'b' } ]}
|
9
|
+
|
10
|
+
let(:page) { GoCardless::Page.new(resource_class, data, links) }
|
11
|
+
|
12
|
+
describe "#has_next?" do
|
13
|
+
subject { page.has_next? }
|
14
|
+
|
15
|
+
context "when there is next page available" do
|
16
|
+
let(:links) {{ "next" => 2, "last" => 2 }}
|
17
|
+
it { should be_true }
|
18
|
+
end
|
19
|
+
|
20
|
+
context "when there is no next page" do
|
21
|
+
let(:links) {{ "previous" => 1, "first" => 1 }}
|
22
|
+
it { should be_false }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#next_page" do
|
27
|
+
subject { page.next_page }
|
28
|
+
|
29
|
+
context "when there is next page available" do
|
30
|
+
let(:links) {{ "next" => 2, "last" => 2 }}
|
31
|
+
it { should == 2 }
|
32
|
+
end
|
33
|
+
|
34
|
+
context "when there is no next page" do
|
35
|
+
let(:links) {{ "previous" => 1, "first" => 1 }}
|
36
|
+
it { should be_nil }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#previous_page" do
|
41
|
+
subject { page.previous_page }
|
42
|
+
|
43
|
+
context "when there is previous page available" do
|
44
|
+
let(:links) {{ "previous" => 1, "first" => 1 }}
|
45
|
+
it { should == 1 }
|
46
|
+
end
|
47
|
+
|
48
|
+
context "when there is no previous page" do
|
49
|
+
let(:links) {{ "next" => 2, "last" => 2 }}
|
50
|
+
it { should be_nil }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "#first_page" do
|
55
|
+
subject { page.first_page }
|
56
|
+
|
57
|
+
context "when there is first page available" do
|
58
|
+
let(:links) {{ "first" => 1, "previous" => 1 }}
|
59
|
+
it { should == 1 }
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when there is no first page" do
|
63
|
+
let(:links) {{ "next" => 2, "last" => 2 }}
|
64
|
+
it { should be_nil }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#last_page" do
|
69
|
+
subject { page.last_page }
|
70
|
+
|
71
|
+
context "when there is last page available" do
|
72
|
+
let(:links) {{ "next" => 2, "last" => 2 }}
|
73
|
+
it { should == 2 }
|
74
|
+
end
|
75
|
+
|
76
|
+
context "when there is no last page" do
|
77
|
+
let(:links) {{ "previous" => 1, "first" => 1 }}
|
78
|
+
it { should be_nil }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "#each" do
|
83
|
+
it "yields resource instances for each data item" do
|
84
|
+
resources = [a_kind_of(resource_class), a_kind_of(resource_class)]
|
85
|
+
expect { |b| page.each(&b) }.to yield_successive_args(*resources)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "properly initialises the resources" do
|
89
|
+
page.map(&:id).should == ['a', 'b']
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'gocardless/paginator'
|
3
|
+
|
4
|
+
describe GoCardless::Paginator do
|
5
|
+
let(:resource_class) { GoCardless::Resource }
|
6
|
+
let(:path) { '/test' }
|
7
|
+
let(:query) { { :status => 'active' } }
|
8
|
+
let(:per_page) { 10 }
|
9
|
+
let(:page_number) { 1 }
|
10
|
+
|
11
|
+
let(:headers_p1) {{
|
12
|
+
'X-Pagination' => '{"records":15,"pages":2,"links":{"next":2,"last":2}}'
|
13
|
+
}}
|
14
|
+
let(:response_p1) { double(:headers => headers_p1, :parsed => [{:id => 'a'}]) }
|
15
|
+
|
16
|
+
let(:headers_p2) {{
|
17
|
+
'X-Pagination' => '{"records":15,"pages":2,"links":{"previous":1,"first":1}}'
|
18
|
+
}}
|
19
|
+
let(:response_p2) { double(:headers => headers_p2, :parsed => [{:id => 'b'}]) }
|
20
|
+
|
21
|
+
let(:client) { double('client') }
|
22
|
+
before { client.stub(:api_request).and_return(response_p1, response_p2,
|
23
|
+
response_p1, response_p2) }
|
24
|
+
|
25
|
+
let(:paginator) { described_class.new(client, resource_class, path, query) }
|
26
|
+
before { paginator.per_page(per_page) }
|
27
|
+
|
28
|
+
describe "#per_page" do
|
29
|
+
context "given no arguments" do
|
30
|
+
subject { paginator.per_page }
|
31
|
+
it { should == per_page }
|
32
|
+
end
|
33
|
+
|
34
|
+
context "given an argument" do
|
35
|
+
it "is chainable" do
|
36
|
+
paginator.per_page(60).should == paginator
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it "resets pagination metadata" do
|
41
|
+
paginator.should_receive(:load_page).exactly(2).times
|
42
|
+
paginator.count # reset metadata, check that we have to reload it
|
43
|
+
paginator.per_page(50)
|
44
|
+
paginator.count
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#load_page" do
|
49
|
+
it "asks the client for the correct path" do
|
50
|
+
client.should_receive(:api_request).
|
51
|
+
with(:get, '/test', anything).
|
52
|
+
and_return(response_p1)
|
53
|
+
paginator.page(page_number)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "passes the correct pagination parameters through" do
|
57
|
+
pagination_params = { :page => page_number, :per_page => per_page }
|
58
|
+
client.should_receive(:api_request) do |_, _, opts|
|
59
|
+
opts[:params].should include pagination_params
|
60
|
+
end.and_return(response_p1)
|
61
|
+
paginator.page(page_number)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#each" do
|
66
|
+
it "yields every item from each page" do
|
67
|
+
resources = [a_kind_of(resource_class), a_kind_of(resource_class)]
|
68
|
+
expect { |b| paginator.each(&b) }.to yield_successive_args(*resources)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "#each_page" do
|
73
|
+
let(:pages) { [a_kind_of(GoCardless::Page), a_kind_of(GoCardless::Page)] }
|
74
|
+
|
75
|
+
it "yields each page until there are none left" do
|
76
|
+
expect { |b| paginator.each_page(&b) }.to yield_successive_args(*pages)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "can be iterated over multiple times" do
|
80
|
+
2.times do
|
81
|
+
expect { |b| paginator.each_page(&b) }.to yield_successive_args(*pages)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#count" do
|
87
|
+
subject { paginator.count }
|
88
|
+
|
89
|
+
context "when metadata is loaded" do
|
90
|
+
before { paginator.page(1) }
|
91
|
+
|
92
|
+
it { should == 15 }
|
93
|
+
|
94
|
+
it "doesn't reload metadata" do
|
95
|
+
paginator.should_not_receive(:load_page)
|
96
|
+
paginator.count
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "when metadata is not loaded" do
|
101
|
+
it { should == 15 }
|
102
|
+
|
103
|
+
it "loads metadata" do
|
104
|
+
paginator.should_receive(:load_page)
|
105
|
+
paginator.count
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "#page_count" do
|
111
|
+
subject { paginator.page_count }
|
112
|
+
|
113
|
+
context "when metadata is loaded" do
|
114
|
+
before { paginator.page(1) }
|
115
|
+
|
116
|
+
it { should == 2 }
|
117
|
+
|
118
|
+
it "doesn't reload metadata" do
|
119
|
+
paginator.should_not_receive(:load_page)
|
120
|
+
paginator.page_count
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context "when metadata is not loaded" do
|
125
|
+
it { should == 2 }
|
126
|
+
|
127
|
+
it "loads metadata" do
|
128
|
+
paginator.should_receive(:load_page)
|
129
|
+
paginator.page_count
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
@@ -1,57 +1,20 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe GoCardless::PreAuthorization do
|
4
|
-
before
|
5
|
-
|
6
|
-
|
7
|
-
GoCardless.account_details = {:app_id => @app_id, :app_secret => @app_secret,
|
8
|
-
:token => 'xxx', :merchant_id => '1'}
|
9
|
-
@client = GoCardless.client
|
4
|
+
before do
|
5
|
+
GoCardless.account_details = {:app_id => 'abc', :app_secret => 'xyz',
|
6
|
+
:token => 'xxx', :merchant_id => '123'}
|
10
7
|
end
|
8
|
+
let(:client) { GoCardless.client }
|
9
|
+
let(:preauth) { GoCardless::PreAuthorization.new(:id => '009988') }
|
11
10
|
|
12
11
|
it "should be cancellable" do
|
13
|
-
|
14
|
-
|
15
|
-
s.cancel!
|
12
|
+
client.should_receive(:api_put).with('/pre_authorizations/009988/cancel')
|
13
|
+
preauth.cancel!
|
16
14
|
end
|
17
15
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
it "and_return false otherwise" do
|
24
|
-
GoCardless::PreAuthorization.new.inactive?.should be_false
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe "active query method" do
|
29
|
-
it "and_return true when the subscription status is active" do
|
30
|
-
GoCardless::PreAuthorization.new(:status => 'active').active?.should be_true
|
31
|
-
end
|
32
|
-
|
33
|
-
it "and_return false otherwise" do
|
34
|
-
GoCardless::PreAuthorization.new.active?.should be_false
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe "cancelled query method" do
|
39
|
-
it "and_return true when the subscription status is cancelled" do
|
40
|
-
GoCardless::PreAuthorization.new(:status => 'cancelled').cancelled?.should be_true
|
41
|
-
end
|
42
|
-
|
43
|
-
it "and_return false otherwise" do
|
44
|
-
GoCardless::PreAuthorization.new.cancelled?.should be_false
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe "expired query method" do
|
49
|
-
it "and_return true when the subscription status is expired" do
|
50
|
-
GoCardless::PreAuthorization.new(:status => 'expired').expired?.should be_true
|
51
|
-
end
|
52
|
-
|
53
|
-
it "and_return false otherwise" do
|
54
|
-
GoCardless::PreAuthorization.new.expired?.should be_false
|
55
|
-
end
|
56
|
-
end
|
16
|
+
it_behaves_like "it has a query method for", "inactive"
|
17
|
+
it_behaves_like "it has a query method for", "active"
|
18
|
+
it_behaves_like "it has a query method for", "cancelled"
|
19
|
+
it_behaves_like "it has a query method for", "expired"
|
57
20
|
end
|
data/spec/resource_spec.rb
CHANGED
@@ -11,23 +11,18 @@ describe GoCardless::Resource do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
describe "#date_writer" do
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
14
|
+
let(:test_resource) do
|
15
|
+
Class.new(GoCardless::Resource) { date_writer :created_at, :modified_at }
|
16
|
+
end
|
18
17
|
|
19
|
-
|
20
|
-
test_resource.instance_methods.map(&:
|
18
|
+
describe "creates date writers" do
|
19
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :created_at= }
|
20
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :modified_at= }
|
21
21
|
end
|
22
22
|
|
23
23
|
it "date writers work properly" do
|
24
|
-
test_resource = Class.new(GoCardless::Resource) do
|
25
|
-
date_writer :created_at
|
26
|
-
end
|
27
|
-
|
28
|
-
resource = test_resource.new
|
29
24
|
time = '2011-12-12T12:00:00Z'
|
30
|
-
resource.created_at
|
25
|
+
resource = test_resource.new(:created_at => time)
|
31
26
|
date_time = resource.instance_variable_get(:@created_at)
|
32
27
|
date_time.should be_instance_of DateTime
|
33
28
|
date_time.strftime('%Y-%m-%dT%H:%M:%SZ').should == time
|
@@ -35,22 +30,18 @@ describe GoCardless::Resource do
|
|
35
30
|
end
|
36
31
|
|
37
32
|
describe "#date_accessor" do
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
33
|
+
let(:test_resource) do
|
34
|
+
Class.new(GoCardless::Resource) { date_accessor :created_at, :modified_at }
|
35
|
+
end
|
42
36
|
|
43
|
-
|
44
|
-
test_resource.instance_methods.map(&:
|
45
|
-
test_resource.instance_methods.map(&:
|
46
|
-
test_resource.instance_methods.map(&:
|
37
|
+
describe "creates date readers and writers" do
|
38
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :created_at= }
|
39
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :created_at }
|
40
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :modified_at= }
|
41
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :modified_at }
|
47
42
|
end
|
48
43
|
|
49
44
|
it "date readers work properly" do
|
50
|
-
test_resource = Class.new(GoCardless::Resource) do
|
51
|
-
date_accessor :created_at
|
52
|
-
end
|
53
|
-
|
54
45
|
resource = test_resource.new
|
55
46
|
date = DateTime.now
|
56
47
|
resource.instance_variable_set(:@created_at, date)
|
@@ -59,11 +50,12 @@ describe GoCardless::Resource do
|
|
59
50
|
end
|
60
51
|
|
61
52
|
describe ".find_with_client" do
|
53
|
+
let(:test_resource) do
|
54
|
+
Class.new(GoCardless::Resource) { self.endpoint = '/test/:id' }
|
55
|
+
end
|
56
|
+
|
62
57
|
it "instantiates the correct object" do
|
63
|
-
|
64
|
-
self.endpoint = '/test/:id'
|
65
|
-
end
|
66
|
-
mock_client = mock
|
58
|
+
mock_client = double
|
67
59
|
mock_client.should_receive(:api_get).and_return({:id => 123})
|
68
60
|
resource = test_resource.find_with_client(mock_client, 123)
|
69
61
|
resource.should be_a test_resource
|
@@ -72,41 +64,35 @@ describe GoCardless::Resource do
|
|
72
64
|
end
|
73
65
|
|
74
66
|
describe ".find" do
|
67
|
+
let(:test_resource) do
|
68
|
+
Class.new(GoCardless::Resource) { self.endpoint = '/test/:id' }
|
69
|
+
end
|
70
|
+
|
75
71
|
it "calls find with the default client" do
|
76
|
-
|
77
|
-
self.endpoint = '/test/:id'
|
78
|
-
end
|
79
|
-
GoCardless.stub(:client => mock)
|
72
|
+
GoCardless.stub(:client => double)
|
80
73
|
test_resource.should_receive(:find_with_client).with(GoCardless.client, 1)
|
81
74
|
test_resource.find(1)
|
82
75
|
unset_ivar GoCardless, :client
|
83
76
|
end
|
84
77
|
|
85
78
|
it "raises a helpful error when there is no default client" do
|
86
|
-
test_resource = Class.new(GoCardless::Resource) do
|
87
|
-
self.endpoint = '/test/:id'
|
88
|
-
end
|
89
79
|
expect { test_resource.find(1) }.to raise_error
|
90
80
|
end
|
91
81
|
end
|
92
82
|
|
93
83
|
describe "#reference_writer" do
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
end
|
84
|
+
let(:test_resource) do
|
85
|
+
Class.new(GoCardless::Resource) { reference_writer :merchant_id, :user_id }
|
86
|
+
end
|
98
87
|
|
99
|
-
|
100
|
-
test_resource.instance_methods.map(&:
|
101
|
-
test_resource.instance_methods.map(&:
|
102
|
-
test_resource.instance_methods.map(&:
|
88
|
+
describe "creates reference writers" do
|
89
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :merchant= }
|
90
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :merchant_id= }
|
91
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :user= }
|
92
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :user_id= }
|
103
93
|
end
|
104
94
|
|
105
95
|
it "direct assignment methods work properly" do
|
106
|
-
test_resource = Class.new(GoCardless::Resource) do
|
107
|
-
reference_writer :user_id
|
108
|
-
end
|
109
|
-
|
110
96
|
resource = test_resource.new
|
111
97
|
resource.user = GoCardless::User.new(:id => 123)
|
112
98
|
resource.instance_variable_get(:@user_id).should == 123
|
@@ -121,12 +107,7 @@ describe GoCardless::Resource do
|
|
121
107
|
end
|
122
108
|
|
123
109
|
it "fails with the wrong object type" do
|
124
|
-
test_resource =
|
125
|
-
reference_writer :user_id
|
126
|
-
end
|
127
|
-
expect do
|
128
|
-
test_resource.new.user = 'asdf'
|
129
|
-
end.to raise_exception ArgumentError
|
110
|
+
expect { test_resource.new.user = 'asdf' }.to raise_exception ArgumentError
|
130
111
|
end
|
131
112
|
end
|
132
113
|
|
@@ -138,22 +119,18 @@ describe GoCardless::Resource do
|
|
138
119
|
@redirect_uri = 'http://test.com/cb'
|
139
120
|
end
|
140
121
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
end
|
122
|
+
let(:test_resource) do
|
123
|
+
Class.new(GoCardless::Resource) { reference_reader :merchant_id, :user_id }
|
124
|
+
end
|
145
125
|
|
146
|
-
|
147
|
-
test_resource.instance_methods.map(&:
|
148
|
-
test_resource.instance_methods.map(&:
|
149
|
-
test_resource.instance_methods.map(&:
|
126
|
+
describe "creates reference readers" do
|
127
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :merchant }
|
128
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :merchant_id }
|
129
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :user }
|
130
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :user_id }
|
150
131
|
end
|
151
132
|
|
152
133
|
it "lookup methods work properly" do
|
153
|
-
test_resource = Class.new(GoCardless::Resource) do
|
154
|
-
reference_reader :user_id
|
155
|
-
end
|
156
|
-
|
157
134
|
resource = test_resource.new_with_client(@client)
|
158
135
|
resource.instance_variable_set(:@user_id, 123)
|
159
136
|
@client.access_token = 'TOKEN'
|
@@ -174,19 +151,21 @@ describe GoCardless::Resource do
|
|
174
151
|
end
|
175
152
|
|
176
153
|
describe "#reference_accessor" do
|
177
|
-
|
178
|
-
|
154
|
+
let(:test_resource) do
|
155
|
+
Class.new(GoCardless::Resource) do
|
179
156
|
reference_accessor :merchant_id, :user_id
|
180
157
|
end
|
158
|
+
end
|
181
159
|
|
182
|
-
|
183
|
-
test_resource.instance_methods.map(&:
|
184
|
-
test_resource.instance_methods.map(&:
|
185
|
-
test_resource.instance_methods.map(&:
|
186
|
-
test_resource.instance_methods.map(&:
|
187
|
-
test_resource.instance_methods.map(&:
|
188
|
-
test_resource.instance_methods.map(&:
|
189
|
-
test_resource.instance_methods.map(&:
|
160
|
+
describe "creates reference readers and writers" do
|
161
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :merchant }
|
162
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :merchant_id }
|
163
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :user }
|
164
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :user_id }
|
165
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :merchant= }
|
166
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :merchant_id= }
|
167
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :user= }
|
168
|
+
specify { test_resource.instance_methods.map(&:to_sym).should include :user_id= }
|
190
169
|
end
|
191
170
|
end
|
192
171
|
|
@@ -211,7 +190,7 @@ describe GoCardless::Resource do
|
|
211
190
|
end
|
212
191
|
|
213
192
|
it "sends the correct data parameters" do
|
214
|
-
client =
|
193
|
+
client = double
|
215
194
|
data = {:x => 1, :y => 2}
|
216
195
|
resource = @test_resource.new_with_client(client, data)
|
217
196
|
client.should_receive(:api_post).with(anything, data)
|
@@ -219,21 +198,21 @@ describe GoCardless::Resource do
|
|
219
198
|
end
|
220
199
|
|
221
200
|
it "sends the correct path" do
|
222
|
-
client =
|
201
|
+
client = double
|
223
202
|
resource = @test_resource.new_with_client(client)
|
224
203
|
client.should_receive(:api_post).with('/test', anything)
|
225
204
|
resource.save
|
226
205
|
end
|
227
206
|
|
228
207
|
it "POSTs when not persisted" do
|
229
|
-
client =
|
208
|
+
client = double
|
230
209
|
resource = @test_resource.new_with_client(client)
|
231
210
|
client.should_receive(:api_post)
|
232
211
|
resource.save
|
233
212
|
end
|
234
213
|
|
235
214
|
it "PUTs when already persisted" do
|
236
|
-
client =
|
215
|
+
client = double
|
237
216
|
resource = @test_resource.new_with_client(client, :id => 1)
|
238
217
|
client.should_receive(:api_put)
|
239
218
|
resource.save
|
@@ -283,7 +262,7 @@ describe GoCardless::Resource do
|
|
283
262
|
end
|
284
263
|
|
285
264
|
attrs = {:id => 1, :uri => 'http:', :x => 'y'}
|
286
|
-
resource = test_resource.new_with_client(
|
265
|
+
resource = test_resource.new_with_client(double, attrs)
|
287
266
|
resource.to_hash.should == attrs
|
288
267
|
end
|
289
268
|
|
@@ -334,9 +313,8 @@ describe GoCardless::Resource do
|
|
334
313
|
end
|
335
314
|
|
336
315
|
describe "sub_resource_uri methods" do
|
316
|
+
let(:test_resource) { Class.new(GoCardless::Resource) }
|
337
317
|
before :each do
|
338
|
-
@test_resource = Class.new(GoCardless::Resource) do
|
339
|
-
end
|
340
318
|
@attrs = {
|
341
319
|
'sub_resource_uris' => {
|
342
320
|
'bills' => 'https://test.com/api/bills/?merchant_id=1'
|
@@ -345,51 +323,52 @@ describe GoCardless::Resource do
|
|
345
323
|
end
|
346
324
|
|
347
325
|
it "are defined on instances" do
|
348
|
-
r =
|
326
|
+
r = test_resource.new(@attrs)
|
349
327
|
r.should respond_to :bills
|
350
328
|
end
|
351
329
|
|
352
330
|
it "aren't defined for other instances of the class" do
|
353
|
-
|
354
|
-
resource =
|
331
|
+
test_resource.new(@attrs)
|
332
|
+
resource = test_resource.new
|
355
333
|
resource.should_not respond_to :bills
|
356
334
|
end
|
357
335
|
|
358
336
|
it "use the correct uri path" do
|
359
|
-
|
360
|
-
|
361
|
-
r =
|
337
|
+
GoCardless::Paginator.should_receive(:new).
|
338
|
+
with(anything, anything, '/api/bills/', anything)
|
339
|
+
r = test_resource.new_with_client(double, @attrs)
|
362
340
|
r.bills
|
363
341
|
end
|
364
342
|
|
365
343
|
it "strips the api prefix from the path" do
|
366
|
-
|
367
|
-
|
344
|
+
GoCardless::Paginator.should_receive(:new).
|
345
|
+
with(anything, anything, '/bills/', anything)
|
368
346
|
uris = {'bills' => 'https://test.com/api/v123/bills/'}
|
369
|
-
r =
|
347
|
+
r = test_resource.new_with_client(double, 'sub_resource_uris' => uris)
|
370
348
|
r.bills
|
371
349
|
end
|
372
350
|
|
373
351
|
it "use the correct query string params" do
|
374
|
-
|
375
|
-
|
376
|
-
|
352
|
+
query = { 'merchant_id' => '1' }
|
353
|
+
GoCardless::Paginator.should_receive(:new).
|
354
|
+
with(anything, anything, anything, query)
|
355
|
+
r = test_resource.new_with_client(double, @attrs)
|
377
356
|
r.bills
|
378
357
|
end
|
379
358
|
|
380
359
|
it "adds provided params to existing query string params" do
|
381
|
-
client = mock()
|
382
360
|
params = { 'merchant_id' => '1', :amount => '10.00' }
|
383
|
-
|
384
|
-
|
361
|
+
GoCardless::Paginator.should_receive(:new).
|
362
|
+
with(anything, anything, anything, params)
|
363
|
+
r = test_resource.new_with_client(double, @attrs)
|
385
364
|
r.bills(:amount => '10.00')
|
386
365
|
end
|
387
366
|
|
388
367
|
it "adds provided params when there are no existing query string params" do
|
389
|
-
client = mock()
|
390
368
|
params = { :source_id => 'xxx' }
|
391
|
-
|
392
|
-
|
369
|
+
GoCardless::Paginator.should_receive(:new).
|
370
|
+
with(anything, anything, anything, params)
|
371
|
+
r = test_resource.new_with_client(double, {
|
393
372
|
'sub_resource_uris' => {
|
394
373
|
'bills' => 'https://test.com/merchants/1/bills'
|
395
374
|
}
|
@@ -398,11 +377,8 @@ describe GoCardless::Resource do
|
|
398
377
|
end
|
399
378
|
|
400
379
|
it "return instances of the correct resource class" do
|
401
|
-
|
402
|
-
r
|
403
|
-
ret = r.bills
|
404
|
-
ret.should be_a Array
|
405
|
-
ret.first.should be_a GoCardless::Bill
|
380
|
+
r = test_resource.new_with_client(double, @attrs)
|
381
|
+
r.bills.should be_a GoCardless::Paginator
|
406
382
|
end
|
407
383
|
end
|
408
384
|
end
|