pagination_test.rb 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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 "#next_page_info returns next_page_info if next page is present" do
  82. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
  83. orders = ShopifyAPI::Order.all
  84. assert_equal @next_page_info, orders.next_page_info
  85. end
  86. test "#next_page_info returns nil if next page is not present" do
  87. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
  88. orders = ShopifyAPI::Order.all
  89. assert_nil orders.next_page_info
  90. end
  91. test "#previous_page? returns true if previous page is present" do
  92. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
  93. orders = ShopifyAPI::Order.all
  94. assert orders.previous_page?
  95. end
  96. test "#previous_page? returns false if next page is not present" do
  97. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
  98. orders = ShopifyAPI::Order.all
  99. refute orders.previous_page?
  100. end
  101. test "#previous_page_info returns previous_page_info if next page is present" do
  102. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @previous_link_header
  103. orders = ShopifyAPI::Order.all
  104. assert_equal @previous_page_info, orders.previous_page_info
  105. end
  106. test "#previous_page_info returns nil if next page is not present" do
  107. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => @next_link_header
  108. orders = ShopifyAPI::Order.all
  109. assert_nil orders.previous_page_info
  110. end
  111. test "pagination handles no link headers" do
  112. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders')
  113. orders = ShopifyAPI::Order.all
  114. refute orders.next_page?
  115. refute orders.previous_page?
  116. assert_empty orders.fetch_next_page
  117. assert_empty orders.fetch_previous_page
  118. end
  119. test "raises on invalid pagination links" do
  120. link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?page_info=#{@next_page_info}>;"
  121. fake 'orders', :method => :get, :status => 200, api_version: @version, :body => load_fixture('orders'), :link => link_header
  122. assert_raises ShopifyAPI::InvalidPaginationLinksError do
  123. ShopifyAPI::Order.all
  124. end
  125. end
  126. test "raises on an older API version" do
  127. version = ShopifyAPI::ApiVersion.find_version('2019-04')
  128. ShopifyAPI::Base.api_version = version.to_s
  129. fake 'orders', :method => :get, :status => 200, api_version: version, :body => load_fixture('orders')
  130. orders = ShopifyAPI::Order.all
  131. assert_raises NotImplementedError do
  132. orders.fetch_next_page
  133. end
  134. end
  135. test "raises on 2019-07 API version for models that don't support new pagination yet" do
  136. version = ShopifyAPI::ApiVersion.find_version('2019-07')
  137. ShopifyAPI::Base.api_version = version.to_s
  138. fake 'orders', :method => :get, :status => 200, api_version: version, :body => load_fixture('orders')
  139. orders = ShopifyAPI::Order.all
  140. assert_raises NotImplementedError do
  141. orders.fetch_next_page
  142. end
  143. end
  144. test "new pagination works on 2019-07 API version for select models" do
  145. version = ShopifyAPI::ApiVersion.find_version('2019-07')
  146. ShopifyAPI::Base.api_version = version.to_s
  147. fake 'events', :method => :get, :status => 200, api_version: version, :body => load_fixture('events')
  148. events = ShopifyAPI::Event.all
  149. assert_empty events.fetch_next_page
  150. assert_empty events.fetch_previous_page
  151. end
  152. test "does not raise on the unstable version" do
  153. version = ShopifyAPI::ApiVersion.find_version('unstable')
  154. ShopifyAPI::Base.api_version = version.to_s
  155. @next_link_header = "<https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@next_page_info}>; rel=\"next\""
  156. link_header ="#{@previous_link_header}, #{@next_link_header}"
  157. fake 'orders', :method => :get, :status => 200, api_version: version, :body => load_fixture('orders'), :link => link_header
  158. orders = ShopifyAPI::Order.all
  159. fake(
  160. 'orders',
  161. url: "https://this-is-my-test-shop.myshopify.com/admin/api/unstable/orders.json?page_info=#{@next_page_info}",
  162. method: :get,
  163. status: 200,
  164. body: load_fixture('orders')
  165. )
  166. assert_nothing_raised do
  167. next_page = orders.fetch_next_page
  168. assert_equal 450789469, next_page.first.id
  169. end
  170. end
  171. test "allows for multiple concurrent API collection objects" do
  172. first_request_params = "page_info=#{@next_page_info}&limit=5"
  173. fake(
  174. 'orders',
  175. method: :get,
  176. status: 200,
  177. api_version: @version,
  178. url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?limit=5",
  179. body: load_fixture('orders'),
  180. link: "<https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?#{first_request_params}>; rel=\"next\""
  181. )
  182. ShopifyAPI::Order.where(limit: 5)
  183. second_request_params = "page_info=#{@next_page_info}&limit=5"
  184. fake(
  185. 'orders',
  186. method: :get,
  187. status: 200,
  188. api_version: @version,
  189. url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?limit=10",
  190. body: load_fixture('orders'),
  191. link: "<https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?#{second_request_params}>; rel=\"next\""
  192. )
  193. orders = ShopifyAPI::Order.where(limit: 10)
  194. fake(
  195. 'orders',
  196. method: :get,
  197. status: 200,
  198. api_version: @version,
  199. url: "https://this-is-my-test-shop.myshopify.com/admin/api/2019-10/orders.json?limit=5&page_info=#{@next_page_info}",
  200. body: load_fixture('orders')
  201. )
  202. next_page = orders.fetch_next_page
  203. assert_equal 450789469, next_page.first.id
  204. end
  205. end