pb-will_paginate 2.3.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/.gitignore +4 -0
  2. data/.manifest +43 -0
  3. data/CHANGELOG.rdoc +139 -0
  4. data/LICENSE +18 -0
  5. data/README.rdoc +107 -0
  6. data/Rakefile +71 -0
  7. data/VERSION +1 -0
  8. data/examples/apple-circle.gif +0 -0
  9. data/examples/index.haml +69 -0
  10. data/examples/index.html +92 -0
  11. data/examples/pagination.css +90 -0
  12. data/examples/pagination.sass +91 -0
  13. data/init.rb +2 -0
  14. data/lib/will_paginate.rb +90 -0
  15. data/lib/will_paginate/array.rb +16 -0
  16. data/lib/will_paginate/collection.rb +144 -0
  17. data/lib/will_paginate/core_ext.rb +43 -0
  18. data/lib/will_paginate/finder.rb +264 -0
  19. data/lib/will_paginate/i18n.rb +178 -0
  20. data/lib/will_paginate/named_scope.rb +170 -0
  21. data/lib/will_paginate/named_scope_patch.rb +37 -0
  22. data/lib/will_paginate/version.rb +9 -0
  23. data/lib/will_paginate/view_helpers.rb +397 -0
  24. data/locales/en.yml +11 -0
  25. data/pb-will_paginate.gemspec +106 -0
  26. data/test/boot.rb +21 -0
  27. data/test/collection_test.rb +143 -0
  28. data/test/console +8 -0
  29. data/test/database.yml +22 -0
  30. data/test/finder_test.rb +473 -0
  31. data/test/fixtures/admin.rb +3 -0
  32. data/test/fixtures/developer.rb +14 -0
  33. data/test/fixtures/developers_projects.yml +13 -0
  34. data/test/fixtures/project.rb +15 -0
  35. data/test/fixtures/projects.yml +6 -0
  36. data/test/fixtures/replies.yml +29 -0
  37. data/test/fixtures/reply.rb +7 -0
  38. data/test/fixtures/schema.rb +38 -0
  39. data/test/fixtures/topic.rb +10 -0
  40. data/test/fixtures/topics.yml +30 -0
  41. data/test/fixtures/user.rb +2 -0
  42. data/test/fixtures/users.yml +35 -0
  43. data/test/helper.rb +37 -0
  44. data/test/i18n_test.rb +194 -0
  45. data/test/lib/activerecord_test_case.rb +43 -0
  46. data/test/lib/activerecord_test_connector.rb +75 -0
  47. data/test/lib/load_fixtures.rb +11 -0
  48. data/test/lib/view_test_process.rb +179 -0
  49. data/test/tasks.rake +59 -0
  50. data/test/view_test.rb +289 -0
  51. metadata +122 -0
@@ -0,0 +1,11 @@
1
+ en:
2
+ will_paginate:
3
+ previous_label: '« Previous'
4
+ next_label: 'Next »'
5
+ gap_marker: '<span class="gap">&hellip;</span>'
6
+ entry_name: 'entry'
7
+ page_entries_info:
8
+ zero: 'No {{pluralized_entry_name}} found'
9
+ one: 'Displaying <em>1</em> {{entry_name}}'
10
+ all: 'Displaying <em>all {{total_count}}</em> {{pluralized_entry_name}}'
11
+ n_to_m_of_x: 'Displaying {{pluralized_entry_name}} <em>{{start_count}}&nbsp;-&nbsp;{{end_count}}</em> of <em>{{total_count}}</em> in total'
@@ -0,0 +1,106 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{pb-will_paginate}
8
+ s.version = "2.3.12"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Mislav Marohni\304\207", "PJ Hyett"]
12
+ s.date = %q{2010-02-01}
13
+ s.description = %q{The will_paginate library provides a simple, yet powerful and extensible API for ActiveRecord pagination and rendering of pagination links in ActionView templates.}
14
+ s.email = %q{mislav.marohnic@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ ".manifest",
22
+ "CHANGELOG.rdoc",
23
+ "LICENSE",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "examples/apple-circle.gif",
28
+ "examples/index.haml",
29
+ "examples/index.html",
30
+ "examples/pagination.css",
31
+ "examples/pagination.sass",
32
+ "init.rb",
33
+ "lib/will_paginate.rb",
34
+ "lib/will_paginate/array.rb",
35
+ "lib/will_paginate/collection.rb",
36
+ "lib/will_paginate/core_ext.rb",
37
+ "lib/will_paginate/finder.rb",
38
+ "lib/will_paginate/i18n.rb",
39
+ "lib/will_paginate/named_scope.rb",
40
+ "lib/will_paginate/named_scope_patch.rb",
41
+ "lib/will_paginate/version.rb",
42
+ "lib/will_paginate/view_helpers.rb",
43
+ "locales/en.yml",
44
+ "pb-will_paginate.gemspec",
45
+ "test/boot.rb",
46
+ "test/collection_test.rb",
47
+ "test/console",
48
+ "test/database.yml",
49
+ "test/finder_test.rb",
50
+ "test/fixtures/admin.rb",
51
+ "test/fixtures/developer.rb",
52
+ "test/fixtures/developers_projects.yml",
53
+ "test/fixtures/project.rb",
54
+ "test/fixtures/projects.yml",
55
+ "test/fixtures/replies.yml",
56
+ "test/fixtures/reply.rb",
57
+ "test/fixtures/schema.rb",
58
+ "test/fixtures/topic.rb",
59
+ "test/fixtures/topics.yml",
60
+ "test/fixtures/user.rb",
61
+ "test/fixtures/users.yml",
62
+ "test/helper.rb",
63
+ "test/i18n_test.rb",
64
+ "test/lib/activerecord_test_case.rb",
65
+ "test/lib/activerecord_test_connector.rb",
66
+ "test/lib/load_fixtures.rb",
67
+ "test/lib/view_test_process.rb",
68
+ "test/tasks.rake",
69
+ "test/view_test.rb"
70
+ ]
71
+ s.homepage = %q{http://github.com/mislav/will_paginate/wikis}
72
+ s.rdoc_options = ["--charset=UTF-8"]
73
+ s.require_paths = ["lib"]
74
+ s.rubygems_version = %q{1.3.5}
75
+ s.summary = %q{Most awesome pagination solution for Rails}
76
+ s.test_files = [
77
+ "test/helper.rb",
78
+ "test/view_test.rb",
79
+ "test/fixtures/admin.rb",
80
+ "test/fixtures/topic.rb",
81
+ "test/fixtures/schema.rb",
82
+ "test/fixtures/reply.rb",
83
+ "test/fixtures/project.rb",
84
+ "test/fixtures/user.rb",
85
+ "test/fixtures/developer.rb",
86
+ "test/lib/view_test_process.rb",
87
+ "test/lib/activerecord_test_case.rb",
88
+ "test/lib/load_fixtures.rb",
89
+ "test/lib/activerecord_test_connector.rb",
90
+ "test/finder_test.rb",
91
+ "test/i18n_test.rb",
92
+ "test/boot.rb",
93
+ "test/collection_test.rb"
94
+ ]
95
+
96
+ if s.respond_to? :specification_version then
97
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
98
+ s.specification_version = 3
99
+
100
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
101
+ else
102
+ end
103
+ else
104
+ end
105
+ end
106
+
@@ -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,143 @@
1
+ require 'helper'
2
+ require 'will_paginate/array'
3
+
4
+ class ArrayPaginationTest < Test::Unit::TestCase
5
+
6
+ def setup ; end
7
+
8
+ def test_simple
9
+ collection = ('a'..'e').to_a
10
+
11
+ [{ :page => 1, :per_page => 3, :expected => %w( a b c ) },
12
+ { :page => 2, :per_page => 3, :expected => %w( d e ) },
13
+ { :page => 1, :per_page => 5, :expected => %w( a b c d e ) },
14
+ { :page => 3, :per_page => 5, :expected => [] },
15
+ ].
16
+ each do |conditions|
17
+ expected = conditions.delete :expected
18
+ assert_equal expected, collection.paginate(conditions)
19
+ end
20
+ end
21
+
22
+ def test_defaults
23
+ result = (1..50).to_a.paginate
24
+ assert_equal 1, result.current_page
25
+ assert_equal 30, result.size
26
+ end
27
+
28
+ def test_deprecated_api
29
+ assert_raise(ArgumentError) { [].paginate(2) }
30
+ assert_raise(ArgumentError) { [].paginate(2, 10) }
31
+ end
32
+
33
+ def test_total_entries_has_precedence
34
+ result = %w(a b c).paginate :total_entries => 5
35
+ assert_equal 5, result.total_entries
36
+ end
37
+
38
+ def test_argument_error_with_params_and_another_argument
39
+ assert_raise ArgumentError do
40
+ [].paginate({}, 5)
41
+ end
42
+ end
43
+
44
+ def test_paginated_collection
45
+ entries = %w(a b c)
46
+ collection = create(2, 3, 10) do |pager|
47
+ assert_equal entries, pager.replace(entries)
48
+ end
49
+
50
+ assert_equal entries, collection
51
+ assert_respond_to_all collection, %w(total_pages each offset size current_page per_page total_entries)
52
+ assert_kind_of Array, collection
53
+ assert_instance_of Array, collection.entries
54
+ assert_equal 3, collection.offset
55
+ assert_equal 4, collection.total_pages
56
+ assert !collection.out_of_bounds?
57
+ end
58
+
59
+ def test_previous_next_pages
60
+ collection = create(1, 1, 3)
61
+ assert_nil collection.previous_page
62
+ assert_equal 2, collection.next_page
63
+
64
+ collection = create(2, 1, 3)
65
+ assert_equal 1, collection.previous_page
66
+ assert_equal 3, collection.next_page
67
+
68
+ collection = create(3, 1, 3)
69
+ assert_equal 2, collection.previous_page
70
+ assert_nil collection.next_page
71
+ end
72
+
73
+ def test_out_of_bounds
74
+ entries = create(2, 3, 2){}
75
+ assert entries.out_of_bounds?
76
+
77
+ entries = create(1, 3, 2){}
78
+ assert !entries.out_of_bounds?
79
+ end
80
+
81
+ def test_guessing_total_count
82
+ entries = create do |pager|
83
+ # collection is shorter than limit
84
+ pager.replace array
85
+ end
86
+ assert_equal 8, entries.total_entries
87
+
88
+ entries = create(2, 5, 10) do |pager|
89
+ # collection is shorter than limit, but we have an explicit count
90
+ pager.replace array
91
+ end
92
+ assert_equal 10, entries.total_entries
93
+
94
+ entries = create do |pager|
95
+ # collection is the same as limit; we can't guess
96
+ pager.replace array(5)
97
+ end
98
+ assert_equal nil, entries.total_entries
99
+
100
+ entries = create do |pager|
101
+ # collection is empty; we can't guess
102
+ pager.replace array(0)
103
+ end
104
+ assert_equal nil, entries.total_entries
105
+
106
+ entries = create(1) do |pager|
107
+ # collection is empty and we're on page 1,
108
+ # so the whole thing must be empty, too
109
+ pager.replace array(0)
110
+ end
111
+ assert_equal 0, entries.total_entries
112
+ end
113
+
114
+ def test_invalid_page
115
+ bad_inputs = [0, -1, nil, '', 'Schnitzel']
116
+
117
+ bad_inputs.each do |bad|
118
+ assert_raise(WillPaginate::InvalidPage) { create bad }
119
+ end
120
+ end
121
+
122
+ def test_invalid_per_page_setting
123
+ assert_raise(ArgumentError) { create(1, -1) }
124
+ end
125
+
126
+ def test_page_count_was_removed
127
+ assert_raise(NoMethodError) { create.page_count }
128
+ # It's `total_pages` now.
129
+ end
130
+
131
+ private
132
+ def create(page = 2, limit = 5, total = nil, &block)
133
+ if block_given?
134
+ WillPaginate::Collection.create(page, limit, total, &block)
135
+ else
136
+ WillPaginate::Collection.new(page, limit, total)
137
+ end
138
+ end
139
+
140
+ def array(size = 3)
141
+ Array.new(size)
142
+ end
143
+ 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: root
13
+ password:
14
+ encoding: utf8
15
+ database: will_paginate_unittest
16
+
17
+ postgres:
18
+ adapter: postgresql
19
+ username: mislav
20
+ password:
21
+ database: will_paginate_unittest
22
+ min_messages: warning
@@ -0,0 +1,473 @@
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
+ def test_named_scope_with_include
266
+ project = projects(:active_record)
267
+ entries = project.topics.with_replies_starting_with('AR ').paginate(:page => 1, :per_page => 1)
268
+ assert_equal 1, entries.size
269
+ end
270
+
271
+ ## misc ##
272
+
273
+ def test_count_and_total_entries_options_are_mutually_exclusive
274
+ e = assert_raise ArgumentError do
275
+ Developer.paginate :page => 1, :count => {}, :total_entries => 1
276
+ end
277
+ assert_match /exclusive/, e.to_s
278
+ end
279
+
280
+ def test_readonly
281
+ assert_nothing_raised { Developer.paginate :readonly => true, :page => 1 }
282
+ end
283
+
284
+ # this functionality is temporarily removed
285
+ def xtest_pagination_defines_method
286
+ pager = "paginate_by_created_at"
287
+ assert !User.methods.include_method?(pager), "User methods should not include `#{pager}` method"
288
+ # paginate!
289
+ assert 0, User.send(pager, nil, :page => 1).total_entries
290
+ # the paging finder should now be defined
291
+ assert User.methods.include_method?(pager), "`#{pager}` method should be defined on User"
292
+ end
293
+
294
+ # Is this Rails 2.0? Find out by testing find_all which was removed in [6998]
295
+ unless ActiveRecord::Base.respond_to? :find_all
296
+ def test_paginate_array_of_ids
297
+ # AR finders also accept arrays of IDs
298
+ # (this was broken in Rails before [6912])
299
+ assert_queries(1) do
300
+ entries = Developer.paginate((1..8).to_a, :per_page => 3, :page => 2, :order => 'id')
301
+ assert_equal (4..6).to_a, entries.map(&:id)
302
+ assert_equal 8, entries.total_entries
303
+ end
304
+ end
305
+ end
306
+
307
+ uses_mocha 'internals' do
308
+ def test_implicit_all_with_dynamic_finders
309
+ Topic.expects(:find_all_by_foo).returns([])
310
+ Topic.expects(:count).returns(0)
311
+ Topic.paginate_by_foo :page => 2
312
+ end
313
+
314
+ def test_guessing_the_total_count
315
+ Topic.expects(:find).returns(Array.new(2))
316
+ Topic.expects(:count).never
317
+
318
+ entries = Topic.paginate :page => 2, :per_page => 4
319
+ assert_equal 6, entries.total_entries
320
+ end
321
+
322
+ def test_guessing_that_there_are_no_records
323
+ Topic.expects(:find).returns([])
324
+ Topic.expects(:count).never
325
+
326
+ entries = Topic.paginate :page => 1, :per_page => 4
327
+ assert_equal 0, entries.total_entries
328
+ end
329
+
330
+ def test_extra_parameters_stay_untouched
331
+ Topic.expects(:find).with(:all, {:foo => 'bar', :limit => 4, :offset => 0 }).returns(Array.new(5))
332
+ Topic.expects(:count).with({:foo => 'bar'}).returns(1)
333
+
334
+ Topic.paginate :foo => 'bar', :page => 1, :per_page => 4
335
+ end
336
+
337
+ def test_count_skips_select
338
+ Developer.stubs(:find).returns([])
339
+ Developer.expects(:count).with({}).returns(0)
340
+ Developer.paginate :select => 'salary', :page => 2
341
+ end
342
+
343
+ def test_count_select_when_distinct
344
+ Developer.stubs(:find).returns([])
345
+ Developer.expects(:count).with(:select => 'DISTINCT salary').returns(0)
346
+ Developer.paginate :select => 'DISTINCT salary', :page => 2
347
+ end
348
+
349
+ def test_count_with_scoped_select_when_distinct
350
+ Developer.stubs(:find).returns([])
351
+ Developer.expects(:count).with(:select => 'DISTINCT users.id').returns(0)
352
+ Developer.distinct.paginate :page => 2
353
+ end
354
+
355
+ def test_should_use_scoped_finders_if_present
356
+ # scope-out compatibility
357
+ Topic.expects(:find_best).returns(Array.new(5))
358
+ Topic.expects(:with_best).returns(1)
359
+
360
+ Topic.paginate_best :page => 1, :per_page => 4
361
+ end
362
+
363
+ def test_paginate_by_sql
364
+ sql = "SELECT * FROM users WHERE type = 'Developer' ORDER BY id"
365
+ entries = Developer.paginate_by_sql(sql, :page => 2, :per_page => 3)
366
+ assert_equal 11, entries.total_entries
367
+ assert_equal [users(:dev_4), users(:dev_5), users(:dev_6)], entries
368
+ end
369
+
370
+ def test_paginate_by_sql_respects_total_entries_setting
371
+ sql = "SELECT * FROM users"
372
+ entries = Developer.paginate_by_sql(sql, :page => 1, :total_entries => 999)
373
+ assert_equal 999, entries.total_entries
374
+ end
375
+
376
+ def test_paginate_by_sql_strips_order_by_when_counting
377
+ Developer.expects(:find_by_sql).returns([])
378
+ Developer.expects(:count_by_sql).with("SELECT COUNT(*) FROM (sql\n ) AS count_table").returns(0)
379
+
380
+ Developer.paginate_by_sql "sql\n ORDER\nby foo, bar, `baz` ASC", :page => 2
381
+ end
382
+
383
+ # TODO: counts are still wrong
384
+ def test_ability_to_use_with_custom_finders
385
+ # acts_as_taggable defines find_tagged_with(tag, options)
386
+ Topic.expects(:find_tagged_with).with('will_paginate', :offset => 5, :limit => 5).returns([])
387
+ Topic.expects(:count).with({}).returns(0)
388
+
389
+ Topic.paginate_tagged_with 'will_paginate', :page => 2, :per_page => 5
390
+ end
391
+
392
+ def test_array_argument_doesnt_eliminate_count
393
+ ids = (1..8).to_a
394
+ Developer.expects(:find_all_by_id).returns([])
395
+ Developer.expects(:count).returns(0)
396
+
397
+ Developer.paginate_by_id(ids, :per_page => 3, :page => 2, :order => 'id')
398
+ end
399
+
400
+ def test_paginating_finder_doesnt_mangle_options
401
+ Developer.expects(:find).returns([])
402
+ options = { :page => 1, :per_page => 2, :foo => 'bar' }
403
+ options_before = options.dup
404
+
405
+ Developer.paginate(options)
406
+ assert_equal options_before, options
407
+ end
408
+
409
+ def test_paginate_by_sql_doesnt_change_original_query
410
+ query = 'SQL QUERY'
411
+ original_query = query.dup
412
+ Developer.expects(:find_by_sql).returns([])
413
+
414
+ Developer.paginate_by_sql query, :page => 1
415
+ assert_equal original_query, query
416
+ end
417
+
418
+ def test_paginated_each
419
+ collection = stub('collection', :size => 5, :empty? => false, :per_page => 5)
420
+ collection.expects(:each).times(2).returns(collection)
421
+ last_collection = stub('collection', :size => 4, :empty? => false, :per_page => 5)
422
+ last_collection.expects(:each).returns(last_collection)
423
+
424
+ params = { :order => 'id', :total_entries => 0 }
425
+
426
+ Developer.expects(:paginate).with(params.merge(:page => 2)).returns(collection)
427
+ Developer.expects(:paginate).with(params.merge(:page => 3)).returns(collection)
428
+ Developer.expects(:paginate).with(params.merge(:page => 4)).returns(last_collection)
429
+
430
+ assert_equal 14, Developer.paginated_each(:page => '2') { }
431
+ end
432
+
433
+ def test_paginated_each_with_named_scope
434
+ assert_equal 2, Developer.poor.paginated_each(:per_page => 1) {
435
+ assert_equal 11, Developer.count
436
+ }
437
+ end
438
+
439
+ # detect ActiveRecord 2.1
440
+ if ActiveRecord::Base.private_methods.include_method?(:references_eager_loaded_tables?)
441
+ def test_removes_irrelevant_includes_in_count
442
+ Developer.expects(:find).returns([1])
443
+ Developer.expects(:count).with({}).returns(0)
444
+
445
+ Developer.paginate :page => 1, :per_page => 1, :include => :projects
446
+ end
447
+
448
+ def test_doesnt_remove_referenced_includes_in_count
449
+ Developer.expects(:find).returns([1])
450
+ Developer.expects(:count).with({ :include => :projects, :conditions => 'projects.id > 2' }).returns(0)
451
+
452
+ Developer.paginate :page => 1, :per_page => 1,
453
+ :include => :projects, :conditions => 'projects.id > 2'
454
+ end
455
+ end
456
+
457
+ def test_paginate_from
458
+ result = Developer.paginate(:from => 'users', :page => 1, :per_page => 1)
459
+ assert_equal 1, result.size
460
+ end
461
+
462
+ def test_hmt_with_include
463
+ # ticket #220
464
+ reply = projects(:active_record).replies.find(:first, :order => 'replies.id')
465
+ assert_equal replies(:decisive), reply
466
+
467
+ # ticket #223
468
+ Project.find(1, :include => :replies)
469
+
470
+ # I cannot reproduce any of the failures from those reports :(
471
+ end
472
+ end
473
+ end