forked from kaminari/kaminari
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Active Record models that were subclassed before Kaminari::ActiveReco…
…rdExtension is included pick up the extensions.
- Loading branch information
Grant Hutchins & Sam Obukwelu
committed
May 20, 2011
1 parent
5de1a97
commit 6998b5f
Showing
6 changed files
with
181 additions
and
155 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 | Original file line | 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 | Original file line | 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 | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -1,149 +1,153 @@ | |||
require File.expand_path('../spec_helper', File.dirname(__FILE__)) | require File.expand_path('../spec_helper', File.dirname(__FILE__)) | ||
|
|
||
describe Kaminari::ActiveRecordExtension do | shared_examples_for 'the first page' do | ||
before :all do | it { should have(25).users } | ||
1.upto(100) {|i| User.create! :name => "user#{'%03d' % i}", :age => (i / 10)} | its('first.name') { should == 'user001' } | ||
end | 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 '#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 | |||
|
|
||
describe '#count' do | shared_examples_for 'blank page' do | ||
context 'page 1' do | it { should have(0).users } | ||
subject { User.page } | end | ||
its(:count) { should == 25 } | |||
end | |||
|
|
||
context 'page 2' do | describe Kaminari::ActiveRecordExtension do | ||
subject { User.page 2 } | [User, GemDefinedModel].each do |model_class| | ||
its(:count) { should == 25 } | 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 '#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 | ||
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 | 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