Skip to content

Commit

Permalink
[SD-1171] Set API v2 per page limit and do not allow for 0 value (#10768
Browse files Browse the repository at this point in the history
)

* [SD-1171] Set per page limit and do not allow for 0 value

* [SD-1171] Update tests

* [SD-1171] Fix issues from codeclimate

* [SD-1171] Rubocop fixes

* [SD-1171] Add changes after CR

* [SD-1171] Update condition

* [SD-1171] Use per_page_limit name instead of default_pages
  • Loading branch information
agnieszkajacek committed Feb 9, 2021
1 parent d854500 commit 1190859
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 35 deletions.
1 change: 1 addition & 0 deletions api/app/models/spree/api_configuration.rb
Expand Up @@ -2,5 +2,6 @@ module Spree
class ApiConfiguration < Preferences::Configuration
preference :requires_authentication, :boolean, default: true
preference :api_v2_content_type, :string, default: 'application/vnd.api+json'
preference :api_v2_per_page_limit, :integer, default: 100
end
end
52 changes: 40 additions & 12 deletions api/spec/requests/spree/api/v2/storefront/account/orders_spec.rb
Expand Up @@ -4,6 +4,8 @@
let!(:user) { create(:user_with_addresses) }
let!(:order) { create(:order, state: 'complete', user: user, completed_at: Time.current) }

before { Spree::Api::Config[:api_v2_per_page_limit] = 2 }

include_context 'API v2 tokens'

describe 'orders#index' do
Expand Down Expand Up @@ -49,29 +51,55 @@
end
end

context 'with specified pagination params' do
context 'when per_page is between 1 and default value' do
let!(:order) { create(:order, state: 'complete', user: user, completed_at: Time.current) }
let!(:order_1) { create(:order, state: 'complete', user: user, completed_at: Time.current + 1.day) }
let!(:order_2) { create(:order, state: 'complete', user: user, completed_at: Time.current + 2.days) }
let!(:order_3) { create(:order, state: 'complete', user: user, completed_at: Time.current + 3.days) }

before { get '/api/v2/storefront/account/orders?page=1&per_page=2', headers: headers_bearer }
context 'with specified pagination params' do
before { get '/api/v2/storefront/account/orders?page=1&per_page=2', headers: headers_bearer }

it_behaves_like 'returns 200 HTTP status'
it_behaves_like 'returns 200 HTTP status'

it 'returns specified amount orders' do
expect(json_response['data'].count).to eq 2
it 'returns specified amount orders' do
expect(json_response['data'].count).to eq 2
end

it 'returns proper meta data' do
expect(json_response['meta']['count']).to eq 2
expect(json_response['meta']['total_count']).to eq Spree::Order.count
end

it 'returns proper links data' do
expect(json_response['links']['self']).to include('/api/v2/storefront/account/orders?page=1&per_page=2')
expect(json_response['links']['next']).to include('/api/v2/storefront/account/orders?page=2&per_page=2')
expect(json_response['links']['prev']).to include('/api/v2/storefront/account/orders?page=1&per_page=2')
end
end

it 'returns proper meta data' do
expect(json_response['meta']['count']).to eq 2
expect(json_response['meta']['total_count']).to eq Spree::Order.count
context 'when per_page is above the default value' do
before { get '/api/v2/storefront/account/orders?page=1&per_page=10', headers: headers_bearer }

it 'returns the default number of orders' do
expect(json_response['data'].count).to eq 4
end
end

it 'returns proper links data' do
expect(json_response['links']['self']).to include('/api/v2/storefront/account/orders?page=1&per_page=2')
expect(json_response['links']['next']).to include('/api/v2/storefront/account/orders?page=2&per_page=2')
expect(json_response['links']['prev']).to include('/api/v2/storefront/account/orders?page=1&per_page=2')
context 'when per_page is less than 0' do
before { get '/api/v2/storefront/account/orders?page=1&per_page=-1', headers: headers_bearer }

it 'returns the default number of orders' do
expect(json_response['data'].count).to eq 4
end
end

context 'when per_page is equal 0' do
before { get '/api/v2/storefront/account/orders?page=1&per_page=0', headers: headers_bearer }

it 'returns the default number of orders' do
expect(json_response['data'].count).to eq 4
end
end
end

Expand Down
50 changes: 39 additions & 11 deletions api/spec/requests/spree/api/v2/storefront/products_spec.rb
Expand Up @@ -16,6 +16,8 @@
let!(:discontinued_product) { create(:product, discontinue_on: Time.current - 1.day) }
let!(:not_available_product) { create(:product, available_on: nil) }

before { Spree::Api::Config[:api_v2_per_page_limit] = 4 }

describe 'products#index' do
context 'with no params' do
before { get '/api/v2/storefront/products' }
Expand Down Expand Up @@ -192,23 +194,49 @@

context 'paginate products' do
context 'with specified pagination params' do
before { get '/api/v2/storefront/products?page=1&per_page=2' }
context 'when per_page is between 1 and default value' do
before { get '/api/v2/storefront/products?page=1&per_page=2' }

it_behaves_like 'returns 200 HTTP status'
it_behaves_like 'returns 200 HTTP status'

it 'returns specified amount products' do
expect(json_response['data'].count).to eq 2
it 'returns the default number of products' do
expect(json_response['data'].count).to eq 2
end

it 'returns proper meta data' do
expect(json_response['meta']['count']).to eq 2
expect(json_response['meta']['total_count']).to eq Spree::Product.available.count
end

it 'returns proper links data' do
expect(json_response['links']['self']).to include('/api/v2/storefront/products?page=1&per_page=2')
expect(json_response['links']['next']).to include('/api/v2/storefront/products?page=2&per_page=2')
expect(json_response['links']['prev']).to include('/api/v2/storefront/products?page=1&per_page=2')
end
end

it 'returns proper meta data' do
expect(json_response['meta']['count']).to eq 2
expect(json_response['meta']['total_count']).to eq Spree::Product.available.count
context 'when per_page is above the default value' do
before { get '/api/v2/storefront/products?page=1&per_page=10' }

it 'returns the default number of products' do
expect(json_response['data'].count).to eq 6
end
end

it 'returns proper links data' do
expect(json_response['links']['self']).to include('/api/v2/storefront/products?page=1&per_page=2')
expect(json_response['links']['next']).to include('/api/v2/storefront/products?page=2&per_page=2')
expect(json_response['links']['prev']).to include('/api/v2/storefront/products?page=1&per_page=2')
context 'when per_page is less than 0' do
before { get '/api/v2/storefront/products?page=1&per_page=-1' }

it 'returns the default number of products' do
expect(json_response['data'].count).to eq 6
end
end

context 'when per_page is equal 0' do
before { get '/api/v2/storefront/products?page=1&per_page=0' }

it 'returns the default number of products' do
expect(json_response['data'].count).to eq 6
end
end
end

Expand Down
50 changes: 39 additions & 11 deletions api/spec/requests/spree/api/v2/storefront/taxons_spec.rb
Expand Up @@ -4,6 +4,8 @@
let!(:taxonomy) { create(:taxonomy) }
let!(:taxons) { create_list(:taxon, 2, taxonomy: taxonomy, parent_id: taxonomy.root.id) }

before { Spree::Api::Config[:api_v2_per_page_limit] = 2 }

shared_examples 'returns valid taxon resource JSON' do
it 'returns a valid taxon resource JSON response' do
expect(response.status).to eq(200)
Expand Down Expand Up @@ -89,23 +91,49 @@

context 'paginate taxons' do
context 'with specified pagination params' do
before { get '/api/v2/storefront/taxons?page=1&per_page=1' }
context 'when per_page is between 1 and default value' do
before { get '/api/v2/storefront/taxons?page=1&per_page=1' }

it_behaves_like 'returns 200 HTTP status'
it_behaves_like 'returns 200 HTTP status'

it 'returns specified amount of taxons' do
expect(json_response['data'].count).to eq 1
it 'returns specified amount of taxons' do
expect(json_response['data'].count).to eq 1
end

it 'returns proper meta data' do
expect(json_response['meta']['count']).to eq 1
expect(json_response['meta']['total_count']).to eq Spree::Taxon.count
end

it 'returns proper links data' do
expect(json_response['links']['self']).to include('/api/v2/storefront/taxons?page=1&per_page=1')
expect(json_response['links']['next']).to include('/api/v2/storefront/taxons?page=2&per_page=1')
expect(json_response['links']['prev']).to include('/api/v2/storefront/taxons?page=1&per_page=1')
end
end

it 'returns proper meta data' do
expect(json_response['meta']['count']).to eq 1
expect(json_response['meta']['total_count']).to eq Spree::Taxon.count
context 'when per_page is above the default value' do
before { get '/api/v2/storefront/taxons?page=1&per_page=10' }

it 'returns the default number of taxons' do
expect(json_response['data'].count).to eq 3
end
end

it 'returns proper links data' do
expect(json_response['links']['self']).to include('/api/v2/storefront/taxons?page=1&per_page=1')
expect(json_response['links']['next']).to include('/api/v2/storefront/taxons?page=2&per_page=1')
expect(json_response['links']['prev']).to include('/api/v2/storefront/taxons?page=1&per_page=1')
context 'when per_page is less than 0' do
before { get '/api/v2/storefront/taxons?page=1&per_page=-1' }

it 'returns the default number of taxons' do
expect(json_response['data'].count).to eq 3
end
end

context 'when per_page is equal 0' do
before { get '/api/v2/storefront/taxons?page=1&per_page=0' }

it 'returns the default number of taxons' do
expect(json_response['data'].count).to eq 3
end
end
end

Expand Down
9 changes: 8 additions & 1 deletion core/app/paginators/spree/shared/paginate.rb
Expand Up @@ -4,7 +4,14 @@ class Paginate
def initialize(collection, params)
@collection = collection
@page = params[:page]
@per_page = params[:per_page]

per_page_limit = Spree::Api::Config[:api_v2_per_page_limit]

@per_page = if params[:per_page].to_i.between?(1, per_page_limit)
params[:per_page]
else
Kaminari.config.default_per_page
end
end

def call
Expand Down

0 comments on commit 1190859

Please sign in to comment.