forked from kaminari/kaminari
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' of https://github.com/Casecommons/kaminari
Conflicts: lib/kaminari/models/active_record_extension.rb spec/models/scopes_spec.rb
- Loading branch information
Showing
6 changed files
with
190 additions
and
163 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
require File.join(File.dirname(__FILE__), 'active_record_relation_methods') | ||
|
||
module Kaminari | ||
module ActiveRecordModelExtension | ||
extend ActiveSupport::Concern | ||
|
||
included do | ||
self.send(:include, Kaminari::ConfigurationMethods) | ||
|
||
# Fetch the values at the specified page number | ||
# Model.page(5) | ||
self.scope :page, Proc.new {|num| | ||
limit(default_per_page).offset(default_per_page * ([num.to_i, 1].max - 1)) | ||
} do | ||
include Kaminari::ActiveRecordRelationMethods | ||
include Kaminari::PageScopeMethods | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
# Simulate a gem providing a subclass of ActiveRecord::Base before the Railtie is loaded. | ||
|
||
require 'active_record' | ||
|
||
class GemDefinedModel < ActiveRecord::Base | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,157 +1,162 @@ | ||
require File.expand_path('../spec_helper', File.dirname(__FILE__)) | ||
|
||
describe Kaminari::ActiveRecordExtension do | ||
before :all do | ||
1.upto(100) {|i| User.create! :name => "user#{'%03d' % i}", :age => (i / 10)} | ||
end | ||
|
||
describe '#page' do | ||
shared_examples_for 'the first page' do | ||
it { should have(25).users } | ||
its('first.name') { should == 'user001' } | ||
end | ||
|
||
shared_examples_for 'blank page' do | ||
it { should have(0).users } | ||
end | ||
|
||
context 'page 1' do | ||
subject { User.page 1 } | ||
it_should_behave_like 'the first page' | ||
end | ||
|
||
context 'page 2' do | ||
subject { User.page 2 } | ||
it { should have(25).users } | ||
its('first.name') { should == 'user026' } | ||
end | ||
|
||
context 'page without an argument' do | ||
subject { User.page } | ||
it_should_behave_like 'the first page' | ||
end | ||
|
||
context 'page < 1' do | ||
subject { User.page 0 } | ||
it_should_behave_like 'the first page' | ||
end | ||
|
||
context 'page > max page' do | ||
subject { User.page 5 } | ||
it_should_behave_like 'blank page' | ||
end | ||
|
||
describe 'ensure #order_values is preserved' do | ||
subject { User.order('id').page 1 } | ||
its(:order_values) { should == ['id'] } | ||
end | ||
end | ||
|
||
describe '#per' do | ||
context 'page 1 per 5' do | ||
subject { User.page(1).per(5) } | ||
it { should have(5).users } | ||
its('first.name') { should == 'user001' } | ||
end | ||
end | ||
|
||
describe '#shift' do | ||
context 'page 1 per 5 shift 1' do | ||
subject { User.page(1).per(5).shift(1) } | ||
it { should have(5).users } | ||
its('first.name') { should == 'user002' } | ||
end | ||
end | ||
|
||
describe '#num_pages' do | ||
context 'per 25 (default)' do | ||
subject { User.page } | ||
its(:num_pages) { should == 4 } | ||
end | ||
|
||
context 'per 7' do | ||
subject { User.page(2).per(7) } | ||
its(:num_pages) { should == 15 } | ||
end | ||
|
||
context 'per 65536' do | ||
subject { User.page(50).per(65536) } | ||
its(:num_pages) { should == 1 } | ||
end | ||
|
||
context 'per 0 (using default)' do | ||
subject { User.page(50).per(0) } | ||
its(:num_pages) { should == 4 } | ||
end | ||
|
||
context 'per -1 (using default)' do | ||
subject { User.page(5).per(-1) } | ||
its(:num_pages) { should == 4 } | ||
end | ||
|
||
context 'per "String value that can not be converted into Number" (using default)' do | ||
subject { User.page(5).per('aho') } | ||
its(:num_pages) { should == 4 } | ||
end | ||
end | ||
|
||
describe '#current_page' do | ||
context 'page 1' do | ||
subject { User.page } | ||
its(:current_page) { should == 1 } | ||
end | ||
|
||
context 'page 2' do | ||
subject { User.page(2).per 3 } | ||
its(:current_page) { should == 2 } | ||
end | ||
end | ||
|
||
describe '#first_page?' do | ||
context 'on first page' do | ||
subject { User.page(1).per(10) } | ||
its(:first_page?) { should == true } | ||
end | ||
|
||
context 'not on first page' do | ||
subject { User.page(5).per(10) } | ||
its(:first_page?) { should == false } | ||
end | ||
end | ||
|
||
describe '#last_page?' do | ||
context 'on last page' do | ||
subject { User.page(10).per(10) } | ||
its(:last_page?) { should == true } | ||
end | ||
|
||
context 'not on last page' do | ||
subject { User.page(1).per(10) } | ||
its(:last_page?) { should == false } | ||
end | ||
end | ||
shared_examples_for 'the first page' do | ||
it { should have(25).users } | ||
its('first.name') { should == 'user001' } | ||
end | ||
|
||
describe '#count' do | ||
context 'page 1' do | ||
subject { User.page } | ||
its(:count) { should == 25 } | ||
end | ||
shared_examples_for 'blank page' do | ||
it { should have(0).users } | ||
end | ||
|
||
context 'page 2' do | ||
subject { User.page 2 } | ||
its(:count) { should == 25 } | ||
describe Kaminari::ActiveRecordExtension do | ||
[User, GemDefinedModel].each do |model_class| | ||
context "for #{model_class}" do | ||
before :all do | ||
1.upto(100) {|i| model_class.create! :name => "user#{'%03d' % i}", :age => (i / 10)} | ||
end | ||
|
||
describe '#page' do | ||
context 'page 1' do | ||
subject { model_class.page 1 } | ||
it_should_behave_like 'the first page' | ||
end | ||
|
||
context 'page 2' do | ||
subject { model_class.page 2 } | ||
it { should have(25).users } | ||
its('first.name') { should == 'user026' } | ||
end | ||
|
||
context 'page without an argument' do | ||
subject { model_class.page } | ||
it_should_behave_like 'the first page' | ||
end | ||
|
||
context 'page < 1' do | ||
subject { model_class.page 0 } | ||
it_should_behave_like 'the first page' | ||
end | ||
|
||
context 'page > max page' do | ||
subject { model_class.page 5 } | ||
it_should_behave_like 'blank page' | ||
end | ||
|
||
describe 'ensure #order_values is preserved' do | ||
subject { model_class.order('id').page 1 } | ||
its(:order_values) { should == ['id'] } | ||
end | ||
end | ||
|
||
describe '#per' do | ||
context 'page 1 per 5' do | ||
subject { model_class.page(1).per(5) } | ||
it { should have(5).users } | ||
its('first.name') { should == 'user001' } | ||
end | ||
end | ||
|
||
describe '#shift' do | ||
context 'page 1 per 5 shift 1' do | ||
subject { model_class.page(1).per(5).shift(1) } | ||
it { should have(5).users } | ||
its('first.name') { should == 'user002' } | ||
end | ||
end | ||
|
||
describe '#num_pages' do | ||
context 'per 25 (default)' do | ||
subject { model_class.page } | ||
its(:num_pages) { should == 4 } | ||
end | ||
|
||
context 'per 7' do | ||
subject { model_class.page(2).per(7) } | ||
its(:num_pages) { should == 15 } | ||
end | ||
|
||
context 'per 65536' do | ||
subject { model_class.page(50).per(65536) } | ||
its(:num_pages) { should == 1 } | ||
end | ||
|
||
context 'per 0 (using default)' do | ||
subject { model_class.page(50).per(0) } | ||
its(:num_pages) { should == 4 } | ||
end | ||
|
||
context 'per -1 (using default)' do | ||
subject { model_class.page(5).per(-1) } | ||
its(:num_pages) { should == 4 } | ||
end | ||
|
||
context 'per "String value that can not be converted into Number" (using default)' do | ||
subject { model_class.page(5).per('aho') } | ||
its(:num_pages) { should == 4 } | ||
end | ||
end | ||
|
||
|
||
describe '#current_page' do | ||
context 'page 1' do | ||
subject { model_class.page } | ||
its(:current_page) { should == 1 } | ||
end | ||
|
||
context 'page 2' do | ||
subject { model_class.page(2).per 3 } | ||
its(:current_page) { should == 2 } | ||
end | ||
end | ||
|
||
describe '#first_page?' do | ||
context 'on first page' do | ||
subject { model_class.page(1).per(10) } | ||
its(:first_page?) { should == true } | ||
end | ||
|
||
context 'not on first page' do | ||
subject { model_class.page(5).per(10) } | ||
its(:first_page?) { should == false } | ||
end | ||
end | ||
|
||
describe '#last_page?' do | ||
context 'on last page' do | ||
subject { model_class.page(10).per(10) } | ||
its(:last_page?) { should == true } | ||
end | ||
|
||
context 'not on last page' do | ||
subject { model_class.page(1).per(10) } | ||
its(:last_page?) { should == false } | ||
end | ||
end | ||
|
||
describe '#count' do | ||
context 'page 1' do | ||
subject { model_class.page } | ||
its(:count) { should == 25 } | ||
end | ||
|
||
context 'page 2' do | ||
subject { model_class.page 2 } | ||
its(:count) { should == 25 } | ||
end | ||
end | ||
|
||
context 'chained with .group' do | ||
subject { model_class.group('age').page(2).per 5 } | ||
# 0..10 | ||
its(:total_count) { should == 11 } | ||
its(:num_pages) { should == 3 } | ||
end | ||
|
||
context 'activerecord descendants' do | ||
subject { ActiveRecord::Base.descendants } | ||
its(:length) { should_not == 0 } | ||
end | ||
end | ||
end | ||
|
||
context 'chained with .group' do | ||
subject { User.group('age').page(2).per 5 } | ||
# 0..10 | ||
its(:total_count) { should == 11 } | ||
its(:num_pages) { should == 3 } | ||
end | ||
|
||
context 'activerecord descendants' do | ||
subject { ActiveRecord::Base.descendants } | ||
its(:length) { should_not == 0 } | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters