From a41d90cce46c426712417bc4821fc9dfab7c6133 Mon Sep 17 00:00:00 2001 From: Bruno Bacarini Date: Fri, 14 Aug 2015 14:03:08 -0300 Subject: [PATCH] add self to pagination links --- docs/howto/add_pagination_links.md | 3 +- .../adapter/json_api/pagination_links.rb | 2 + .../json_api/pagination_test.rb | 51 ++++++++++--------- .../adapter/json_api/pagination_links_test.rb | 1 + 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/docs/howto/add_pagination_links.md b/docs/howto/add_pagination_links.md index 971e3ee8..eca74929 100644 --- a/docs/howto/add_pagination_links.md +++ b/docs/howto/add_pagination_links.md @@ -20,7 +20,7 @@ ex: "data": [ { "type": "articles", - "id": "1", + "id": "3", "attributes": { "title": "JSON API paints my bikeshed!", "body": "The shortest article. Ever.", @@ -30,6 +30,7 @@ ex: } ], "links": { + "self": "http://example.com/articles?page[number]=3&page[size]=1", "first": "http://example.com/articles?page[number]=1&page[size]=1", "prev": "http://example.com/articles?page[number]=2&page[size]=1", "next": "http://example.com/articles?page[number]=4&page[size]=1", diff --git a/lib/active_model/serializer/adapter/json_api/pagination_links.rb b/lib/active_model/serializer/adapter/json_api/pagination_links.rb index 38f882d9..4244721e 100644 --- a/lib/active_model/serializer/adapter/json_api/pagination_links.rb +++ b/lib/active_model/serializer/adapter/json_api/pagination_links.rb @@ -27,6 +27,8 @@ module ActiveModel return {} if collection.total_pages == FIRST_PAGE {}.tap do |pages| + pages[:self] = collection.current_page + unless collection.current_page == FIRST_PAGE pages[:first] = FIRST_PAGE pages[:prev] = collection.current_page - FIRST_PAGE diff --git a/test/action_controller/json_api/pagination_test.rb b/test/action_controller/json_api/pagination_test.rb index 41d3ed6f..cf7832a8 100644 --- a/test/action_controller/json_api/pagination_test.rb +++ b/test/action_controller/json_api/pagination_test.rb @@ -22,12 +22,12 @@ module ActionController def using_kaminari setup - Kaminari.paginate_array(@array).page(params[:page]).per(params[:per_page]) + Kaminari.paginate_array(@array).page(params[:page][:number]).per(params[:page][:size]) end def using_will_paginate setup - @array.paginate(page: params[:page], per_page: params[:per_page]) + @array.paginate(page: params[:page][:number], per_page: params[:page][:size]) end def render_pagination_using_kaminari @@ -50,58 +50,63 @@ module ActionController tests PaginationTestController def test_render_pagination_links_with_will_paginate - expected_links = {"first"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&per_page=1", - "prev"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&per_page=1", - "next"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&per_page=1", - "last"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&per_page=1"} + expected_links = { "self"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1", + "first"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1", + "prev"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1", + "next"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1", + "last"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1"} - get :render_pagination_using_will_paginate, page: 2, per_page: 1 + get :render_pagination_using_will_paginate, page: { number: 2, size: 1 } response = JSON.parse(@response.body) assert_equal expected_links, response['links'] end def test_render_only_last_and_next_pagination_links - expected_links = {"next"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&per_page=2", - "last"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&per_page=2"} - get :render_pagination_using_will_paginate, page: 1, per_page: 2 + expected_links = { "self"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2", + "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, page: { number: 1, size: 2 } response = JSON.parse(@response.body) assert_equal expected_links, response['links'] end def test_render_pagination_links_with_kaminari - expected_links = {"first"=>"#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&per_page=1", - "prev"=>"#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&per_page=1", - "next"=>"#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&per_page=1", - "last"=>"#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&per_page=1"} - get :render_pagination_using_kaminari, page: 2, per_page: 1 + expected_links = { "self"=>"#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1", + "first"=>"#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1", + "prev"=>"#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1", + "next"=>"#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1", + "last"=>"#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1"} + get :render_pagination_using_kaminari, page: { number: 2, size: 1 } response = JSON.parse(@response.body) assert_equal expected_links, response['links'] end def test_render_only_prev_and_first_pagination_links - expected_links = {"first"=>"#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&per_page=1", - "prev"=>"#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1&per_page=1"} - get :render_pagination_using_kaminari, page: 3, per_page: 1 + 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"} + get :render_pagination_using_kaminari, page: { number: 3, size: 1 } response = JSON.parse(@response.body) assert_equal expected_links, response['links'] end def test_render_only_last_and_next_pagination_links_with_additional_params - expected_links = {"next"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&per_page=2&teste=additional", - "last"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&per_page=2&teste=additional"} - get :render_pagination_using_will_paginate, page: 1, per_page: 2, teste: "additional" + expected_links = { "self"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2&teste=additional", + "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, page: { number: 1, size: 2 }, teste: "additional" response = JSON.parse(@response.body) assert_equal expected_links, response['links'] end def test_array_without_pagination_links - get :render_array_without_pagination_links + get :render_array_without_pagination_links, page: { number: 2, size: 1 } response = JSON.parse(@response.body) refute response.key? 'links' end def test_array_omitting_pagination_options - get :render_array_omitting_pagination_options + get :render_array_omitting_pagination_options, page: { number: 2, size: 1 } response = JSON.parse(@response.body) refute response.key? 'links' end diff --git a/test/adapter/json_api/pagination_links_test.rb b/test/adapter/json_api/pagination_links_test.rb index cd394a7a..198662fd 100644 --- a/test/adapter/json_api/pagination_links_test.rb +++ b/test/adapter/json_api/pagination_links_test.rb @@ -42,6 +42,7 @@ module ActiveModel def links { links:{ + self: "http://example.com?page%5Bnumber%5D=2&page%5Bsize%5D=1", first: "http://example.com?page%5Bnumber%5D=1&page%5Bsize%5D=1", prev: "http://example.com?page%5Bnumber%5D=1&page%5Bsize%5D=1", next: "http://example.com?page%5Bnumber%5D=3&page%5Bsize%5D=1",