Skip to content
This repository has been archived by the owner on Jun 23, 2020. It is now read-only.

Commit

Permalink
added #next! #each_page and #reset!
Browse files Browse the repository at this point in the history
  • Loading branch information
oheyandy committed May 21, 2014
1 parent b084835 commit 3098be1
Show file tree
Hide file tree
Showing 8 changed files with 6,938 additions and 1 deletion.
34 changes: 33 additions & 1 deletion lib/desk_api/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ def build_self_link(link, params = {})
end

def initialize(client, definition = {}, loaded = false)
reset!
@_client, @_definition, @_loaded = client, definition, loaded
# better default
@_changed, @_embedded, @_links = {}, {}, {}
end

def create(params = {})
Expand Down Expand Up @@ -46,6 +46,33 @@ def find(id, options = {})
end
alias_method :by_id, :find

def next!
self.exec! unless @_loaded
next_page = @_definition['_links']['next']

if next_page
@_definition = self.class.build_self_link(next_page)
self.reset!
end

end

def all(&block)
raise ArgumentError, "Block must be given for #all" unless block_given?
each_page do |page|
page.entries.each { |resource| block.call(resource) }
end
end

def each_page
raise ArgumentError, "Block must be given for #each_page" unless block_given?
page = self.first.per_page(self.query_params['per_page'] || 1000)
begin
yield page, page.page
end while page.next!
end


def embed(*embedds)
# make sure we don't try to embed anything that's not defined
# add it to the query
Expand Down Expand Up @@ -139,6 +166,11 @@ def exec!(reload = false)
self
end

def reset!
@_links, @_embedded, @_changed, @_loaded = {}, {}, {}, false
self
end

private
attr_accessor :_client, :_loaded, :_changed, :_embedded, :_links, :_definition

Expand Down

Large diffs are not rendered by default.

1,953 changes: 1,953 additions & 0 deletions spec/cassettes/DeskApi_Resource/_each_page/iterates_over_each_page.yml

Large diffs are not rendered by default.

1,953 changes: 1,953 additions & 0 deletions spec/cassettes/DeskApi_Resource/_each_page/uses_a_default_per_page_of_1000.yml

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

71 changes: 71 additions & 0 deletions spec/desk_api/resource_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,77 @@
end
end

context '#next!' do
it 'changes @_definition to next page', :vcr do
page = subject.cases.first
next_page = page.next
page.
next!.
instance_variables.
count { |v| page.instance_variable_get(v) != next_page.instance_variable_get(v) }.
should eq(0)
end

it 'returns nil on the last page', :vcr do
subject.cases.last.next!.should eq(nil)
end

end

context '#each_page' do
it 'iterates over each page', :vcr do
subject.cases.each_page do |page, page_number|
page.should be_an_instance_of(DeskApi::Resource)
page.resource_type.should eq('page')
page_number.should be_an_instance_of(Fixnum)
end
end

it 'uses a default per_page of 1000', :vcr do
subject.cases.each_page do |page, page_number|
(page.query_params['per_page'].to_i % 10).should eq(0)
end
end

it 'uses per_page from query_params if present' do
subject.cases.per_page(25) do |page, page_number|
page.query_params['per_page'].should eq(25)
end
end

it 'raises an argument error if no block is given' do
expect { subject.cases.each_page }.to raise_error(ArgumentError)
end
end

context '#all' do
it 'iterates over each resource on each page', :vcr do
subject.cases.all do |resource|
resource.should be_an_instance_of(DeskApi::Resource)
resource.resource_type.should eq('case')
end
end

it 'raises an argument error if no block is given' do
expect { subject.cases.all }.to raise_error(ArgumentError)
end
end

context '#reset!' do
it 'sets @_links, @_embedded, @_changed, and @_loaded to default values', :vcr do
ticket = subject.cases.embed(:customer).entries.first

ticket.customer
ticket.message
ticket.send(:reset!)

ticket.instance_variable_get(:@_links).should eq({})
ticket.instance_variable_get(:@_embedded).should eq({})
ticket.instance_variable_get(:@_changed).should eq({})
ticket.instance_variable_get(:@_loaded).should eq(false)
end
end

describe 'prioritize links and embeds' do
before do
@company = subject.customers.entries.first.company
Expand Down

0 comments on commit 3098be1

Please sign in to comment.