From 438784a1c1ed9d30a2e7ff9eee1682019a56e3a6 Mon Sep 17 00:00:00 2001 From: Dennis Wu Date: Mon, 30 Sep 2019 22:00:03 -0700 Subject: [PATCH] Add next_page_info and previous_page_info for Relative cursor based pagination across page loads --- lib/shopify_api/paginated_collection.rb | 12 +++++++++++ test/pagination_test.rb | 28 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/lib/shopify_api/paginated_collection.rb b/lib/shopify_api/paginated_collection.rb index 083f76d27..089f743e1 100644 --- a/lib/shopify_api/paginated_collection.rb +++ b/lib/shopify_api/paginated_collection.rb @@ -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') @@ -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 diff --git a/test/pagination_test.rb b/test/pagination_test.rb index b33be473c..acc5847e1 100644 --- a/test/pagination_test.rb +++ b/test/pagination_test.rb @@ -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 @@ -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