Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make relative cursor based pagination work across page loads #625

Merged
merged 1 commit into from
Oct 22, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions lib/shopify_api/paginated_collection.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,14 @@ def fetch_previous_page
fetch_page(@previous_url)
end

def next_page_info
extract_page_info(@next_url)
end

def previous_page_info
extract_page_info(@previous_url)
end

private

AVAILABLE_IN_VERSION = ShopifyAPI::ApiVersion.find_version('2019-10')
Expand All @@ -50,6 +58,10 @@ def ensure_available
return if ShopifyAPI::Base.api_version >= AVAILABLE_IN_VERSION_EARLY && resource_class.early_july_pagination?
raise NotImplementedError
end

def extract_page_info(url)
CGI.escape(Rack::Utils.parse_query(URI(url).query)['page_info']) if url.present?
end
end

include CollectionPagination
Expand Down
28 changes: 28 additions & 0 deletions test/pagination_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,20 @@ def setup
refute orders.next_page?
end

test "#next_page_info returns next_page_info if next page is present" do
fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
orders = ShopifyAPI::Order.all

assert_equal @next_page_info, orders.next_page_info
end

test "#next_page_info returns nil if next page is not present" do
fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
orders = ShopifyAPI::Order.all

assert_nil orders.next_page_info
end

test "#previous_page? returns true if previous page is present" do
fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
orders = ShopifyAPI::Order.all
Expand All @@ -111,6 +125,20 @@ def setup
refute orders.previous_page?
end

test "#previous_page_info returns previous_page_info if next page is present" do
fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
orders = ShopifyAPI::Order.all

assert_equal @previous_page_info, orders.previous_page_info
end

test "#previous_page_info returns nil if next page is not present" do
fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
orders = ShopifyAPI::Order.all

assert_nil orders.previous_page_info
end

test "pagination handles no link headers" do
fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders')
orders = ShopifyAPI::Order.all
Expand Down