Ver Fonte

Merge pull request #625 from dnswus/master

Make relative cursor based pagination work across page loads
Katie Davis há 5 anos atrás
pai
commit
24d2640c04
2 ficheiros alterados com 40 adições e 0 exclusões
  1. 12 0
      lib/shopify_api/paginated_collection.rb
  2. 28 0
      test/pagination_test.rb

+ 12 - 0
lib/shopify_api/paginated_collection.rb

@@ -27,6 +27,14 @@ module ShopifyAPI
         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 @@ module ShopifyAPI
         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

+ 28 - 0
test/pagination_test.rb

@@ -97,6 +97,20 @@ class PaginationTest < Test::Unit::TestCase
     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 @@ class PaginationTest < Test::Unit::TestCase
     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