diff --git a/CHANGELOG.md b/CHANGELOG.md index bcd56b027..7eafc33d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ Features: Fixes: +- [#2399](https://github.com/rails-api/active_model_serializers/pull/2399) Handles edge case where requested current_page > total_pages (@f3z0) + Misc: ### [v0.10.12 (2020-12-10)](https://github.com/rails-api/active_model_serializers/compare/v0.10.11...v0.10.12) 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 b4890c651..a41153a6e 100644 --- a/lib/active_model_serializers/adapter/json_api/pagination_links.rb +++ b/lib/active_model_serializers/adapter/json_api/pagination_links.rb @@ -55,11 +55,15 @@ def last_page_url def prev_page_url return nil if collection.current_page == FIRST_PAGE + if collection.current_page > collection.total_pages + return url_for_page(collection.total_pages) + end url_for_page(collection.current_page - FIRST_PAGE) end def next_page_url - return nil if collection.total_pages == 0 || collection.current_page == collection.total_pages + return nil if collection.total_pages == 0 || + collection.current_page >= collection.total_pages url_for_page(collection.next_page) end diff --git a/test/adapter/json_api/pagination_links_test.rb b/test/adapter/json_api/pagination_links_test.rb index e8ee5ab48..be1f475a8 100644 --- a/test/adapter/json_api/pagination_links_test.rb +++ b/test/adapter/json_api/pagination_links_test.rb @@ -90,6 +90,18 @@ def last_page_links } end + def greater_than_last_page_links + { + links: { + self: "#{URI}?page%5Bnumber%5D=4&page%5Bsize%5D=2", + first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2", + prev: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2", + next: nil, + last: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=2" + } + } + end + def expected_response_when_unpaginatable data end @@ -122,6 +134,13 @@ def expected_response_with_last_page_pagination_links end end + def expected_response_with_greater_than_last_page_pagination_links + {}.tap do |hash| + hash[:data] = [] + hash.merge! greater_than_last_page_links + end + end + def expected_response_with_empty_collection_pagination_links {}.tap do |hash| hash[:data] = [] @@ -141,6 +160,18 @@ def test_pagination_links_using_will_paginate assert_equal expected_response_with_pagination_links, adapter.serializable_hash end + def test_pagination_links_invalid_current_page_using_kaminari + adapter = load_adapter(using_kaminari(4), mock_request) + + assert_equal expected_response_with_greater_than_last_page_pagination_links, adapter.serializable_hash + end + + def test_pagination_links_invalid_current_page_using_will_paginate + adapter = load_adapter(using_will_paginate(4), mock_request) + + assert_equal expected_response_with_greater_than_last_page_pagination_links, adapter.serializable_hash + end + def test_pagination_links_with_additional_params adapter = load_adapter(using_will_paginate, mock_request(test: 'test'))