# frozen_string_literal: true require 'test_helper' class PaginationTest < Test::Unit::TestCase def setup super @version = ShopifyAPI::ApiVersion.find_version('2019-10') ShopifyAPI::Base.api_version = @version.to_s @next_page_info = "eyJkaXJlY3Rpb24iOiJuZXh0IiwibGFzdF9pZCI6NDQwMDg5NDIzLCJsYXN0X3ZhbHVlIjoiNDQwMDg5NDIzIn0%3D" @previous_page_info = "eyJsYXN0X2lkIjoxMDg4MjgzMDksImxhc3RfdmFsdWUiOiIxMDg4MjgzMDkiLCJkaXJlY3Rpb24iOiJuZXh0In0%3D" @next_link_header = "; rel=\"next\"" @previous_link_header = "; 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/2019-10/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/2019-10/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 = "; rel=\"next\"" fake( 'orders', method: :get, status: 200, api_version: @version, url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/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/2019-10/" \ "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 "#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 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 "#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 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 = ";" 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 older API version" do version = ShopifyAPI::ApiVersion.find_version('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 "raises on 2019-07 API version for models that don't support new pagination yet" do version = ShopifyAPI::ApiVersion.find_version('2019-07') 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 "new pagination works on 2019-07 API version for select models" do version = ShopifyAPI::ApiVersion.find_version('2019-07') ShopifyAPI::Base.api_version = version.to_s fake('events', method: :get, status: 200, api_version: version, body: load_fixture('events')) events = ShopifyAPI::Event.all assert_empty(events.fetch_next_page) assert_empty(events.fetch_previous_page) end test "does not raise on the unstable version" do version = ShopifyAPI::ApiVersion.find_version('unstable') ShopifyAPI::Base.api_version = version.to_s @next_link_header = "; rel=\"next\"" 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') ) assert_nothing_raised do next_page = orders.fetch_next_page assert_equal(450789469, next_page.first.id) 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/2019-10/orders.json?limit=5", body: load_fixture('orders'), link: "; rel=\"next\"" ) 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/2019-10/orders.json?limit=10", body: load_fixture('orders'), link: "; rel=\"next\"" ) orders = 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/2019-10/" \ "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