jcnetdev-will_paginate 2.3.21

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 (44) hide show
  1. data/CHANGELOG +92 -0
  2. data/LICENSE +18 -0
  3. data/README.rdoc +131 -0
  4. data/Rakefile +62 -0
  5. data/examples/apple-circle.gif +0 -0
  6. data/examples/index.haml +69 -0
  7. data/examples/index.html +92 -0
  8. data/examples/pagination.css +90 -0
  9. data/examples/pagination.sass +91 -0
  10. data/init.rb +1 -0
  11. data/lib/will_paginate.rb +86 -0
  12. data/lib/will_paginate/array.rb +16 -0
  13. data/lib/will_paginate/collection.rb +145 -0
  14. data/lib/will_paginate/core_ext.rb +32 -0
  15. data/lib/will_paginate/finder.rb +247 -0
  16. data/lib/will_paginate/named_scope.rb +132 -0
  17. data/lib/will_paginate/named_scope_patch.rb +39 -0
  18. data/lib/will_paginate/version.rb +9 -0
  19. data/lib/will_paginate/view_helpers.rb +373 -0
  20. data/test/boot.rb +21 -0
  21. data/test/collection_test.rb +140 -0
  22. data/test/console +8 -0
  23. data/test/database.yml +22 -0
  24. data/test/finder_test.rb +434 -0
  25. data/test/fixtures/admin.rb +3 -0
  26. data/test/fixtures/developer.rb +13 -0
  27. data/test/fixtures/developers_projects.yml +13 -0
  28. data/test/fixtures/project.rb +15 -0
  29. data/test/fixtures/projects.yml +6 -0
  30. data/test/fixtures/replies.yml +29 -0
  31. data/test/fixtures/reply.rb +7 -0
  32. data/test/fixtures/schema.rb +38 -0
  33. data/test/fixtures/topic.rb +6 -0
  34. data/test/fixtures/topics.yml +30 -0
  35. data/test/fixtures/user.rb +2 -0
  36. data/test/fixtures/users.yml +35 -0
  37. data/test/helper.rb +37 -0
  38. data/test/lib/activerecord_test_case.rb +36 -0
  39. data/test/lib/activerecord_test_connector.rb +69 -0
  40. data/test/lib/load_fixtures.rb +11 -0
  41. data/test/lib/view_test_process.rb +165 -0
  42. data/test/tasks.rake +56 -0
  43. data/test/view_test.rb +355 -0
  44. metadata +140 -0
@@ -0,0 +1,21 @@
1
+ plugin_root = File.join(File.dirname(__FILE__), '..')
2
+ version = ENV['RAILS_VERSION']
3
+ version = nil if version and version == ""
4
+
5
+ # first look for a symlink to a copy of the framework
6
+ if !version and framework_root = ["#{plugin_root}/rails", "#{plugin_root}/../../rails"].find { |p| File.directory? p }
7
+ puts "found framework root: #{framework_root}"
8
+ # this allows for a plugin to be tested outside of an app and without Rails gems
9
+ $:.unshift "#{framework_root}/activesupport/lib", "#{framework_root}/activerecord/lib", "#{framework_root}/actionpack/lib"
10
+ else
11
+ # simply use installed gems if available
12
+ puts "using Rails#{version ? ' ' + version : nil} gems"
13
+ require 'rubygems'
14
+
15
+ if version
16
+ gem 'rails', version
17
+ else
18
+ gem 'actionpack'
19
+ gem 'activerecord'
20
+ end
21
+ end
@@ -0,0 +1,140 @@
1
+ require 'helper'
2
+ require 'will_paginate/array'
3
+
4
+ class ArrayPaginationTest < Test::Unit::TestCase
5
+ def test_simple
6
+ collection = ('a'..'e').to_a
7
+
8
+ [{ :page => 1, :per_page => 3, :expected => %w( a b c ) },
9
+ { :page => 2, :per_page => 3, :expected => %w( d e ) },
10
+ { :page => 1, :per_page => 5, :expected => %w( a b c d e ) },
11
+ { :page => 3, :per_page => 5, :expected => [] },
12
+ ].
13
+ each do |conditions|
14
+ expected = conditions.delete :expected
15
+ assert_equal expected, collection.paginate(conditions)
16
+ end
17
+ end
18
+
19
+ def test_defaults
20
+ result = (1..50).to_a.paginate
21
+ assert_equal 1, result.current_page
22
+ assert_equal 30, result.size
23
+ end
24
+
25
+ def test_deprecated_api
26
+ assert_raise(ArgumentError) { [].paginate(2) }
27
+ assert_raise(ArgumentError) { [].paginate(2, 10) }
28
+ end
29
+
30
+ def test_total_entries_has_precedence
31
+ result = %w(a b c).paginate :total_entries => 5
32
+ assert_equal 5, result.total_entries
33
+ end
34
+
35
+ def test_argument_error_with_params_and_another_argument
36
+ assert_raise ArgumentError do
37
+ [].paginate({}, 5)
38
+ end
39
+ end
40
+
41
+ def test_paginated_collection
42
+ entries = %w(a b c)
43
+ collection = create(2, 3, 10) do |pager|
44
+ assert_equal entries, pager.replace(entries)
45
+ end
46
+
47
+ assert_equal entries, collection
48
+ assert_respond_to_all collection, %w(total_pages each offset size current_page per_page total_entries)
49
+ assert_kind_of Array, collection
50
+ assert_instance_of Array, collection.entries
51
+ assert_equal 3, collection.offset
52
+ assert_equal 4, collection.total_pages
53
+ assert !collection.out_of_bounds?
54
+ end
55
+
56
+ def test_previous_next_pages
57
+ collection = create(1, 1, 3)
58
+ assert_nil collection.previous_page
59
+ assert_equal 2, collection.next_page
60
+
61
+ collection = create(2, 1, 3)
62
+ assert_equal 1, collection.previous_page
63
+ assert_equal 3, collection.next_page
64
+
65
+ collection = create(3, 1, 3)
66
+ assert_equal 2, collection.previous_page
67
+ assert_nil collection.next_page
68
+ end
69
+
70
+ def test_out_of_bounds
71
+ entries = create(2, 3, 2){}
72
+ assert entries.out_of_bounds?
73
+
74
+ entries = create(1, 3, 2){}
75
+ assert !entries.out_of_bounds?
76
+ end
77
+
78
+ def test_guessing_total_count
79
+ entries = create do |pager|
80
+ # collection is shorter than limit
81
+ pager.replace array
82
+ end
83
+ assert_equal 8, entries.total_entries
84
+
85
+ entries = create(2, 5, 10) do |pager|
86
+ # collection is shorter than limit, but we have an explicit count
87
+ pager.replace array
88
+ end
89
+ assert_equal 10, entries.total_entries
90
+
91
+ entries = create do |pager|
92
+ # collection is the same as limit; we can't guess
93
+ pager.replace array(5)
94
+ end
95
+ assert_equal nil, entries.total_entries
96
+
97
+ entries = create do |pager|
98
+ # collection is empty; we can't guess
99
+ pager.replace array(0)
100
+ end
101
+ assert_equal nil, entries.total_entries
102
+
103
+ entries = create(1) do |pager|
104
+ # collection is empty and we're on page 1,
105
+ # so the whole thing must be empty, too
106
+ pager.replace array(0)
107
+ end
108
+ assert_equal 0, entries.total_entries
109
+ end
110
+
111
+ def test_invalid_page
112
+ bad_inputs = [0, -1, nil, '', 'Schnitzel']
113
+
114
+ bad_inputs.each do |bad|
115
+ assert_raise(WillPaginate::InvalidPage) { create bad }
116
+ end
117
+ end
118
+
119
+ def test_invalid_per_page_setting
120
+ assert_raise(ArgumentError) { create(1, -1) }
121
+ end
122
+
123
+ def test_page_count_was_removed
124
+ assert_raise(NoMethodError) { create.page_count }
125
+ # It's `total_pages` now.
126
+ end
127
+
128
+ private
129
+ def create(page = 2, limit = 5, total = nil, &block)
130
+ if block_given?
131
+ WillPaginate::Collection.create(page, limit, total, &block)
132
+ else
133
+ WillPaginate::Collection.new(page, limit, total)
134
+ end
135
+ end
136
+
137
+ def array(size = 3)
138
+ Array.new(size)
139
+ end
140
+ end
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
3
+ libs = []
4
+
5
+ libs << 'irb/completion'
6
+ libs << File.join('lib', 'load_fixtures')
7
+
8
+ exec "#{irb} -Ilib:test#{libs.map{ |l| " -r #{l}" }.join} --simple-prompt"
@@ -0,0 +1,22 @@
1
+ sqlite3:
2
+ database: ":memory:"
3
+ adapter: sqlite3
4
+ timeout: 500
5
+
6
+ sqlite2:
7
+ database: ":memory:"
8
+ adapter: sqlite2
9
+
10
+ mysql:
11
+ adapter: mysql
12
+ username: rails
13
+ password: mislav
14
+ encoding: utf8
15
+ database: will_paginate_unittest
16
+
17
+ postgres:
18
+ adapter: postgresql
19
+ username: mislav
20
+ password: mislav
21
+ database: will_paginate_unittest
22
+ min_messages: warning
@@ -0,0 +1,434 @@
1
+ require 'helper'
2
+ require 'lib/activerecord_test_case'
3
+
4
+ require 'will_paginate'
5
+ WillPaginate.enable_activerecord
6
+ WillPaginate.enable_named_scope
7
+
8
+ class FinderTest < ActiveRecordTestCase
9
+ fixtures :topics, :replies, :users, :projects, :developers_projects
10
+
11
+ def test_new_methods_presence
12
+ assert_respond_to_all Topic, %w(per_page paginate paginate_by_sql)
13
+ end
14
+
15
+ def test_simple_paginate
16
+ assert_queries(1) do
17
+ entries = Topic.paginate :page => nil
18
+ assert_equal 1, entries.current_page
19
+ assert_equal 1, entries.total_pages
20
+ assert_equal 4, entries.size
21
+ end
22
+
23
+ assert_queries(2) do
24
+ entries = Topic.paginate :page => 2
25
+ assert_equal 1, entries.total_pages
26
+ assert entries.empty?
27
+ end
28
+ end
29
+
30
+ def test_parameter_api
31
+ # :page parameter in options is required!
32
+ assert_raise(ArgumentError){ Topic.paginate }
33
+ assert_raise(ArgumentError){ Topic.paginate({}) }
34
+
35
+ # explicit :all should not break anything
36
+ assert_equal Topic.paginate(:page => nil), Topic.paginate(:all, :page => 1)
37
+
38
+ # :count could be nil and we should still not cry
39
+ assert_nothing_raised { Topic.paginate :page => 1, :count => nil }
40
+ end
41
+
42
+ def test_paginate_with_per_page
43
+ entries = Topic.paginate :page => 1, :per_page => 1
44
+ assert_equal 1, entries.size
45
+ assert_equal 4, entries.total_pages
46
+
47
+ # Developer class has explicit per_page at 10
48
+ entries = Developer.paginate :page => 1
49
+ assert_equal 10, entries.size
50
+ assert_equal 2, entries.total_pages
51
+
52
+ entries = Developer.paginate :page => 1, :per_page => 5
53
+ assert_equal 11, entries.total_entries
54
+ assert_equal 5, entries.size
55
+ assert_equal 3, entries.total_pages
56
+ end
57
+
58
+ def test_paginate_with_order
59
+ entries = Topic.paginate :page => 1, :order => 'created_at desc'
60
+ expected = [topics(:futurama), topics(:harvey_birdman), topics(:rails), topics(:ar)].reverse
61
+ assert_equal expected, entries.to_a
62
+ assert_equal 1, entries.total_pages
63
+ end
64
+
65
+ def test_paginate_with_conditions
66
+ entries = Topic.paginate :page => 1, :conditions => ["created_at > ?", 30.minutes.ago]
67
+ expected = [topics(:rails), topics(:ar)]
68
+ assert_equal expected, entries.to_a
69
+ assert_equal 1, entries.total_pages
70
+ end
71
+
72
+ def test_paginate_with_include_and_conditions
73
+ entries = Topic.paginate \
74
+ :page => 1,
75
+ :include => :replies,
76
+ :conditions => "replies.content LIKE 'Bird%' ",
77
+ :per_page => 10
78
+
79
+ expected = Topic.find :all,
80
+ :include => 'replies',
81
+ :conditions => "replies.content LIKE 'Bird%' ",
82
+ :limit => 10
83
+
84
+ assert_equal expected, entries.to_a
85
+ assert_equal 1, entries.total_entries
86
+ end
87
+
88
+ def test_paginate_with_include_and_order
89
+ entries = nil
90
+ assert_queries(2) do
91
+ entries = Topic.paginate \
92
+ :page => 1,
93
+ :include => :replies,
94
+ :order => 'replies.created_at asc, topics.created_at asc',
95
+ :per_page => 10
96
+ end
97
+
98
+ expected = Topic.find :all,
99
+ :include => 'replies',
100
+ :order => 'replies.created_at asc, topics.created_at asc',
101
+ :limit => 10
102
+
103
+ assert_equal expected, entries.to_a
104
+ assert_equal 4, entries.total_entries
105
+ end
106
+
107
+ def test_paginate_associations_with_include
108
+ entries, project = nil, projects(:active_record)
109
+
110
+ assert_nothing_raised "THIS IS A BUG in Rails 1.2.3 that was fixed in [7326]. " +
111
+ "Please upgrade to a newer version of Rails." do
112
+ entries = project.topics.paginate \
113
+ :page => 1,
114
+ :include => :replies,
115
+ :conditions => "replies.content LIKE 'Nice%' ",
116
+ :per_page => 10
117
+ end
118
+
119
+ expected = Topic.find :all,
120
+ :include => 'replies',
121
+ :conditions => "project_id = #{project.id} AND replies.content LIKE 'Nice%' ",
122
+ :limit => 10
123
+
124
+ assert_equal expected, entries.to_a
125
+ end
126
+
127
+ def test_paginate_associations
128
+ dhh = users :david
129
+ expected_name_ordered = [projects(:action_controller), projects(:active_record)]
130
+ expected_id_ordered = [projects(:active_record), projects(:action_controller)]
131
+
132
+ assert_queries(2) do
133
+ # with association-specified order
134
+ entries = dhh.projects.paginate(:page => 1)
135
+ assert_equal expected_name_ordered, entries
136
+ assert_equal 2, entries.total_entries
137
+ end
138
+
139
+ # with explicit order
140
+ entries = dhh.projects.paginate(:page => 1, :order => 'projects.id')
141
+ assert_equal expected_id_ordered, entries
142
+ assert_equal 2, entries.total_entries
143
+
144
+ assert_nothing_raised { dhh.projects.find(:all, :order => 'projects.id', :limit => 4) }
145
+ entries = dhh.projects.paginate(:page => 1, :order => 'projects.id', :per_page => 4)
146
+ assert_equal expected_id_ordered, entries
147
+
148
+ # has_many with implicit order
149
+ topic = Topic.find(1)
150
+ expected = [replies(:spam), replies(:witty_retort)]
151
+ assert_equal expected.map(&:id).sort, topic.replies.paginate(:page => 1).map(&:id).sort
152
+ assert_equal expected.reverse, topic.replies.paginate(:page => 1, :order => 'replies.id ASC')
153
+ end
154
+
155
+ def test_paginate_association_extension
156
+ project = Project.find(:first)
157
+
158
+ assert_queries(2) do
159
+ entries = project.replies.paginate_recent :page => 1
160
+ assert_equal [replies(:brave)], entries
161
+ end
162
+ end
163
+
164
+ def test_paginate_with_joins
165
+ entries = nil
166
+
167
+ assert_queries(1) do
168
+ entries = Developer.paginate :page => 1,
169
+ :joins => 'LEFT JOIN developers_projects ON users.id = developers_projects.developer_id',
170
+ :conditions => 'project_id = 1'
171
+ assert_equal 2, entries.size
172
+ developer_names = entries.map &:name
173
+ assert developer_names.include?('David')
174
+ assert developer_names.include?('Jamis')
175
+ end
176
+
177
+ assert_queries(1) do
178
+ expected = entries.to_a
179
+ entries = Developer.paginate :page => 1,
180
+ :joins => 'LEFT JOIN developers_projects ON users.id = developers_projects.developer_id',
181
+ :conditions => 'project_id = 1', :count => { :select => "users.id" }
182
+ assert_equal expected, entries.to_a
183
+ assert_equal 2, entries.total_entries
184
+ end
185
+ end
186
+
187
+ def test_paginate_with_group
188
+ entries = nil
189
+ assert_queries(1) do
190
+ entries = Developer.paginate :page => 1, :per_page => 10,
191
+ :group => 'salary', :select => 'salary', :order => 'salary'
192
+ end
193
+
194
+ expected = [ users(:david), users(:jamis), users(:dev_10), users(:poor_jamis) ].map(&:salary).sort
195
+ assert_equal expected, entries.map(&:salary)
196
+ end
197
+
198
+ def test_paginate_with_dynamic_finder
199
+ expected = [replies(:witty_retort), replies(:spam)]
200
+ assert_equal expected, Reply.paginate_by_topic_id(1, :page => 1)
201
+
202
+ entries = Developer.paginate :conditions => { :salary => 100000 }, :page => 1, :per_page => 5
203
+ assert_equal 8, entries.total_entries
204
+ assert_equal entries, Developer.paginate_by_salary(100000, :page => 1, :per_page => 5)
205
+
206
+ # dynamic finder + conditions
207
+ entries = Developer.paginate_by_salary(100000, :page => 1,
208
+ :conditions => ['id > ?', 6])
209
+ assert_equal 4, entries.total_entries
210
+ assert_equal (7..10).to_a, entries.map(&:id)
211
+
212
+ assert_raises NoMethodError do
213
+ Developer.paginate_by_inexistent_attribute 100000, :page => 1
214
+ end
215
+ end
216
+
217
+ def test_scoped_paginate
218
+ entries = Developer.with_poor_ones { Developer.paginate :page => 1 }
219
+
220
+ assert_equal 2, entries.size
221
+ assert_equal 2, entries.total_entries
222
+ end
223
+
224
+ ## named_scope ##
225
+
226
+ def test_paginate_in_named_scope
227
+ entries = Developer.poor.paginate :page => 1, :per_page => 1
228
+
229
+ assert_equal 1, entries.size
230
+ assert_equal 2, entries.total_entries
231
+ end
232
+
233
+ def test_paginate_in_named_scope_on_habtm_association
234
+ project = projects(:active_record)
235
+ assert_queries(2) do
236
+ entries = project.developers.poor.paginate :page => 1, :per_page => 1
237
+
238
+ assert_equal 1, entries.size, 'one developer should be found'
239
+ assert_equal 1, entries.total_entries, 'only one developer should be found'
240
+ end
241
+ end
242
+
243
+ def test_paginate_in_named_scope_on_hmt_association
244
+ project = projects(:active_record)
245
+ expected = [replies(:brave)]
246
+
247
+ assert_queries(2) do
248
+ entries = project.replies.recent.paginate :page => 1, :per_page => 1
249
+ assert_equal expected, entries
250
+ assert_equal 1, entries.total_entries, 'only one reply should be found'
251
+ end
252
+ end
253
+
254
+ def test_paginate_in_named_scope_on_has_many_association
255
+ project = projects(:active_record)
256
+ expected = [topics(:ar)]
257
+
258
+ assert_queries(2) do
259
+ entries = project.topics.mentions_activerecord.paginate :page => 1, :per_page => 1
260
+ assert_equal expected, entries
261
+ assert_equal 1, entries.total_entries, 'only one topic should be found'
262
+ end
263
+ end
264
+
265
+ ## misc ##
266
+
267
+ def test_count_and_total_entries_options_are_mutually_exclusive
268
+ e = assert_raise ArgumentError do
269
+ Developer.paginate :page => 1, :count => {}, :total_entries => 1
270
+ end
271
+ assert_match /exclusive/, e.to_s
272
+ end
273
+
274
+ def test_readonly
275
+ assert_nothing_raised { Developer.paginate :readonly => true, :page => 1 }
276
+ end
277
+
278
+ # this functionality is temporarily removed
279
+ def xtest_pagination_defines_method
280
+ pager = "paginate_by_created_at"
281
+ assert !User.methods.include?(pager), "User methods should not include `#{pager}` method"
282
+ # paginate!
283
+ assert 0, User.send(pager, nil, :page => 1).total_entries
284
+ # the paging finder should now be defined
285
+ assert User.methods.include?(pager), "`#{pager}` method should be defined on User"
286
+ end
287
+
288
+ # Is this Rails 2.0? Find out by testing find_all which was removed in [6998]
289
+ unless ActiveRecord::Base.respond_to? :find_all
290
+ def test_paginate_array_of_ids
291
+ # AR finders also accept arrays of IDs
292
+ # (this was broken in Rails before [6912])
293
+ assert_queries(1) do
294
+ entries = Developer.paginate((1..8).to_a, :per_page => 3, :page => 2, :order => 'id')
295
+ assert_equal (4..6).to_a, entries.map(&:id)
296
+ assert_equal 8, entries.total_entries
297
+ end
298
+ end
299
+ end
300
+
301
+ uses_mocha 'internals' do
302
+ def test_implicit_all_with_dynamic_finders
303
+ Topic.expects(:find_all_by_foo).returns([])
304
+ Topic.expects(:count).returns(0)
305
+ Topic.paginate_by_foo :page => 2
306
+ end
307
+
308
+ def test_guessing_the_total_count
309
+ Topic.expects(:find).returns(Array.new(2))
310
+ Topic.expects(:count).never
311
+
312
+ entries = Topic.paginate :page => 2, :per_page => 4
313
+ assert_equal 6, entries.total_entries
314
+ end
315
+
316
+ def test_guessing_that_there_are_no_records
317
+ Topic.expects(:find).returns([])
318
+ Topic.expects(:count).never
319
+
320
+ entries = Topic.paginate :page => 1, :per_page => 4
321
+ assert_equal 0, entries.total_entries
322
+ end
323
+
324
+ def test_extra_parameters_stay_untouched
325
+ Topic.expects(:find).with(:all, {:foo => 'bar', :limit => 4, :offset => 0 }).returns(Array.new(5))
326
+ Topic.expects(:count).with({:foo => 'bar'}).returns(1)
327
+
328
+ Topic.paginate :foo => 'bar', :page => 1, :per_page => 4
329
+ end
330
+
331
+ def test_count_skips_select
332
+ Developer.stubs(:find).returns([])
333
+ Developer.expects(:count).with({}).returns(0)
334
+ Developer.paginate :select => 'salary', :page => 2
335
+ end
336
+
337
+ def test_count_select_when_distinct
338
+ Developer.stubs(:find).returns([])
339
+ Developer.expects(:count).with(:select => 'DISTINCT salary').returns(0)
340
+ Developer.paginate :select => 'DISTINCT salary', :page => 2
341
+ end
342
+
343
+ def test_should_use_scoped_finders_if_present
344
+ # scope-out compatibility
345
+ Topic.expects(:find_best).returns(Array.new(5))
346
+ Topic.expects(:with_best).returns(1)
347
+
348
+ Topic.paginate_best :page => 1, :per_page => 4
349
+ end
350
+
351
+ def test_paginate_by_sql
352
+ assert_respond_to Developer, :paginate_by_sql
353
+ Developer.expects(:find_by_sql).with(regexp_matches(/sql LIMIT 3(,| OFFSET) 3/)).returns([])
354
+ Developer.expects(:count_by_sql).with('SELECT COUNT(*) FROM (sql) AS count_table').returns(0)
355
+
356
+ entries = Developer.paginate_by_sql 'sql', :page => 2, :per_page => 3
357
+ end
358
+
359
+ def test_paginate_by_sql_respects_total_entries_setting
360
+ Developer.expects(:find_by_sql).returns([])
361
+ Developer.expects(:count_by_sql).never
362
+
363
+ entries = Developer.paginate_by_sql 'sql', :page => 1, :total_entries => 999
364
+ assert_equal 999, entries.total_entries
365
+ end
366
+
367
+ def test_paginate_by_sql_strips_order_by_when_counting
368
+ Developer.expects(:find_by_sql).returns([])
369
+ Developer.expects(:count_by_sql).with("SELECT COUNT(*) FROM (sql\n ) AS count_table").returns(0)
370
+
371
+ Developer.paginate_by_sql "sql\n ORDER\nby foo, bar, `baz` ASC", :page => 2
372
+ end
373
+
374
+ # TODO: counts are still wrong
375
+ def test_ability_to_use_with_custom_finders
376
+ # acts_as_taggable defines find_tagged_with(tag, options)
377
+ Topic.expects(:find_tagged_with).with('will_paginate', :offset => 5, :limit => 5).returns([])
378
+ Topic.expects(:count).with({}).returns(0)
379
+
380
+ Topic.paginate_tagged_with 'will_paginate', :page => 2, :per_page => 5
381
+ end
382
+
383
+ def test_array_argument_doesnt_eliminate_count
384
+ ids = (1..8).to_a
385
+ Developer.expects(:find_all_by_id).returns([])
386
+ Developer.expects(:count).returns(0)
387
+
388
+ Developer.paginate_by_id(ids, :per_page => 3, :page => 2, :order => 'id')
389
+ end
390
+
391
+ def test_paginating_finder_doesnt_mangle_options
392
+ Developer.expects(:find).returns([])
393
+ options = { :page => 1 }
394
+ options.expects(:delete).never
395
+ options_before = options.dup
396
+
397
+ Developer.paginate(options)
398
+ assert_equal options, options_before
399
+ end
400
+
401
+ def test_paginated_each
402
+ collection = stub('collection', :size => 5, :empty? => false, :per_page => 5)
403
+ collection.expects(:each).times(2).returns(collection)
404
+ last_collection = stub('collection', :size => 4, :empty? => false, :per_page => 5)
405
+ last_collection.expects(:each).returns(last_collection)
406
+
407
+ params = { :order => 'id', :total_entries => 0 }
408
+
409
+ Developer.expects(:paginate).with(params.merge(:page => 2)).returns(collection)
410
+ Developer.expects(:paginate).with(params.merge(:page => 3)).returns(collection)
411
+ Developer.expects(:paginate).with(params.merge(:page => 4)).returns(last_collection)
412
+
413
+ assert_equal 14, Developer.paginated_each(:page => '2') { }
414
+ end
415
+
416
+ # detect ActiveRecord 2.1
417
+ if ActiveRecord::Base.private_methods.include?('references_eager_loaded_tables?')
418
+ def test_removes_irrelevant_includes_in_count
419
+ Developer.expects(:find).returns([1])
420
+ Developer.expects(:count).with({}).returns(0)
421
+
422
+ Developer.paginate :page => 1, :per_page => 1, :include => :projects
423
+ end
424
+
425
+ def test_doesnt_remove_referenced_includes_in_count
426
+ Developer.expects(:find).returns([1])
427
+ Developer.expects(:count).with({ :include => :projects, :conditions => 'projects.id > 2' }).returns(0)
428
+
429
+ Developer.paginate :page => 1, :per_page => 1,
430
+ :include => :projects, :conditions => 'projects.id > 2'
431
+ end
432
+ end
433
+ end
434
+ end