Skip to content

Commit 6ed6f13

Browse files
committed
added tests for endless_pages
1 parent 9d01aa0 commit 6ed6f13

2 files changed

Lines changed: 97 additions & 51 deletions

File tree

lib/adcloud/endless_pages.rb

Lines changed: 54 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,68 @@
1-
module EndlessPages
2-
extend ActiveSupport::Concern
1+
module Adcloud
2+
module EndlessPages
3+
extend ActiveSupport::Concern
34

4-
module ClassMethods
5+
module ClassMethods
56

6-
def endless_pages(opts = {}, &block)
7-
@opts = opts
8-
perform(&block)
9-
end
7+
def endless_pages(opts = {}, &block)
8+
@opts = opts
9+
perform(&block)
10+
end
1011

11-
def conn
12-
@opts[:connection] ||= Adcloud::Connection.new
13-
end
12+
def conn
13+
@opts[:connection] ||= Adcloud::Connection.new
14+
end
1415

15-
def endpoint
16-
@opts[:endpoint_url] ||= self.endpoint_url
17-
raise "You must either pass endpoint_url into endless_pages OR define a class method .endpoint_url" unless @opts[:endpoint_url]
18-
@opts[:endpoint_url]
19-
end
16+
def endpoint
17+
@opts[:endpoint_url] ||= self.endpoint_url
18+
raise "You must either pass endpoint_url into endless_pages OR define a class method .endpoint_url" unless @opts[:endpoint_url]
19+
@opts[:endpoint_url]
20+
end
2021

21-
def params
22-
@opts[:params] ||= {}
23-
end
22+
def params
23+
@opts[:params] ||= {}
24+
end
2425

25-
def perform(&block)
26-
paged_items = []
26+
def perform(&block)
27+
paged_items = []
2728

28-
page = params[:page] ||= 1
29-
page = 1 if page == 0
29+
page = params[:page] ||= 1
30+
page = 1 if page == 0
3031

31-
total_pages = 1
32-
retry_count = 0
33-
page_result = params[:page_result] ||= []
32+
total_pages = 1
33+
retry_count = 0
34+
page_result = params[:page_result] ||= []
3435

35-
begin
36-
Adcloud::logger.debug "Page: #{page}"
36+
begin
37+
Adcloud::logger.debug "Page: #{page}"
3738

38-
params[:page] = page
39+
params[:page] = page
3940

40-
raw_result = conn.get(endpoint, params)
41-
total_pages = raw_result['_meta']['total_pages']
42-
Adcloud::logger.debug "total_pages: #{total_pages}"
43-
page_result = self.new(raw_result) # your service class needs to include Virtus
44-
# if a block is provided then start returning results right away
45-
page_result.items.each do |item|
46-
block.call(item)
47-
end if block
41+
raw_result = conn.get(endpoint, params)
42+
total_pages = raw_result['_meta']['total_pages'] || 0
43+
Adcloud::logger.debug "total_pages: #{total_pages}"
44+
page_result = self.new(raw_result) # your service class needs to include Virtus
45+
# if a block is provided then start returning results right away
46+
page_result.items.each do |item|
47+
block.call(item)
48+
end if block
4849

49-
paged_items += page_result.items
50-
page += 1
51-
rescue => ex
52-
if retry_count <= 5
53-
retry
54-
else
55-
Adcloud.logger.error { "API Exception #{ex}" }
56-
raise ApiError, "Connection failed"
57-
end
58-
retry_count += 1
59-
end while page <= total_pages
60-
Adcloud::logger.debug "Items: #{paged_items.length}"
61-
paged_items
62-
end
50+
paged_items += page_result.items
51+
page += 1
52+
rescue => ex
53+
Adcloud.logger.debug "Retry count: #{retry_count}"
54+
if retry_count == 5
55+
retry_count += 1
56+
retry
57+
else
58+
Adcloud.logger.error { "API Exception #{ex}" }
59+
raise StandardError, "Connection failed"
60+
end
61+
end while page <= total_pages
62+
Adcloud::logger.debug "Items: #{paged_items.length}"
63+
paged_items
64+
end
6365

66+
end
6467
end
65-
end
68+
end

test/adcloud/endless_pages_test.rb

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
require 'test_helper'
2+
3+
class DummyConnection
4+
def get(endpoint, params)
5+
{'_meta' => {'total_pages' => 3}, 'items' => [params[:page]]}
6+
end
7+
end
8+
9+
class Foo
10+
include Adcloud::EndlessPages
11+
include Virtus
12+
attribute :_meta, Hash
13+
attribute :items, Array
14+
15+
def self.endpoint_url
16+
""
17+
end
18+
end
19+
20+
describe Adcloud::EndlessPages do
21+
subject {
22+
Foo
23+
}
24+
it "raises an ApiError after 5 retries" do
25+
stub_request(:post, "https://api.adcloud.com/v2/oauth/access_token").
26+
with(:body => {"client_id"=>true, "client_secret"=>true, "grant_type"=>"none"},
27+
:headers => {'Accept'=>'*/*', 'Content-Type'=>'application/x-www-form-urlencoded', 'User-Agent'=>'Faraday v0.8.7'}).
28+
to_return(:status => 200, :body => "", :headers => {})
29+
proc {
30+
subject.endless_pages({})
31+
}.must_raise StandardError
32+
end
33+
34+
it "iterates through all pages" do
35+
result = subject.endless_pages({endpoint_url: "http://www.example.com", connection: DummyConnection.new})
36+
result.must_equal [1,2,3]
37+
end
38+
39+
it "gathers all results and returns a single collection" do
40+
result = subject.endless_pages({endpoint_url: "http://www.example.com", connection: DummyConnection.new})
41+
result.must_equal [1,2,3]
42+
end
43+
end

0 commit comments

Comments
 (0)