pagination_test.rb 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. require 'test_helper'
  2. class PaginationTest < Test::Unit::TestCase
  3. def setup
  4. super
  5. @version = ShopifyAPI::ApiVersion.find_version('2019-10')
  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/2019-10/orders.json?page_info=#{@next_page_info}>; rel=\"next\""
  10. @previous_link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/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/2019-10/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/2019-10/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/2019-10/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/2019-10/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/2019-10/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/2019-10/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 older API version" do
  107. version = ShopifyAPI::ApiVersion.find_version('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 "raises on 2019-07 API version for models that don't support new pagination yet" do
  116. version = ShopifyAPI::ApiVersion.find_version('2019-07')
  117. ShopifyAPI::Base.api_version = version.to_s
  118. fake 'orders', :method => :get, :status => 200, api_version: version, :body => load_fixture('orders')
  119. orders = ShopifyAPI::Order.all
  120. assert_raises NotImplementedError do
  121. orders.fetch_next_page
  122. end
  123. end
  124. test "new pagination works on 2019-07 API version for select models" do
  125. version = ShopifyAPI::ApiVersion.find_version('2019-07')
  126. ShopifyAPI::Base.api_version = version.to_s
  127. fake 'events', :method => :get, :status => 200, api_version: version, :body => load_fixture('events')
  128. events = ShopifyAPI::Event.all
  129. assert_empty events.fetch_next_page
  130. assert_empty events.fetch_previous_page
  131. end
  132. test "does not raise on the unstable version" do
  133. version = ShopifyAPI::ApiVersion.find_version('unstable')
  134. ShopifyAPI::Base.api_version = version.to_s
  135. @next_link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@next_page_info}>; rel=\"next\""
  136. link_header ="#{@previous_link_header}, #{@next_link_header}"
  137. fake 'orders', :method => :get, :status => 200, api_version: version, :body => load_fixture('orders'), :link => link_header
  138. orders = ShopifyAPI::Order.all
  139. fake(
  140. 'orders',
  141. url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@next_page_info}",
  142. method: :get,
  143. status: 200,
  144. body: load_fixture('orders')
  145. )
  146. assert_nothing_raised do
  147. next_page = orders.fetch_next_page
  148. assert_equal 450789469, next_page.first.id
  149. end
  150. end
  151. test "allows for multiple concurrent API collection objects" do
  152. first_request_params = "page_info=#{@next_page_info}&limit=5"
  153. fake(
  154. 'orders',
  155. method: :get,
  156. status: 200,
  157. api_version: @version,
  158. url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?limit=5",
  159. body: load_fixture('orders'),
  160. link: "<https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?#{first_request_params}>; rel=\"next\""
  161. )
  162. orders = ShopifyAPI::Order.where(limit: 5)
  163. second_request_params = "page_info=#{@next_page_info}&limit=5"
  164. fake(
  165. 'orders',
  166. method: :get,
  167. status: 200,
  168. api_version: @version,
  169. url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?limit=10",
  170. body: load_fixture('orders'),
  171. link: "<https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?#{second_request_params}>; rel=\"next\""
  172. )
  173. orders2 = ShopifyAPI::Order.where(limit: 10)
  174. fake(
  175. 'orders',
  176. method: :get,
  177. status: 200,
  178. api_version: @version,
  179. url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?limit=5&page_info=#{@next_page_info}",
  180. body: load_fixture('orders')
  181. )
  182. next_page = orders.fetch_next_page
  183. assert_equal 450789469, next_page.first.id
  184. end
  185. end