bootstrap_pager 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +18 -0
  3. data/.idea/encodings.xml +5 -0
  4. data/.idea/misc.xml +5 -0
  5. data/.idea/modules.xml +9 -0
  6. data/.idea/pager.iml +50 -0
  7. data/.idea/scopes/scope_settings.xml +5 -0
  8. data/.idea/vcs.xml +7 -0
  9. data/Gemfile +4 -0
  10. data/LICENSE +20 -0
  11. data/MIT-LICENSE +20 -0
  12. data/README.rdoc +307 -0
  13. data/Rakefile +42 -0
  14. data/app/assets/javascripts/infinitescroll.js +8 -0
  15. data/app/helpers/pager_helper.rb +5 -0
  16. data/app/views/pager/_first_page.html.erb +11 -0
  17. data/app/views/pager/_first_page.html.haml +9 -0
  18. data/app/views/pager/_first_page.html.slim +10 -0
  19. data/app/views/pager/_gap.html.erb +8 -0
  20. data/app/views/pager/_gap.html.haml +8 -0
  21. data/app/views/pager/_gap.html.slim +10 -0
  22. data/app/views/pager/_last_page.html.erb +11 -0
  23. data/app/views/pager/_last_page.html.haml +9 -0
  24. data/app/views/pager/_last_page.html.slim +10 -0
  25. data/app/views/pager/_next_page.html.erb +11 -0
  26. data/app/views/pager/_next_page.html.haml +9 -0
  27. data/app/views/pager/_next_page.html.slim +10 -0
  28. data/app/views/pager/_page.html.erb +14 -0
  29. data/app/views/pager/_page.html.haml +11 -0
  30. data/app/views/pager/_page.html.slim +13 -0
  31. data/app/views/pager/_paginator.html.erb +25 -0
  32. data/app/views/pager/_paginator.html.haml +19 -0
  33. data/app/views/pager/_paginator.html.slim +20 -0
  34. data/app/views/pager/_prev_page.html.erb +11 -0
  35. data/app/views/pager/_prev_page.html.haml +9 -0
  36. data/app/views/pager/_prev_page.html.slim +10 -0
  37. data/bootstrap_pager.gemspec +36 -0
  38. data/config/locales/pager.yml +19 -0
  39. data/gemfiles/active_record_30.gemfile +9 -0
  40. data/gemfiles/active_record_31.gemfile +7 -0
  41. data/gemfiles/active_record_32.gemfile +10 -0
  42. data/gemfiles/active_record_40.gemfile +8 -0
  43. data/gemfiles/active_record_edge.gemfile +11 -0
  44. data/gemfiles/data_mapper_12.gemfile +15 -0
  45. data/gemfiles/mongo_mapper.gemfile +10 -0
  46. data/gemfiles/mongoid_24.gemfile +7 -0
  47. data/gemfiles/mongoid_30.gemfile +12 -0
  48. data/gemfiles/sinatra_13.gemfile +13 -0
  49. data/gemfiles/sinatra_14.gemfile +13 -0
  50. data/lib/bootstrap_pager/config.rb +51 -0
  51. data/lib/bootstrap_pager/grape.rb +4 -0
  52. data/lib/bootstrap_pager/helpers/action_view_extension.rb +152 -0
  53. data/lib/bootstrap_pager/helpers/paginator.rb +186 -0
  54. data/lib/bootstrap_pager/helpers/sinatra_helpers.rb +144 -0
  55. data/lib/bootstrap_pager/helpers/tags.rb +96 -0
  56. data/lib/bootstrap_pager/hooks.rb +41 -0
  57. data/lib/bootstrap_pager/models/active_record_extension.rb +22 -0
  58. data/lib/bootstrap_pager/models/active_record_model_extension.rb +20 -0
  59. data/lib/bootstrap_pager/models/active_record_relation_methods.rb +29 -0
  60. data/lib/bootstrap_pager/models/array_extension.rb +58 -0
  61. data/lib/bootstrap_pager/models/configuration_methods.rb +48 -0
  62. data/lib/bootstrap_pager/models/data_mapper_collection_methods.rb +15 -0
  63. data/lib/bootstrap_pager/models/data_mapper_extension.rb +48 -0
  64. data/lib/bootstrap_pager/models/mongo_mapper_extension.rb +18 -0
  65. data/lib/bootstrap_pager/models/mongoid_criteria_methods.rb +23 -0
  66. data/lib/bootstrap_pager/models/mongoid_extension.rb +33 -0
  67. data/lib/bootstrap_pager/models/page_scope_methods.rb +70 -0
  68. data/lib/bootstrap_pager/models/plucky_criteria_methods.rb +18 -0
  69. data/lib/bootstrap_pager/railtie.rb +7 -0
  70. data/lib/bootstrap_pager/sinatra.rb +5 -0
  71. data/lib/bootstrap_pager/version.rb +3 -0
  72. data/lib/bootstrap_pager.rb +38 -0
  73. data/lib/generators/pager/config_generator.rb +16 -0
  74. data/lib/generators/pager/templates/pager_config.rb +10 -0
  75. data/lib/generators/pager/views_generator.rb +118 -0
  76. data/spec/config/config_spec.rb +91 -0
  77. data/spec/fake_app/active_record/config.rb +3 -0
  78. data/spec/fake_app/active_record/models.rb +57 -0
  79. data/spec/fake_app/data_mapper/config.rb +7 -0
  80. data/spec/fake_app/data_mapper/models.rb +27 -0
  81. data/spec/fake_app/log/development.log +832 -0
  82. data/spec/fake_app/mongo_mapper/config.rb +2 -0
  83. data/spec/fake_app/mongo_mapper/models.rb +9 -0
  84. data/spec/fake_app/mongoid/config.rb +16 -0
  85. data/spec/fake_app/mongoid/models.rb +22 -0
  86. data/spec/fake_app/rails_app.rb +67 -0
  87. data/spec/fake_app/sinatra_app.rb +22 -0
  88. data/spec/fake_gem.rb +4 -0
  89. data/spec/helpers/action_view_extension_spec.rb +292 -0
  90. data/spec/helpers/helpers_spec.rb +135 -0
  91. data/spec/helpers/sinatra_helpers_spec.rb +170 -0
  92. data/spec/helpers/tags_spec.rb +140 -0
  93. data/spec/models/active_record/active_record_relation_methods_spec.rb +47 -0
  94. data/spec/models/active_record/default_per_page_spec.rb +32 -0
  95. data/spec/models/active_record/max_pages_spec.rb +23 -0
  96. data/spec/models/active_record/max_per_page_spec.rb +32 -0
  97. data/spec/models/active_record/scopes_spec.rb +242 -0
  98. data/spec/models/array_spec.rb +150 -0
  99. data/spec/models/data_mapper/data_mapper_spec.rb +207 -0
  100. data/spec/models/mongo_mapper/mongo_mapper_spec.rb +84 -0
  101. data/spec/models/mongoid/mongoid_spec.rb +126 -0
  102. data/spec/requests/users_spec.rb +53 -0
  103. data/spec/spec_helper.rb +33 -0
  104. data/spec/spec_helper_for_sinatra.rb +34 -0
  105. data/spec/support/database_cleaner.rb +16 -0
  106. data/spec/support/matchers.rb +52 -0
  107. data/vendor/assets/javascripts/jquery.infinitescroll.js +814 -0
  108. data/vendor/assets/javascripts/jquery.infinitescroll.min.js +1 -0
  109. metadata +311 -0
@@ -0,0 +1,150 @@
1
+ require 'spec_helper'
2
+
3
+ describe BootstrapPager::PaginatableArray do
4
+ it { should have(0).items }
5
+
6
+ context 'specifying limit and offset when initializing' do
7
+ subject { BootstrapPager::PaginatableArray.new((1..100).to_a, :limit => 10, :offset => 20) }
8
+ its(:current_page) { should == 3 }
9
+ end
10
+
11
+ let(:array) { BootstrapPager::PaginatableArray.new((1..100).to_a) }
12
+ describe '#page' do
13
+ shared_examples_for 'the first page of array' do
14
+ it { should have(25).users }
15
+ its(:current_page) { should == 1 }
16
+ its(:first) { should == 1 }
17
+ end
18
+
19
+ shared_examples_for 'blank array page' do
20
+ it { should have(0).items }
21
+ end
22
+
23
+ context 'page 1' do
24
+ subject { array.page 1 }
25
+ it_should_behave_like 'the first page of array'
26
+ end
27
+
28
+ context 'page 2' do
29
+ subject { array.page 2 }
30
+ it { should have(25).users }
31
+ its(:current_page) { should == 2 }
32
+ its(:first) { should == 26 }
33
+ end
34
+
35
+ context 'page without an argument' do
36
+ subject { array.page }
37
+ it_should_behave_like 'the first page of array'
38
+ end
39
+
40
+ context 'page < 1' do
41
+ subject { array.page 0 }
42
+ it_should_behave_like 'the first page of array'
43
+ end
44
+
45
+ context 'page > max page' do
46
+ subject { array.page 5 }
47
+ it_should_behave_like 'blank array page'
48
+ end
49
+ end
50
+
51
+ describe '#per' do
52
+ context 'page 1 per 5' do
53
+ subject { array.page(1).per(5) }
54
+ it { should have(5).users }
55
+ its(:first) { should == 1 }
56
+ end
57
+ end
58
+
59
+ describe '#total_pages' do
60
+ context 'per 25 (default)' do
61
+ subject { array.page }
62
+ its(:total_pages) { should == 4 }
63
+ end
64
+
65
+ context 'per 7' do
66
+ subject { array.page(2).per(7) }
67
+ its(:total_pages) { should == 15 }
68
+ end
69
+
70
+ context 'per 65536' do
71
+ subject { array.page(50).per(65536) }
72
+ its(:total_pages) { should == 1 }
73
+ end
74
+
75
+ context 'per 0 (using default)' do
76
+ subject { array.page(50).per(0) }
77
+ its(:total_pages) { should == 4 }
78
+ end
79
+
80
+ context 'per -1 (using default)' do
81
+ subject { array.page(5).per(-1) }
82
+ its(:total_pages) { should == 4 }
83
+ end
84
+
85
+ context 'per "String value that can not be converted into Number" (using default)' do
86
+ subject { array.page(5).per('aho') }
87
+ its(:total_pages) { should == 4 }
88
+ end
89
+
90
+ context 'per 25, padding 25' do
91
+ subject { array.page(1).padding(25) }
92
+ its(:total_pages) { should == 3 }
93
+ end
94
+ end
95
+
96
+ describe '#current_page' do
97
+ context 'page 1' do
98
+ subject { array.page }
99
+ its(:current_page) { should == 1 }
100
+ end
101
+
102
+ context 'page 2' do
103
+ subject { array.page(2).per 3 }
104
+ its(:current_page) { should == 2 }
105
+ end
106
+ end
107
+
108
+ describe '#next_page' do
109
+ context 'page 1' do
110
+ subject { array.page }
111
+ its(:next_page) { should == 2 }
112
+ end
113
+
114
+ context 'page 5' do
115
+ subject { array.page 5 }
116
+ its(:next_page) { should be_nil }
117
+ end
118
+ end
119
+
120
+ describe '#prev_page' do
121
+ context 'page 1' do
122
+ subject { array.page }
123
+ its(:prev_page) { should be_nil }
124
+ end
125
+
126
+ context 'page 5' do
127
+ subject { array.page 5 }
128
+ its(:prev_page) { should == 4 }
129
+ end
130
+ end
131
+
132
+ describe '#count' do
133
+ context 'page 1' do
134
+ subject { array.page }
135
+ its(:count) { should == 25 }
136
+ end
137
+
138
+ context 'page 2' do
139
+ subject { array.page 2 }
140
+ its(:count) { should == 25 }
141
+ end
142
+ end
143
+
144
+ context 'when setting total count explicitly' do
145
+ subject { BootstrapPager::PaginatableArray.new((1..10).to_a, :total_count => 9999).page(5).per(10) }
146
+ it { should have(10).items }
147
+ its(:first) { should == 1 }
148
+ its(:total_count) { should == 9999 }
149
+ end
150
+ end
@@ -0,0 +1,207 @@
1
+ require 'spec_helper'
2
+
3
+ if defined? DataMapper
4
+ # tests for issue #203
5
+ describe BootstrapPager::DataMapperCollectionMethods do
6
+ before do
7
+ 100.times do |i|
8
+ User.create(:name => "User#{i}", :age => i)
9
+ end
10
+
11
+ worker0 = User[0]
12
+ 50.times do |i|
13
+ worker0.projects << Project.create(:name => "Project#{i}")
14
+ end
15
+ worker0.projects.save
16
+ end
17
+
18
+ describe 'Model' do
19
+ subject { User }
20
+ its(:current_page) { should == 1 }
21
+ it { User.all.count.should == 100 }
22
+ it { User.page(1).length.should == 25 }
23
+ it {
24
+ User.paginates_per(5)
25
+ User.page(1).length.should == 5
26
+ User.all.page(1).length.should == 5
27
+ }
28
+ end
29
+
30
+ end
31
+
32
+ describe BootstrapPager::DataMapperExtension do
33
+ before do
34
+ 100.times do |i|
35
+ User.create(:name => "User#{i}", :age => i)
36
+ end
37
+
38
+ worker0 = User[0]
39
+ 50.times do |i|
40
+ worker0.projects << Project.create(:name => "Project#{i}")
41
+ end
42
+ worker0.projects.save
43
+ end
44
+
45
+ describe 'Collection' do
46
+ subject{ User.all }
47
+ it { should respond_to(:page) }
48
+ it { should_not respond_to(:per) }
49
+ end
50
+
51
+ describe 'Model' do
52
+ subject{ User }
53
+ it { should respond_to(:page) }
54
+ it { should respond_to(:default_per_page) }
55
+ it { should_not respond_to(:per) }
56
+ end
57
+
58
+ describe '#page' do
59
+ context 'page 0' do
60
+ subject { User.all(:age.gte => 60).page 0 }
61
+ it { should be_a DataMapper::Collection }
62
+ its(:current_page) { should == 1 }
63
+ its(:prev_page) { should be_nil }
64
+ its(:next_page) { should == 2 }
65
+ its('query.limit') { should == 25 }
66
+ its('query.offset') { should == 0 }
67
+ its(:total_count) { should == User.count(:age.gte => 60) }
68
+ its(:total_pages) { should == 2 }
69
+ end
70
+
71
+ context 'page 1' do
72
+ subject { User.all(:age.gte => 0).page 1 }
73
+ it { should be_a DataMapper::Collection }
74
+ its(:current_page) { should == 1 }
75
+ its(:prev_page) { should be_nil }
76
+ its(:next_page) { should == 2 }
77
+ its('query.limit') { should == 25 }
78
+ its('query.offset') { should == 0 }
79
+ its(:total_count) { should == 100 }
80
+ its(:total_pages) { should == 4 }
81
+ end
82
+
83
+ context 'page 2' do
84
+ subject { User.page 2 }
85
+ it { should be_a DataMapper::Collection }
86
+ its(:current_page) { should == 2 }
87
+ its(:prev_page) { should == 1 }
88
+ its(:next_page) { should == 3 }
89
+ its(:limit_value) { should == 25 }
90
+ its('query.limit') { should == 25 }
91
+ its('query.offset') { should == 25 }
92
+ its(:total_count) { should == 100 }
93
+ its(:total_pages) { should == 4 }
94
+ end
95
+
96
+ context 'page "foobar"' do
97
+ subject { User.page 'foobar' }
98
+ it { should be_a DataMapper::Collection }
99
+ its(:current_page) { should == 1 }
100
+ its(:prev_page) { should be_nil }
101
+ its(:next_page) { should == 2 }
102
+ its('query.limit') { should == 25 }
103
+ its('query.offset') { should == 0 }
104
+ its(:total_count) { should == 100 }
105
+ its(:total_pages) { should == 4 }
106
+ end
107
+
108
+ context 'with criteria before' do
109
+ subject { User.all(:age.gt => 60).page 2 }
110
+ it { should be_a DataMapper::Collection }
111
+ its(:current_page) { should == 2 }
112
+ its(:prev_page) { should == 1 }
113
+ its(:next_page) { should be_nil }
114
+ its('query.limit') { should == 25 }
115
+ its('query.offset') { should == 25 }
116
+ its(:total_count) { should == User.count(:age.gt => 60) }
117
+ its(:total_pages) { should == 2 }
118
+ end
119
+
120
+ context 'with criteria after' do
121
+ subject { User.page(2).all(:age.gt => 60) }
122
+ it { should be_a DataMapper::Collection }
123
+ its(:current_page) { should == 2 }
124
+ its(:prev_page) { should == 1 }
125
+ its(:next_page) { should be_nil }
126
+ its('query.limit') { should == 25 }
127
+ its('query.offset') { should == 25 }
128
+ its(:total_count) { should == User.count(:age.gt => 60) }
129
+ its(:total_pages) { should == 2 }
130
+ end
131
+ end
132
+
133
+ describe '#per' do
134
+ context 'on simple query' do
135
+ subject { User.page(2).per(20) }
136
+ it { should be_a DataMapper::Collection }
137
+ its(:current_page) { should == 2 }
138
+ its(:prev_page) { should == 1 }
139
+ its(:next_page) { should == 3 }
140
+ its('query.limit') { should == 20 }
141
+ its(:limit_value) { should == 20 }
142
+ its('query.offset') { should == 20 }
143
+ its(:total_count) { should == 100 }
144
+ its(:total_pages) { should == 5 }
145
+ end
146
+
147
+ context 'on query with condition' do
148
+ subject { User.page(5).all(:age.lte => 80).per(13) }
149
+ its(:current_page) { should == 5 }
150
+ its(:prev_page) { should == 4 }
151
+ its(:next_page) { should == 6 }
152
+ its('query.limit') { should == 13 }
153
+ its('query.offset') { should == 52 }
154
+ its(:total_count) { should == 81 }
155
+ its(:total_pages) { should == 7 }
156
+ end
157
+
158
+ context 'on query with order' do
159
+ subject { User.page(5).all(:age.lte => 80, :order => [:age.asc]).per(13) }
160
+ it('includes user with age 52') { should include(User.first(:age => 52)) }
161
+ it('does not include user with age 51') { should_not include(User.first(:age => 51)) }
162
+ it('includes user with age 52') { should include(User.first(:age => 64)) }
163
+ it('does not include user with age 51') { should_not include(User.first(:age => 65)) }
164
+ its(:current_page) { should == 5 }
165
+ its(:prev_page) { should == 4 }
166
+ its(:next_page) { should == 6 }
167
+ its('query.limit') { should == 13 }
168
+ its('query.offset') { should == 52 }
169
+ its(:total_count) { should == 81 }
170
+ its(:total_pages) { should == 7 }
171
+ end
172
+
173
+ context 'on chained queries' do
174
+ subject { User.all(:age.gte => 50).page(3).all(:age.lte => 80).per(13) }
175
+ its(:current_page) { should == 3 }
176
+ its(:prev_page) { should == 2 }
177
+ its(:next_page) { should be_nil }
178
+ its('query.limit') { should == 13 }
179
+ its('query.offset') { should == 26 }
180
+ its(:total_count) { should == 31 }
181
+ its(:total_pages) { should == 3 }
182
+ end
183
+
184
+ context 'on query on association' do
185
+ subject { User[0].projects.page(3).all(:name.like => 'Project%').per(5) }
186
+ its(:current_page) { should == 3 }
187
+ its(:prev_page) { should == 2 }
188
+ its(:next_page) { should == 4 }
189
+ its('query.limit') { should == 5 }
190
+ its('query.offset') { should == 10 }
191
+ its(:total_count) { should == 50 }
192
+ its(:total_pages) { should == 10 }
193
+ end
194
+
195
+ context 'on query with association conditions' do
196
+ subject { User.page(3).all(:projects => Project.all).per(5) }
197
+ its(:current_page) { should == 3 }
198
+ its(:prev_page) { should == 2 }
199
+ its(:next_page) { should == 4 }
200
+ its('query.limit') { should == 5 }
201
+ its('query.offset') { should == 10 }
202
+ its(:total_count) { should == 50 }
203
+ its(:total_pages) { should == 10 }
204
+ end
205
+ end
206
+ end
207
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ if defined? MongoMapper
4
+ describe BootstrapPager::MongoMapperExtension do
5
+ before(:each) do
6
+ User.destroy_all
7
+ 41.times { User.create!({:salary => 1}) }
8
+ end
9
+
10
+ describe '#page' do
11
+ context 'page 1' do
12
+ subject { User.page(1) }
13
+ it { should be_a Plucky::Query }
14
+ its(:current_page) { should == 1 }
15
+ its(:prev_page) { should be_nil }
16
+ its(:next_page) { should == 2 }
17
+ its(:limit_value) { should == 25 }
18
+ its(:total_pages) { should == 2 }
19
+ it { should skip(0) }
20
+ end
21
+
22
+ context 'page 2' do
23
+ subject { User.page 2 }
24
+ it { should be_a Plucky::Query }
25
+ its(:current_page) { should == 2 }
26
+ its(:prev_page) { should == 1 }
27
+ its(:next_page) { should be_nil }
28
+ its(:limit_value) { should == 25 }
29
+ its(:total_pages) { should == 2 }
30
+ it { should skip 25 }
31
+ end
32
+
33
+ context 'page "foobar"' do
34
+ subject { User.page 'foobar' }
35
+ it { should be_a Plucky::Query }
36
+ its(:current_page) { should == 1 }
37
+ its(:prev_page) { should be_nil }
38
+ its(:next_page) { should == 2 }
39
+ its(:limit_value) { should == 25 }
40
+ its(:total_pages) { should == 2 }
41
+ it { should skip 0 }
42
+ end
43
+
44
+ context 'with criteria before' do
45
+ it "should have the proper criteria source" do
46
+ User.where(:salary => 1).page(2).criteria.source.should == {:salary => 1}
47
+ end
48
+
49
+ subject { User.where(:salary => 1).page 2 }
50
+ its(:current_page) { should == 2 }
51
+ its(:prev_page) { should == 1 }
52
+ its(:next_page) { should be_nil }
53
+ its(:limit_value) { should == 25 }
54
+ its(:total_pages) { should == 2 }
55
+ it { should skip 25 }
56
+ end
57
+
58
+ context 'with criteria after' do
59
+ it "should have the proper criteria source" do
60
+ User.where(:salary => 1).page(2).criteria.source.should == {:salary => 1}
61
+ end
62
+
63
+ subject { User.page(2).where(:salary => 1) }
64
+ its(:current_page) { should == 2 }
65
+ its(:prev_page) { should == 1 }
66
+ its(:next_page) { should be_nil }
67
+ its(:limit_value) { should == 25 }
68
+ its(:total_pages) { should == 2 }
69
+ it { should skip 25 }
70
+ end
71
+ end
72
+
73
+ describe '#per' do
74
+ subject { User.page(2).per(10) }
75
+ it { should be_a Plucky::Query }
76
+ its(:current_page) { should == 2 }
77
+ its(:prev_page) { should == 1 }
78
+ its(:next_page) { should == 3 }
79
+ its(:limit_value) { should == 10 }
80
+ its(:total_pages) { should == 5 }
81
+ it { should skip 10 }
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,126 @@
1
+ require 'spec_helper'
2
+
3
+ if defined? Mongoid
4
+ describe BootstrapPager::MongoidExtension do
5
+ before(:each) do
6
+ 41.times do
7
+ User.create!({:salary => 1})
8
+ end
9
+ end
10
+
11
+ describe '#page' do
12
+
13
+ context 'page 1' do
14
+ subject { User.page 1 }
15
+ it { should be_a Mongoid::Criteria }
16
+ its(:current_page) { should == 1 }
17
+ its(:prev_page) { should be_nil }
18
+ its(:next_page) { should == 2 }
19
+ its(:limit_value) { should == 25 }
20
+ its(:total_pages) { should == 2 }
21
+ it { should skip(0) }
22
+ end
23
+
24
+ context 'page 2' do
25
+ subject { User.page 2 }
26
+ it { should be_a Mongoid::Criteria }
27
+ its(:current_page) { should == 2 }
28
+ its(:prev_page) { should == 1 }
29
+ its(:next_page) { should be_nil }
30
+ its(:limit_value) { should == 25 }
31
+ its(:total_pages) { should == 2 }
32
+ it { should skip 25 }
33
+ end
34
+
35
+ context 'page "foobar"' do
36
+ subject { User.page 'foobar' }
37
+ it { should be_a Mongoid::Criteria }
38
+ its(:current_page) { should == 1 }
39
+ its(:prev_page) { should be_nil }
40
+ its(:next_page) { should == 2 }
41
+ its(:limit_value) { should == 25 }
42
+ its(:total_pages) { should == 2 }
43
+ it { should skip 0 }
44
+ end
45
+
46
+ shared_examples 'complete valid pagination' do
47
+ if Mongoid::VERSION =~ /^3/
48
+ its(:selector) { should == {'salary' => 1} }
49
+ else
50
+ its(:selector) { should == {:salary => 1} }
51
+ end
52
+ its(:current_page) { should == 2 }
53
+ its(:prev_page) { should == 1 }
54
+ its(:next_page) { should be_nil }
55
+ its(:limit_value) { should == 25 }
56
+ its(:total_pages) { should == 2 }
57
+ it { should skip 25 }
58
+ end
59
+
60
+ context 'with criteria before' do
61
+ subject { User.where(:salary => 1).page 2 }
62
+ it_should_behave_like 'complete valid pagination'
63
+ end
64
+
65
+ context 'with criteria after' do
66
+ subject { User.page(2).where(:salary => 1) }
67
+ it_should_behave_like 'complete valid pagination'
68
+ end
69
+ end
70
+
71
+ describe '#per' do
72
+ subject { User.page(2).per(10) }
73
+ it { should be_a Mongoid::Criteria }
74
+ its(:current_page) { should == 2 }
75
+ its(:prev_page) { should == 1 }
76
+ its(:next_page) { should == 3 }
77
+ its(:limit_value) { should == 10 }
78
+ its(:total_pages) { should == 5 }
79
+ it { should skip 10 }
80
+ end
81
+
82
+ describe '#page in embedded documents' do
83
+ before do
84
+ @mongo_developer = MongoMongoidExtensionDeveloper.new
85
+ @mongo_developer.frameworks.new(:name => "rails", :language => "ruby")
86
+ @mongo_developer.frameworks.new(:name => "merb", :language => "ruby")
87
+ @mongo_developer.frameworks.new(:name => "sinatra", :language => "ruby")
88
+ @mongo_developer.frameworks.new(:name => "cakephp", :language => "php")
89
+ @mongo_developer.frameworks.new(:name => "tornado", :language => "python")
90
+ end
91
+
92
+ context 'page 1' do
93
+ subject { @mongo_developer.frameworks.page(1).per(1) }
94
+ it { should be_a Mongoid::Criteria }
95
+ its(:total_count) { should == 5 }
96
+ its(:limit_value) { should == 1 }
97
+ its(:current_page) { should == 1 }
98
+ its(:prev_page) { should be_nil }
99
+ its(:next_page) { should == 2 }
100
+ its(:total_pages) { should == 5 }
101
+ end
102
+
103
+ context 'with criteria after' do
104
+ subject { @mongo_developer.frameworks.page(1).per(2).where(:language => "ruby") }
105
+ it { should be_a Mongoid::Criteria }
106
+ its(:total_count) { should == 3 }
107
+ its(:limit_value) { should == 2 }
108
+ its(:current_page) { should == 1 }
109
+ its(:prev_page) { should be_nil }
110
+ its(:next_page) { should == 2 }
111
+ its(:total_pages) { should == 2 }
112
+ end
113
+
114
+ context 'with criteria before' do
115
+ subject { @mongo_developer.frameworks.where(:language => "ruby").page(1).per(2) }
116
+ it { should be_a Mongoid::Criteria }
117
+ its(:total_count) { should == 3 }
118
+ its(:limit_value) { should == 2 }
119
+ its(:current_page) { should == 1 }
120
+ its(:prev_page) { should be_nil }
121
+ its(:next_page) { should == 2 }
122
+ its(:total_pages) { should == 2 }
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,53 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ feature 'Users' do
5
+ background do
6
+ 1.upto(100) {|i| User.create! :name => "user#{'%03d' % i}" }
7
+ end
8
+ scenario 'navigating by pagination links' do
9
+ visit '/users'
10
+
11
+ within 'nav.pagination' do
12
+ within 'li.page.active' do
13
+ page.should have_content '1'
14
+ end
15
+ within 'li.next' do
16
+ click_link 'Next ›'
17
+ end
18
+ end
19
+
20
+ within 'nav.pagination' do
21
+ within 'li.page.active' do
22
+ page.should have_content '2'
23
+ end
24
+ within 'li.last' do
25
+ click_link 'Last »'
26
+ end
27
+ end
28
+
29
+ within 'nav.pagination' do
30
+ within 'li.page.active' do
31
+ page.should have_content '4'
32
+ end
33
+ within 'li.prev' do
34
+ click_link '‹ Prev'
35
+ end
36
+ end
37
+
38
+ within 'nav.pagination' do
39
+ within 'li.page.active' do
40
+ page.should have_content '3'
41
+ end
42
+ within 'li.first' do
43
+ click_link '« First'
44
+ end
45
+ end
46
+
47
+ within 'nav.pagination' do
48
+ within 'li.page.active' do
49
+ page.should have_content '1'
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,33 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+
4
+ begin
5
+ require 'rails'
6
+ rescue LoadError
7
+ end
8
+
9
+ require 'bundler/setup'
10
+ Bundler.require
11
+
12
+ require 'capybara/rspec'
13
+ require 'database_cleaner'
14
+
15
+ # Simulate a gem providing a subclass of ActiveRecord::Base before the Railtie is loaded.
16
+ require 'fake_gem' if defined? ActiveRecord
17
+
18
+ if defined? Rails
19
+ require 'fake_app/rails_app'
20
+
21
+ require 'rspec/rails'
22
+ end
23
+ if defined? Sinatra
24
+ require 'spec_helper_for_sinatra'
25
+ end
26
+
27
+ # Requires supporting files with custom matchers and macros, etc,
28
+ # in ./support/ and its subdirectories.
29
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
30
+
31
+ RSpec.configure do |config|
32
+ config.mock_with :rr
33
+ end
@@ -0,0 +1,34 @@
1
+ require 'bootstrap_pager/sinatra'
2
+ require 'bootstrap_pager/helpers/action_view_extension'
3
+ require 'rack/test'
4
+ require 'sinatra/test_helpers'
5
+ require 'capybara/rspec'
6
+
7
+ require 'fake_app/sinatra_app'
8
+
9
+ Capybara.app = SinatraApp
10
+
11
+ module HelperMethodForHelperSpec
12
+ module FakeEnv
13
+ def env
14
+ {'PATH_INFO' => '/'}
15
+ end
16
+ end
17
+
18
+ def helper
19
+ # OMG terrible object...
20
+ ::BootstrapPager::Helpers::SinatraHelpers::ActionViewTemplateProxy.new(:current_params => {}, :current_path => '/', :param_name => BootstrapPager.config.param_name).extend(Padrino::Helpers, BootstrapPager::ActionViewExtension, BootstrapPager::Helpers::SinatraHelpers::HelperMethods, FakeEnv)
21
+ end
22
+ end
23
+
24
+ RSpec.configure do |config|
25
+ config.include Rack::Test::Methods
26
+ config.include Sinatra::TestHelpers
27
+ config.include HelperMethodForHelperSpec
28
+ # config.include HelperMethodForHelperSpec, :type => :helper
29
+ end
30
+
31
+ require 'nokogiri'
32
+ def last_document
33
+ Nokogiri::HTML(last_response.body)
34
+ end
@@ -0,0 +1,16 @@
1
+ DatabaseCleaner[:active_record].strategy = :transaction if defined? ActiveRecord
2
+ DatabaseCleaner[:data_mapper].strategy = :transaction if defined? DataMapper
3
+ DatabaseCleaner[:mongoid].strategy = :truncation if defined? Mongoid
4
+ DatabaseCleaner[:mongo_mapper].strategy = :truncation if defined? MongoMapper
5
+
6
+ RSpec.configure do |config|
7
+ config.before :suite do
8
+ DatabaseCleaner.clean_with :transaction
9
+ end
10
+ config.before :each do
11
+ DatabaseCleaner.start
12
+ end
13
+ config.after :each do
14
+ DatabaseCleaner.clean
15
+ end
16
+ end