bootstrap_pager 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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