From 92e9a66e97657cbe3ee2ab536e05fa9e276263f9 Mon Sep 17 00:00:00 2001 From: mecampbellsoup Date: Tue, 13 Jun 2017 12:35:55 -0400 Subject: [PATCH] Amend tests to always include all pagination keys --- .../adapter/json_api/pagination_links.rb | 27 +++++++++++++++---- .../json_api/pagination_test.rb | 4 +++ .../adapter/json_api/pagination_links_test.rb | 9 ++++--- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/lib/active_model_serializers/adapter/json_api/pagination_links.rb b/lib/active_model_serializers/adapter/json_api/pagination_links.rb index 209819b6..b63cee7a 100644 --- a/lib/active_model_serializers/adapter/json_api/pagination_links.rb +++ b/lib/active_model_serializers/adapter/json_api/pagination_links.rb @@ -3,6 +3,7 @@ module ActiveModelSerializers class JsonApi < Base class PaginationLinks MissingSerializationContextError = Class.new(KeyError) + FIRST_PAGE = 1 attr_reader :collection, :context @@ -42,20 +43,36 @@ module ActiveModelSerializers url_for_page(1) end + def last_page_url + if collection.total_pages == 0 + url_for_page(FIRST_PAGE) + else + url_for_page(collection.total_pages) + end + end + def prev_page_url - return nil if collection.first_page? - url_for_page(collection.prev_page) + return nil if collection.current_page == FIRST_PAGE + url_for_page(collection.current_page - FIRST_PAGE) end def next_page_url - return nil if collection.last_page? || collection.out_of_range? + return nil if (collection.total_pages == 0 || collection.current_page == collection.total_pages) url_for_page(collection.next_page) end def url_for_page(number) params = query_parameters.dup - params[:page] = { page: per_page, number: number } - context.url_for(action: :index, params: params) + params[:page] = { size: per_page, number: number } + "#{url(adapter_options)}?#{params.to_query}" + end + + def url(options = {}) + @url ||= options.fetch(:links, {}).fetch(:self, nil) || request_url + end + + def request_url + @request_url ||= context.request_url end def query_parameters diff --git a/test/action_controller/json_api/pagination_test.rb b/test/action_controller/json_api/pagination_test.rb index b5a8f3d7..98355a05 100644 --- a/test/action_controller/json_api/pagination_test.rb +++ b/test/action_controller/json_api/pagination_test.rb @@ -61,6 +61,7 @@ module ActionController def test_render_only_first_last_and_next_pagination_links expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2", 'first' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2", + 'prev' => nil, 'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2", 'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2" } get :render_pagination_using_will_paginate, params: { page: { number: 1, size: 2 } } @@ -83,6 +84,7 @@ module ActionController expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1", 'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1", 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1", + 'next' => nil, 'last' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1" } get :render_pagination_using_kaminari, params: { page: { number: 3, size: 1 } } response = JSON.parse(@response.body) @@ -92,6 +94,7 @@ module ActionController def test_render_only_first_last_and_next_pagination_links_with_additional_params expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2&teste=additional", 'first' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2&teste=additional", + 'prev' => nil, 'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional", 'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional" } get :render_pagination_using_will_paginate, params: { page: { number: 1, size: 2 }, teste: 'additional' } @@ -103,6 +106,7 @@ module ActionController expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&teste=additional", 'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&teste=additional", 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1&teste=additional", + 'next' => nil, 'last' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&teste=additional" } get :render_pagination_using_kaminari, params: { page: { number: 3, size: 1 }, teste: 'additional' } response = JSON.parse(@response.body) diff --git a/test/adapter/json_api/pagination_links_test.rb b/test/adapter/json_api/pagination_links_test.rb index f2966146..ff08df4b 100644 --- a/test/adapter/json_api/pagination_links_test.rb +++ b/test/adapter/json_api/pagination_links_test.rb @@ -58,7 +58,9 @@ module ActiveModelSerializers { self: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2", first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2", - last: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2" + prev: nil, + next: nil, + last: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2", } end @@ -79,8 +81,9 @@ module ActiveModelSerializers links: { self: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2", first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2", - last: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2", - prev: "#{URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2" + prev: "#{URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2", + next: nil, + last: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2" } } end