|
@@ -0,0 +1,183 @@
|
|
|
+require 'test_helper'
|
|
|
+
|
|
|
+class PaginationTest < Test::Unit::TestCase
|
|
|
+ def setup
|
|
|
+ super
|
|
|
+
|
|
|
+ @version = ShopifyAPI::ApiVersion::Unstable.new
|
|
|
+ ShopifyAPI::Base.api_version = @version.to_s
|
|
|
+ @next_page_info = "eyJkaXJlY3Rpb24iOiJuZXh0IiwibGFzdF9pZCI6NDQwMDg5NDIzLCJsYXN0X3ZhbHVlIjoiNDQwMDg5NDIzIn0%3D"
|
|
|
+ @previous_page_info = "eyJsYXN0X2lkIjoxMDg4MjgzMDksImxhc3RfdmFsdWUiOiIxMDg4MjgzMDkiLCJkaXJlY3Rpb24iOiJuZXh0In0%3D"
|
|
|
+
|
|
|
+ @next_link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@next_page_info}>; rel=\"next\""
|
|
|
+ @previous_link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@previous_page_info}>; rel=\"previous\""
|
|
|
+ end
|
|
|
+
|
|
|
+ test "navigates using next and previous link headers with no original params" do
|
|
|
+ link_header ="#{@previous_link_header}, #{@next_link_header}"
|
|
|
+
|
|
|
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => link_header
|
|
|
+ orders = ShopifyAPI::Order.all
|
|
|
+
|
|
|
+ fake(
|
|
|
+ 'orders',
|
|
|
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@next_page_info}",
|
|
|
+ method: :get,
|
|
|
+ status: 200,
|
|
|
+ body: load_fixture('orders')
|
|
|
+ )
|
|
|
+ next_page = orders.fetch_next_page
|
|
|
+ assert_equal 450789469, next_page.first.id
|
|
|
+
|
|
|
+ fake(
|
|
|
+ 'orders',
|
|
|
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@previous_page_info}",
|
|
|
+ method: :get,
|
|
|
+ status: 200,
|
|
|
+ body: load_fixture('orders').gsub("450789469", "1122334455")
|
|
|
+ )
|
|
|
+
|
|
|
+ previous_page = orders.fetch_previous_page
|
|
|
+ assert_equal 1122334455, previous_page.first.id
|
|
|
+ end
|
|
|
+
|
|
|
+ test "uses all passed in querystring parameters" do
|
|
|
+ params = "page_info=#{@next_page_info}&limit=50&fields=#{CGI.escape('id,created_at')}"
|
|
|
+ @next_link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?#{params}>; rel=\"next\""
|
|
|
+ fake(
|
|
|
+ 'orders',
|
|
|
+ method: :get,
|
|
|
+ status: 200,
|
|
|
+ api_version: @version,
|
|
|
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?fields=id%2Cupdated_at&limit=100",
|
|
|
+ body: load_fixture('orders'),
|
|
|
+ link: @next_link_header
|
|
|
+ )
|
|
|
+ orders = ShopifyAPI::Order.where(fields: 'id,updated_at', limit: 100)
|
|
|
+
|
|
|
+ fake(
|
|
|
+ 'orders',
|
|
|
+ method: :get,
|
|
|
+ status: 200,
|
|
|
+ api_version: @version,
|
|
|
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?fields=id%2Ccreated_at&limit=50&page_info=#{@next_page_info}",
|
|
|
+ body: load_fixture('orders')
|
|
|
+ )
|
|
|
+ next_page = orders.fetch_next_page
|
|
|
+ assert_equal 450789469, next_page.first.id
|
|
|
+ end
|
|
|
+
|
|
|
+ test "returns empty next page if just the 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
|
|
|
+
|
|
|
+ next_page = orders.fetch_next_page
|
|
|
+ assert_empty next_page
|
|
|
+ end
|
|
|
+
|
|
|
+ test "returns an empty previous page if just the 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
|
|
|
+
|
|
|
+ next_page = orders.fetch_previous_page
|
|
|
+ assert_empty next_page
|
|
|
+ end
|
|
|
+
|
|
|
+ test "#next_page? returns true 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 orders.next_page?
|
|
|
+ end
|
|
|
+
|
|
|
+ test "#next_page? returns false 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
|
|
|
+
|
|
|
+ refute orders.next_page?
|
|
|
+ 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
|
|
|
+
|
|
|
+ assert orders.previous_page?
|
|
|
+ end
|
|
|
+
|
|
|
+ test "#previous_page? returns false 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
|
|
|
+
|
|
|
+ refute orders.previous_page?
|
|
|
+ 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
|
|
|
+
|
|
|
+ refute orders.next_page?
|
|
|
+ refute orders.previous_page?
|
|
|
+ assert_empty orders.fetch_next_page
|
|
|
+ assert_empty orders.fetch_previous_page
|
|
|
+ end
|
|
|
+
|
|
|
+ test "raises on invalid pagination links" do
|
|
|
+ link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@next_page_info}>;"
|
|
|
+ fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => link_header
|
|
|
+
|
|
|
+ assert_raises ShopifyAPI::InvalidPaginationLinksError do
|
|
|
+ ShopifyAPI::Order.all
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ test "raises on an invalid API version" do
|
|
|
+ version = ShopifyAPI::ApiVersion::Release.new('2019-04')
|
|
|
+ ShopifyAPI::Base.api_version = version.to_s
|
|
|
+
|
|
|
+ fake 'orders', :method => :get, :status => 200, api_version: version, :body => load_fixture('orders')
|
|
|
+ orders = ShopifyAPI::Order.all
|
|
|
+
|
|
|
+ assert_raises NotImplementedError do
|
|
|
+ orders.fetch_next_page
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ test "allows for multiple concurrent API collection objects" do
|
|
|
+ first_request_params = "page_info=#{@next_page_info}&limit=5"
|
|
|
+ fake(
|
|
|
+ 'orders',
|
|
|
+ method: :get,
|
|
|
+ status: 200,
|
|
|
+ api_version: @version,
|
|
|
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?limit=5",
|
|
|
+ body: load_fixture('orders'),
|
|
|
+ link: "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?#{first_request_params}>; rel=\"next\""
|
|
|
+ )
|
|
|
+ orders = ShopifyAPI::Order.where(limit: 5)
|
|
|
+
|
|
|
+ second_request_params = "page_info=#{@next_page_info}&limit=5"
|
|
|
+ fake(
|
|
|
+ 'orders',
|
|
|
+ method: :get,
|
|
|
+ status: 200,
|
|
|
+ api_version: @version,
|
|
|
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?limit=10",
|
|
|
+ body: load_fixture('orders'),
|
|
|
+ link: "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?#{second_request_params}>; rel=\"next\""
|
|
|
+ )
|
|
|
+
|
|
|
+ orders2 = ShopifyAPI::Order.where(limit: 10)
|
|
|
+
|
|
|
+ fake(
|
|
|
+ 'orders',
|
|
|
+ method: :get,
|
|
|
+ status: 200,
|
|
|
+ api_version: @version,
|
|
|
+ url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?limit=5&page_info=#{@next_page_info}",
|
|
|
+ body: load_fixture('orders')
|
|
|
+ )
|
|
|
+ next_page = orders.fetch_next_page
|
|
|
+ assert_equal 450789469, next_page.first.id
|
|
|
+ end
|
|
|
+
|
|
|
+end
|