gocardless 1.9.0 → 1.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- stub(:params => {'scope' => 'manage_merchant:x'}, :token => 'abc')
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 = mock
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 = mock
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 = mock
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 = mock
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 = mock
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{subscription pre_authorization user bill payment}.each do |resource|
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(stub(:parsed => {}))
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(stub(:parsed => {}))
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 ArgumentError
376
+ end.to_not raise_exception
377
377
  end
378
378
 
379
379
  it "rejects other params not required for the signature" do
@@ -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 :each do
5
- @app_id = 'abc'
6
- @app_secret = 'xyz'
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
- s = GoCardless::PreAuthorization.new_with_client(@client, :id => '009988')
14
- @client.should_receive(:api_put).with('/pre_authorizations/009988/cancel')
15
- s.cancel!
12
+ client.should_receive(:api_put).with('/pre_authorizations/009988/cancel')
13
+ preauth.cancel!
16
14
  end
17
15
 
18
- describe "inactive query method" do
19
- it "and_return true when the subscription status is inactive" do
20
- GoCardless::PreAuthorization.new(:status => 'inactive').inactive?.should be_true
21
- end
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
@@ -11,23 +11,18 @@ describe GoCardless::Resource do
11
11
  end
12
12
 
13
13
  describe "#date_writer" do
14
- it "creates date writers properly" do
15
- test_resource = Class.new(GoCardless::Resource) do
16
- date_writer :created_at, :modified_at
17
- end
14
+ let(:test_resource) do
15
+ Class.new(GoCardless::Resource) { date_writer :created_at, :modified_at }
16
+ end
18
17
 
19
- test_resource.instance_methods.map(&:to_s).should include 'created_at='
20
- test_resource.instance_methods.map(&:to_s).should include 'modified_at='
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 = time
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
- it "creates date readers and writers properly" do
39
- test_resource = Class.new(GoCardless::Resource) do
40
- date_accessor :created_at, :modified_at
41
- end
33
+ let(:test_resource) do
34
+ Class.new(GoCardless::Resource) { date_accessor :created_at, :modified_at }
35
+ end
42
36
 
43
- test_resource.instance_methods.map(&:to_s).should include 'created_at='
44
- test_resource.instance_methods.map(&:to_s).should include 'created_at'
45
- test_resource.instance_methods.map(&:to_s).should include 'modified_at='
46
- test_resource.instance_methods.map(&:to_s).should include 'modified_at'
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
- test_resource = Class.new(GoCardless::Resource) do
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
- test_resource = Class.new(GoCardless::Resource) do
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
- it "creates reference writers properly" do
95
- test_resource = Class.new(GoCardless::Resource) do
96
- reference_writer :merchant_id, :user_id
97
- end
84
+ let(:test_resource) do
85
+ Class.new(GoCardless::Resource) { reference_writer :merchant_id, :user_id }
86
+ end
98
87
 
99
- test_resource.instance_methods.map(&:to_s).should include 'merchant='
100
- test_resource.instance_methods.map(&:to_s).should include 'merchant_id='
101
- test_resource.instance_methods.map(&:to_s).should include 'user='
102
- test_resource.instance_methods.map(&:to_s).should include 'user_id='
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 = Class.new(GoCardless::Resource) do
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
- it "creates reference writers properly" do
142
- test_resource = Class.new(GoCardless::Resource) do
143
- reference_reader :merchant_id, :user_id
144
- end
122
+ let(:test_resource) do
123
+ Class.new(GoCardless::Resource) { reference_reader :merchant_id, :user_id }
124
+ end
145
125
 
146
- test_resource.instance_methods.map(&:to_s).should include 'merchant'
147
- test_resource.instance_methods.map(&:to_s).should include 'merchant_id'
148
- test_resource.instance_methods.map(&:to_s).should include 'user'
149
- test_resource.instance_methods.map(&:to_s).should include 'user_id'
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
- it "creates reference readers and writers" do
178
- test_resource = Class.new(GoCardless::Resource) do
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
- test_resource.instance_methods.map(&:to_s).should include 'merchant'
183
- test_resource.instance_methods.map(&:to_s).should include 'merchant_id'
184
- test_resource.instance_methods.map(&:to_s).should include 'user'
185
- test_resource.instance_methods.map(&:to_s).should include 'user_id'
186
- test_resource.instance_methods.map(&:to_s).should include 'merchant='
187
- test_resource.instance_methods.map(&:to_s).should include 'merchant_id='
188
- test_resource.instance_methods.map(&:to_s).should include 'user='
189
- test_resource.instance_methods.map(&:to_s).should include 'user_id='
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 = mock
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 = mock
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 = mock
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 = mock
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(mock, attrs)
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 = @test_resource.new(@attrs)
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
- @test_resource.new(@attrs)
354
- resource = @test_resource.new
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
- client = mock()
360
- client.should_receive(:api_get).with('/api/bills/', anything).and_return([])
361
- r = @test_resource.new_with_client(client, @attrs)
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
- client = mock()
367
- client.should_receive(:api_get).with('/bills/', anything).and_return([])
344
+ GoCardless::Paginator.should_receive(:new).
345
+ with(anything, anything, '/bills/', anything)
368
346
  uris = {'bills' => 'https://test.com/api/v123/bills/'}
369
- r = @test_resource.new_with_client(client, 'sub_resource_uris' => uris)
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
- client = mock()
375
- client.should_receive(:api_get).with(anything, 'merchant_id' => '1').and_return([])
376
- r = @test_resource.new_with_client(client, @attrs)
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
- client.should_receive(:api_get).with(anything, params).and_return([])
384
- r = @test_resource.new_with_client(client, @attrs)
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
- client.should_receive(:api_get).with(anything, params).and_return([])
392
- r = @test_resource.new_with_client(client, {
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
- client = stub(:api_get => [{:id => 1}])
402
- r = @test_resource.new_with_client(client, @attrs)
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