pagination_test.rb 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. require 'test_helper'
  2. class PaginationTest < Test::Unit::TestCase
  3. def setup
  4. super
  5. @version = ShopifyAPI::ApiVersion::Unstable.new
  6. ShopifyAPI::Base.api_version = @version.to_s
  7. @next_page_info = "eyJkaXJlY3Rpb24iOiJuZXh0IiwibGFzdF9pZCI6NDQwMDg5NDIzLCJsYXN0X3ZhbHVlIjoiNDQwMDg5NDIzIn0%3D"
  8. @previous_page_info = "eyJsYXN0X2lkIjoxMDg4MjgzMDksImxhc3RfdmFsdWUiOiIxMDg4MjgzMDkiLCJkaXJlY3Rpb24iOiJuZXh0In0%3D"
  9. @next_link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@next_page_info}>; rel=\"next\""
  10. @previous_link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@previous_page_info}>; rel=\"previous\""
  11. end
  12. test "navigates using next and previous link headers with no original params" do
  13. link_header ="#{@previous_link_header}, #{@next_link_header}"
  14. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => link_header
  15. orders = ShopifyAPI::Order.all
  16. fake(
  17. 'orders',
  18. url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@next_page_info}",
  19. method: :get,
  20. status: 200,
  21. body: load_fixture('orders')
  22. )
  23. next_page = orders.fetch_next_page
  24. assert_equal 450789469, next_page.first.id
  25. fake(
  26. 'orders',
  27. url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@previous_page_info}",
  28. method: :get,
  29. status: 200,
  30. body: load_fixture('orders').gsub("450789469", "1122334455")
  31. )
  32. previous_page = orders.fetch_previous_page
  33. assert_equal 1122334455, previous_page.first.id
  34. end
  35. test "uses all passed in querystring parameters" do
  36. params = "page_info=#{@next_page_info}&limit=50&fields=#{CGI.escape('id,created_at')}"
  37. @next_link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?#{params}>; rel=\"next\""
  38. fake(
  39. 'orders',
  40. method: :get,
  41. status: 200,
  42. api_version: @version,
  43. url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?fields=id%2Cupdated_at&limit=100",
  44. body: load_fixture('orders'),
  45. link: @next_link_header
  46. )
  47. orders = ShopifyAPI::Order.where(fields: 'id,updated_at', limit: 100)
  48. fake(
  49. 'orders',
  50. method: :get,
  51. status: 200,
  52. api_version: @version,
  53. 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}",
  54. body: load_fixture('orders')
  55. )
  56. next_page = orders.fetch_next_page
  57. assert_equal 450789469, next_page.first.id
  58. end
  59. test "returns empty next page if just the previous page is present" do
  60. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
  61. orders = ShopifyAPI::Order.all
  62. next_page = orders.fetch_next_page
  63. assert_empty next_page
  64. end
  65. test "returns an empty previous page if just the next page is present" do
  66. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
  67. orders = ShopifyAPI::Order.all
  68. next_page = orders.fetch_previous_page
  69. assert_empty next_page
  70. end
  71. test "#next_page? returns true if next page is present" do
  72. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
  73. orders = ShopifyAPI::Order.all
  74. assert orders.next_page?
  75. end
  76. test "#next_page? returns false if next page is not present" do
  77. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
  78. orders = ShopifyAPI::Order.all
  79. refute orders.next_page?
  80. end
  81. test "#previous_page? returns true if previous page is present" do
  82. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
  83. orders = ShopifyAPI::Order.all
  84. assert orders.previous_page?
  85. end
  86. test "#previous_page? returns false if next page is not present" do
  87. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
  88. orders = ShopifyAPI::Order.all
  89. refute orders.previous_page?
  90. end
  91. test "pagination handles no link headers" do
  92. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders')
  93. orders = ShopifyAPI::Order.all
  94. refute orders.next_page?
  95. refute orders.previous_page?
  96. assert_empty orders.fetch_next_page
  97. assert_empty orders.fetch_previous_page
  98. end
  99. test "raises on invalid pagination links" do
  100. link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@next_page_info}>;"
  101. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => link_header
  102. assert_raises ShopifyAPI::InvalidPaginationLinksError do
  103. ShopifyAPI::Order.all
  104. end
  105. end
  106. test "raises on an invalid API version" do
  107. version = ShopifyAPI::ApiVersion::Release.new('2019-04')
  108. ShopifyAPI::Base.api_version = version.to_s
  109. fake 'orders', :method => :get, :status => 200, api_version: version, :body => load_fixture('orders')
  110. orders = ShopifyAPI::Order.all
  111. assert_raises NotImplementedError do
  112. orders.fetch_next_page
  113. end
  114. end
  115. test "allows for multiple concurrent API collection objects" do
  116. first_request_params = "page_info=#{@next_page_info}&limit=5"
  117. fake(
  118. 'orders',
  119. method: :get,
  120. status: 200,
  121. api_version: @version,
  122. url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?limit=5",
  123. body: load_fixture('orders'),
  124. link: "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?#{first_request_params}>; rel=\"next\""
  125. )
  126. orders = ShopifyAPI::Order.where(limit: 5)
  127. second_request_params = "page_info=#{@next_page_info}&limit=5"
  128. fake(
  129. 'orders',
  130. method: :get,
  131. status: 200,
  132. api_version: @version,
  133. url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?limit=10",
  134. body: load_fixture('orders'),
  135. link: "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?#{second_request_params}>; rel=\"next\""
  136. )
  137. orders2 = ShopifyAPI::Order.where(limit: 10)
  138. fake(
  139. 'orders',
  140. method: :get,
  141. status: 200,
  142. api_version: @version,
  143. url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?limit=5&page_info=#{@next_page_info}",
  144. body: load_fixture('orders')
  145. )
  146. next_page = orders.fetch_next_page
  147. assert_equal 450789469, next_page.first.id
  148. end
  149. end