shingara-will_paginate 2.3.3

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.rdoc +94 -0
  2. data/LICENSE +18 -0
  3. data/README.rdoc +106 -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/array.rb +16 -0
  12. data/lib/will_paginate/collection.rb +146 -0
  13. data/lib/will_paginate/core_ext.rb +32 -0
  14. data/lib/will_paginate/finder.rb +247 -0
  15. data/lib/will_paginate/named_scope.rb +132 -0
  16. data/lib/will_paginate/named_scope_patch.rb +39 -0
  17. data/lib/will_paginate/version.rb +9 -0
  18. data/lib/will_paginate/view_helpers.rb +383 -0
  19. data/lib/will_paginate.rb +82 -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 +443 -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 +59 -0
  43. data/test/view_test.rb +363 -0
  44. metadata +140 -0
@@ -0,0 +1,36 @@
1
+ require 'lib/activerecord_test_connector'
2
+
3
+ class ActiveRecordTestCase < Test::Unit::TestCase
4
+ # Set our fixture path
5
+ if ActiveRecordTestConnector.able_to_connect
6
+ self.fixture_path = File.join(File.dirname(__FILE__), '..', 'fixtures')
7
+ self.use_transactional_fixtures = true
8
+ end
9
+
10
+ def self.fixtures(*args)
11
+ super if ActiveRecordTestConnector.connected
12
+ end
13
+
14
+ def run(*args)
15
+ super if ActiveRecordTestConnector.connected
16
+ end
17
+
18
+ # Default so Test::Unit::TestCase doesn't complain
19
+ def test_truth
20
+ end
21
+
22
+ protected
23
+
24
+ def assert_queries(num = 1)
25
+ $query_count = 0
26
+ yield
27
+ ensure
28
+ assert_equal num, $query_count, "#{$query_count} instead of #{num} queries were executed."
29
+ end
30
+
31
+ def assert_no_queries(&block)
32
+ assert_queries(0, &block)
33
+ end
34
+ end
35
+
36
+ ActiveRecordTestConnector.setup
@@ -0,0 +1,69 @@
1
+ require 'active_record'
2
+ require 'active_record/version'
3
+ require 'active_record/fixtures'
4
+
5
+ class ActiveRecordTestConnector
6
+ cattr_accessor :able_to_connect
7
+ cattr_accessor :connected
8
+
9
+ FIXTURES_PATH = File.join(File.dirname(__FILE__), '..', 'fixtures')
10
+
11
+ # Set our defaults
12
+ self.connected = false
13
+ self.able_to_connect = true
14
+
15
+ def self.setup
16
+ unless self.connected || !self.able_to_connect
17
+ setup_connection
18
+ load_schema
19
+ Dependencies.load_paths.unshift FIXTURES_PATH
20
+ self.connected = true
21
+ end
22
+ rescue Exception => e # errors from ActiveRecord setup
23
+ $stderr.puts "\nSkipping ActiveRecord tests: #{e}"
24
+ $stderr.puts "Install SQLite3 to run the full test suite for will_paginate.\n\n"
25
+ self.able_to_connect = false
26
+ end
27
+
28
+ private
29
+
30
+ def self.setup_connection
31
+ db = ENV['DB'].blank?? 'sqlite3' : ENV['DB']
32
+
33
+ configurations = YAML.load_file(File.join(File.dirname(__FILE__), '..', 'database.yml'))
34
+ raise "no configuration for '#{db}'" unless configurations.key? db
35
+ configuration = configurations[db]
36
+
37
+ ActiveRecord::Base.logger = Logger.new(STDOUT) if $0 == 'irb'
38
+ puts "using #{configuration['adapter']} adapter" unless ENV['DB'].blank?
39
+
40
+ ActiveRecord::Base.establish_connection(configuration)
41
+ ActiveRecord::Base.configurations = { db => configuration }
42
+ prepare ActiveRecord::Base.connection
43
+
44
+ unless Object.const_defined?(:QUOTED_TYPE)
45
+ Object.send :const_set, :QUOTED_TYPE, ActiveRecord::Base.connection.quote_column_name('type')
46
+ end
47
+ end
48
+
49
+ def self.load_schema
50
+ ActiveRecord::Base.silence do
51
+ ActiveRecord::Migration.verbose = false
52
+ load File.join(FIXTURES_PATH, 'schema.rb')
53
+ end
54
+ end
55
+
56
+ def self.prepare(conn)
57
+ class << conn
58
+ IGNORED_SQL = [/^PRAGMA/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SHOW FIELDS /]
59
+
60
+ def execute_with_counting(sql, name = nil, &block)
61
+ $query_count ||= 0
62
+ $query_count += 1 unless IGNORED_SQL.any? { |r| sql =~ r }
63
+ execute_without_counting(sql, name, &block)
64
+ end
65
+
66
+ alias_method_chain :execute, :counting
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,11 @@
1
+ require 'boot'
2
+ require 'lib/activerecord_test_connector'
3
+
4
+ # setup the connection
5
+ ActiveRecordTestConnector.setup
6
+
7
+ # load all fixtures
8
+ Fixtures.create_fixtures(ActiveRecordTestConnector::FIXTURES_PATH, ActiveRecord::Base.connection.tables)
9
+
10
+ require 'will_paginate'
11
+ WillPaginate.enable_activerecord
@@ -0,0 +1,165 @@
1
+ require 'action_controller'
2
+ require 'action_controller/test_process'
3
+
4
+ require 'will_paginate'
5
+ WillPaginate.enable_actionpack
6
+
7
+ ActionController::Routing::Routes.draw do |map|
8
+ map.connect 'dummy/page/:page', :controller => 'dummy'
9
+ map.connect 'dummy/dots/page.:page', :controller => 'dummy', :action => 'dots'
10
+ map.connect 'ibocorp/:page', :controller => 'ibocorp',
11
+ :requirements => { :page => /\d+/ },
12
+ :defaults => { :page => 1 }
13
+
14
+ map.connect ':controller/:action/:id'
15
+ end
16
+
17
+ ActionController::Base.perform_caching = false
18
+
19
+ class WillPaginate::ViewTestCase < Test::Unit::TestCase
20
+ def setup
21
+ super
22
+ @controller = DummyController.new
23
+ @request = @controller.request
24
+ @html_result = nil
25
+ @template = '<%= will_paginate collection, options %>'
26
+
27
+ @view = ActionView::Base.new
28
+ @view.assigns['controller'] = @controller
29
+ @view.assigns['_request'] = @request
30
+ @view.assigns['_params'] = @request.params
31
+ end
32
+
33
+ def test_no_complain; end
34
+
35
+ protected
36
+
37
+ def paginate(collection = {}, options = {}, &block)
38
+ if collection.instance_of? Hash
39
+ page_options = { :page => 1, :total_entries => 11, :per_page => 4 }.merge(collection)
40
+ collection = [1].paginate(page_options)
41
+ end
42
+
43
+ locals = { :collection => collection, :options => options }
44
+
45
+ if defined? ActionView::InlineTemplate
46
+ # Rails 2.1
47
+ args = [ ActionView::InlineTemplate.new(@view, @template, locals) ]
48
+ else
49
+ # older Rails versions
50
+ args = [nil, @template, nil, locals]
51
+ end
52
+
53
+ @html_result = @view.render_template(*args)
54
+ @html_document = HTML::Document.new(@html_result, true, false)
55
+
56
+ if block_given?
57
+ classname = options[:class] || WillPaginate::ViewHelpers.pagination_options[:class]
58
+ assert_select("div.#{classname}", 1, 'no main DIV', &block)
59
+ end
60
+ end
61
+
62
+ def response_from_page_or_rjs
63
+ @html_document.root
64
+ end
65
+
66
+ def validate_page_numbers expected, links, param_name = :page
67
+ param_pattern = /\W#{CGI.escape(param_name.to_s)}=([^&]*)/
68
+
69
+ assert_equal(expected, links.map { |e|
70
+ e['href'] =~ param_pattern
71
+ $1 ? $1.to_i : $1
72
+ })
73
+ end
74
+
75
+ def assert_links_match pattern, links = nil, numbers = nil
76
+ links ||= assert_select 'div.pagination a[href]' do |elements|
77
+ elements
78
+ end
79
+
80
+ pages = [] if numbers
81
+
82
+ links.each do |el|
83
+ assert_match pattern, el['href']
84
+ if numbers
85
+ el['href'] =~ pattern
86
+ pages << ($1.nil?? nil : $1.to_i)
87
+ end
88
+ end
89
+
90
+ assert_equal numbers, pages, "page numbers don't match" if numbers
91
+ end
92
+
93
+ def assert_no_links_match pattern
94
+ assert_select 'div.pagination a[href]' do |elements|
95
+ elements.each do |el|
96
+ assert_no_match pattern, el['href']
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+ class DummyRequest
103
+ attr_accessor :symbolized_path_parameters
104
+
105
+ def initialize
106
+ @get = true
107
+ @params = {}
108
+ @symbolized_path_parameters = { :controller => 'foo', :action => 'bar' }
109
+ end
110
+
111
+ def get?
112
+ @get
113
+ end
114
+
115
+ def post
116
+ @get = false
117
+ end
118
+
119
+ def relative_url_root
120
+ ''
121
+ end
122
+
123
+ def params(more = nil)
124
+ @params.update(more) if more
125
+ @params
126
+ end
127
+ end
128
+
129
+ class DummyController
130
+ attr_reader :request
131
+ attr_accessor :controller_name
132
+
133
+ def initialize
134
+ @request = DummyRequest.new
135
+ @url = ActionController::UrlRewriter.new(@request, @request.params)
136
+ end
137
+
138
+ def params
139
+ @request.params
140
+ end
141
+
142
+ def url_for(params)
143
+ @url.rewrite(params)
144
+ end
145
+ end
146
+
147
+ module HTML
148
+ Node.class_eval do
149
+ def inner_text
150
+ children.map(&:inner_text).join('')
151
+ end
152
+ end
153
+
154
+ Text.class_eval do
155
+ def inner_text
156
+ self.to_s
157
+ end
158
+ end
159
+
160
+ Tag.class_eval do
161
+ def inner_text
162
+ childless?? '' : super
163
+ end
164
+ end
165
+ end
data/test/tasks.rake ADDED
@@ -0,0 +1,59 @@
1
+ require 'rake/testtask'
2
+
3
+ desc 'Test the will_paginate plugin.'
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.pattern = 'test/**/*_test.rb'
6
+ t.verbose = true
7
+ t.libs << 'test'
8
+ end
9
+
10
+ # I want to specify environment variables at call time
11
+ class EnvTestTask < Rake::TestTask
12
+ attr_accessor :env
13
+
14
+ def ruby(*args)
15
+ env.each { |key, value| ENV[key] = value } if env
16
+ super
17
+ env.keys.each { |key| ENV.delete key } if env
18
+ end
19
+ end
20
+
21
+ for configuration in %w( sqlite3 mysql postgres )
22
+ EnvTestTask.new("test_#{configuration}") do |t|
23
+ t.pattern = 'test/finder_test.rb'
24
+ t.verbose = true
25
+ t.env = { 'DB' => configuration }
26
+ t.libs << 'test'
27
+ end
28
+ end
29
+
30
+ task :test_databases => %w(test_mysql test_sqlite3 test_postgres)
31
+
32
+ desc %{Test everything on SQLite3, MySQL and PostgreSQL}
33
+ task :test_full => %w(test test_mysql test_postgres)
34
+
35
+ desc %{Test everything with Rails 2.1.x, 2.0.x & 1.2.x gems}
36
+ task :test_all do
37
+ all = Rake::Task['test_full']
38
+ versions = %w(2.1.0 2.0.2 1.2.6)
39
+ versions.each do |version|
40
+ ENV['RAILS_VERSION'] = "~> #{version}"
41
+ all.invoke
42
+ reset_invoked unless version == versions.last
43
+ end
44
+ end
45
+
46
+ def reset_invoked
47
+ %w( test_full test test_mysql test_postgres ).each do |name|
48
+ Rake::Task[name].instance_variable_set '@already_invoked', false
49
+ end
50
+ end
51
+
52
+ task :rcov do
53
+ excludes = %w( lib/will_paginate/named_scope*
54
+ lib/will_paginate/core_ext.rb
55
+ lib/will_paginate.rb
56
+ rails* )
57
+
58
+ system %[rcov -Itest:lib test/*.rb -x #{excludes.join(',')}]
59
+ end
data/test/view_test.rb ADDED
@@ -0,0 +1,363 @@
1
+ require 'helper'
2
+ require 'lib/view_test_process'
3
+
4
+ class AdditionalLinkAttributesRenderer < WillPaginate::LinkRenderer
5
+ def initialize(link_attributes = nil)
6
+ super()
7
+ @additional_link_attributes = link_attributes || { :default => 'true' }
8
+ end
9
+
10
+ def page_link(page, text, attributes = {})
11
+ @template.link_to text, url_for(page), attributes.merge(@additional_link_attributes)
12
+ end
13
+ end
14
+
15
+ class ViewTest < WillPaginate::ViewTestCase
16
+
17
+ ## basic pagination ##
18
+
19
+ def test_will_paginate
20
+ paginate do |pagination|
21
+ assert_select 'a[href]', 3 do |elements|
22
+ validate_page_numbers [2,3,2], elements
23
+ assert_select elements.last, ':last-child', "Next &raquo;"
24
+ end
25
+ assert_select 'span', 2
26
+ assert_select 'span.disabled:first-child', '&laquo; Previous'
27
+ assert_select 'span.current', '1'
28
+ assert_equal '&laquo; Previous 1 2 3 Next &raquo;', pagination.first.inner_text
29
+ end
30
+ end
31
+
32
+ def test_no_pagination_when_page_count_is_one
33
+ paginate :per_page => 30
34
+ assert_equal '', @html_result
35
+ end
36
+
37
+ def test_will_paginate_with_options
38
+ paginate({ :page => 2 },
39
+ :class => 'will_paginate', :previous_label => 'Prev', :next_label => 'Next') do
40
+ assert_select 'a[href]', 4 do |elements|
41
+ validate_page_numbers [1,1,3,3], elements
42
+ # test rel attribute values:
43
+ assert_select elements[1], 'a', '1' do |link|
44
+ assert_equal 'prev start', link.first['rel']
45
+ end
46
+ assert_select elements.first, 'a', "Prev" do |link|
47
+ assert_equal 'prev start', link.first['rel']
48
+ end
49
+ assert_select elements.last, 'a', "Next" do |link|
50
+ assert_equal 'next', link.first['rel']
51
+ end
52
+ end
53
+ assert_select 'span.current', '2'
54
+ end
55
+ end
56
+
57
+ def test_will_paginate_using_renderer_class
58
+ paginate({}, :renderer => AdditionalLinkAttributesRenderer) do
59
+ assert_select 'a[default=true]', 3
60
+ end
61
+ end
62
+
63
+ def test_will_paginate_using_renderer_instance
64
+ renderer = WillPaginate::LinkRenderer.new
65
+ renderer.gap_marker = '<span class="my-gap">~~</span>'
66
+
67
+ paginate({ :per_page => 2 }, :inner_window => 0, :outer_window => 0, :renderer => renderer) do
68
+ assert_select 'span.my-gap', '~~'
69
+ end
70
+
71
+ renderer = AdditionalLinkAttributesRenderer.new(:title => 'rendered')
72
+ paginate({}, :renderer => renderer) do
73
+ assert_select 'a[title=rendered]', 3
74
+ end
75
+ end
76
+
77
+ def test_prev_next_links_have_classnames
78
+ paginate do |pagination|
79
+ assert_select 'span.disabled.prev_page:first-child'
80
+ assert_select 'a.next_page[href]:last-child'
81
+ end
82
+ end
83
+
84
+ def test_prev_label_deprecated
85
+ assert_deprecated ':previous_label' do
86
+ paginate({ :page => 2 }, :prev_label => 'Deprecated') do
87
+ assert_select 'a[href]:first-child', 'Deprecated'
88
+ end
89
+ end
90
+ end
91
+
92
+ def test_full_output
93
+ paginate
94
+ expected = <<-HTML
95
+ <div class="pagination"><span class="disabled prev_page">&laquo; Previous</span>
96
+ <span class="current">1</span>
97
+ <a href="/foo/bar?page=2" rel="next">2</a>
98
+ <a href="/foo/bar?page=3">3</a>
99
+ <a href="/foo/bar?page=2" class="next_page" rel="next">Next &raquo;</a></div>
100
+ HTML
101
+ expected.strip!.gsub!(/\s{2,}/, ' ')
102
+
103
+ assert_dom_equal expected, @html_result
104
+ end
105
+
106
+ def test_escaping_of_urls
107
+ paginate({:page => 1, :per_page => 1, :total_entries => 2},
108
+ :page_links => false, :params => { :tag => '<br>' })
109
+
110
+ assert_select 'a[href]', 1 do |links|
111
+ query = links.first['href'].split('?', 2)[1]
112
+ assert_equal %w(page=2 tag=%3Cbr%3E), query.split('&amp;').sort
113
+ end
114
+ end
115
+
116
+ ## advanced options for pagination ##
117
+
118
+ def test_will_paginate_without_container
119
+ paginate({}, :container => false)
120
+ assert_select 'div.pagination', 0, 'main DIV present when it shouldn\'t'
121
+ assert_select 'a[href]', 3
122
+ end
123
+
124
+ def test_will_paginate_without_page_links
125
+ paginate({ :page => 2 }, :page_links => false) do
126
+ assert_select 'a[href]', 2 do |elements|
127
+ validate_page_numbers [1,3], elements
128
+ end
129
+ end
130
+ end
131
+
132
+ def test_will_paginate_windows
133
+ paginate({ :page => 6, :per_page => 1 }, :inner_window => 1) do |pagination|
134
+ assert_select 'a[href]', 8 do |elements|
135
+ validate_page_numbers [5,1,2,5,7,10,11,7], elements
136
+ assert_select elements.first, 'a', '&laquo; Previous'
137
+ assert_select elements.last, 'a', 'Next &raquo;'
138
+ end
139
+ assert_select 'span.current', '6'
140
+ assert_equal '&laquo; Previous 1 2 &hellip; 5 6 7 &hellip; 10 11 Next &raquo;', pagination.first.inner_text
141
+ end
142
+ end
143
+
144
+ def test_will_paginate_eliminates_small_gaps
145
+ paginate({ :page => 6, :per_page => 1 }, :inner_window => 2) do
146
+ assert_select 'a[href]', 12 do |elements|
147
+ validate_page_numbers [5,1,2,3,4,5,7,8,9,10,11,7], elements
148
+ end
149
+ end
150
+ end
151
+
152
+ def test_container_id
153
+ paginate do |div|
154
+ assert_nil div.first['id']
155
+ end
156
+
157
+ # magic ID
158
+ paginate({}, :id => true) do |div|
159
+ assert_equal 'fixnums_pagination', div.first['id']
160
+ end
161
+
162
+ # explicit ID
163
+ paginate({}, :id => 'custom_id') do |div|
164
+ assert_equal 'custom_id', div.first['id']
165
+ end
166
+ end
167
+
168
+ ## other helpers ##
169
+
170
+ def test_paginated_section
171
+ @template = <<-ERB
172
+ <% paginated_section collection, options do %>
173
+ <%= content_tag :div, '', :id => "developers" %>
174
+ <% end %>
175
+ ERB
176
+
177
+ paginate
178
+ assert_select 'div.pagination', 2
179
+ assert_select 'div.pagination + div#developers', 1
180
+ end
181
+
182
+ def test_page_entries_info
183
+ @template = '<%= page_entries_info collection %>'
184
+ array = ('a'..'z').to_a
185
+
186
+ paginate array.paginate(:page => 2, :per_page => 5)
187
+ assert_equal %{Displaying strings <b>6&nbsp;-&nbsp;10</b> of <b>26</b> in total},
188
+ @html_result
189
+
190
+ paginate array.paginate(:page => 7, :per_page => 4)
191
+ assert_equal %{Displaying strings <b>25&nbsp;-&nbsp;26</b> of <b>26</b> in total},
192
+ @html_result
193
+ end
194
+
195
+ def test_page_entries_info_with_longer_class_name
196
+ @template = '<%= page_entries_info collection %>'
197
+ collection = ('a'..'z').to_a.paginate
198
+ collection.first.stubs(:class).returns(mock('class', :name => 'ProjectType'))
199
+
200
+ paginate collection
201
+ assert @html_result.index('project types'), "expected <#{@html_result.inspect}> to mention 'project types'"
202
+ end
203
+
204
+ def test_page_entries_info_with_single_page_collection
205
+ @template = '<%= page_entries_info collection %>'
206
+
207
+ paginate(('a'..'d').to_a.paginate(:page => 1, :per_page => 5))
208
+ assert_equal %{Displaying <b>all 4</b> strings}, @html_result
209
+
210
+ paginate(['a'].paginate(:page => 1, :per_page => 5))
211
+ assert_equal %{Displaying <b>1</b> string}, @html_result
212
+
213
+ paginate([].paginate(:page => 1, :per_page => 5))
214
+ assert_equal %{No entries found}, @html_result
215
+ end
216
+
217
+ def test_page_entries_info_with_custom_entry_name
218
+ @template = '<%= page_entries_info collection, :entry_name => "author" %>'
219
+
220
+ entries = (1..20).to_a
221
+
222
+ paginate(entries.paginate(:page => 1, :per_page => 5))
223
+ assert_equal %{Displaying authors <b>1&nbsp;-&nbsp;5</b> of <b>20</b> in total}, @html_result
224
+
225
+ paginate(entries.paginate(:page => 1, :per_page => 20))
226
+ assert_equal %{Displaying <b>all 20</b> authors}, @html_result
227
+
228
+ paginate(['a'].paginate(:page => 1, :per_page => 5))
229
+ assert_equal %{Displaying <b>1</b> author}, @html_result
230
+
231
+ paginate([].paginate(:page => 1, :per_page => 5))
232
+ assert_equal %{No authors found}, @html_result
233
+ end
234
+
235
+ ## parameter handling in page links ##
236
+
237
+ def test_will_paginate_preserves_parameters_on_get
238
+ @request.params :foo => { :bar => 'baz' }
239
+ paginate
240
+ assert_links_match /foo%5Bbar%5D=baz/
241
+ end
242
+
243
+ def test_will_paginate_doesnt_preserve_parameters_on_post
244
+ @request.post
245
+ @request.params :foo => 'bar'
246
+ paginate
247
+ assert_no_links_match /foo=bar/
248
+ end
249
+
250
+ def test_adding_additional_parameters
251
+ paginate({}, :params => { :foo => 'bar' })
252
+ assert_links_match /foo=bar/
253
+ end
254
+
255
+ def test_adding_anchor_parameter
256
+ paginate({}, :params => { :anchor => 'anchor' })
257
+ assert_links_match /#anchor$/
258
+ end
259
+
260
+ def test_removing_arbitrary_parameters
261
+ @request.params :foo => 'bar'
262
+ paginate({}, :params => { :foo => nil })
263
+ assert_no_links_match /foo=bar/
264
+ end
265
+
266
+ def test_adding_additional_route_parameters
267
+ paginate({}, :params => { :controller => 'baz', :action => 'list' })
268
+ assert_links_match %r{\Wbaz/list\W}
269
+ end
270
+
271
+ def test_will_paginate_with_custom_page_param
272
+ paginate({ :page => 2 }, :param_name => :developers_page) do
273
+ assert_select 'a[href]', 4 do |elements|
274
+ validate_page_numbers [1,1,3,3], elements, :developers_page
275
+ end
276
+ end
277
+ end
278
+
279
+ def test_complex_custom_page_param
280
+ @request.params :developers => { :page => 2 }
281
+
282
+ paginate({ :page => 2 }, :param_name => 'developers[page]') do
283
+ assert_select 'a[href]', 4 do |links|
284
+ assert_links_match /\?developers%5Bpage%5D=\d+$/, links
285
+ validate_page_numbers [1,1,3,3], links, 'developers[page]'
286
+ end
287
+ end
288
+ end
289
+
290
+ def test_custom_routing_page_param
291
+ @request.symbolized_path_parameters.update :controller => 'dummy', :action => nil
292
+ paginate :per_page => 2 do
293
+ assert_select 'a[href]', 6 do |links|
294
+ assert_links_match %r{/page/(\d+)$}, links, [2, 3, 4, 5, 6, 2]
295
+ end
296
+ end
297
+ end
298
+
299
+ def test_custom_routing_page_param_with_dot_separator
300
+ @request.symbolized_path_parameters.update :controller => 'dummy', :action => 'dots'
301
+ paginate :per_page => 2 do
302
+ assert_select 'a[href]', 6 do |links|
303
+ assert_links_match %r{/page\.(\d+)$}, links, [2, 3, 4, 5, 6, 2]
304
+ end
305
+ end
306
+ end
307
+
308
+ def test_custom_routing_with_first_page_hidden
309
+ @request.symbolized_path_parameters.update :controller => 'ibocorp', :action => nil
310
+ paginate :page => 2, :per_page => 2 do
311
+ assert_select 'a[href]', 7 do |links|
312
+ assert_links_match %r{/ibocorp(?:/(\d+))?$}, links, [nil, nil, 3, 4, 5, 6, 3]
313
+ end
314
+ end
315
+ end
316
+
317
+ ## internal hardcore stuff ##
318
+
319
+ class LegacyCollection < WillPaginate::Collection
320
+ alias :page_count :total_pages
321
+ undef :total_pages
322
+ end
323
+
324
+ def test_deprecation_notices_with_page_count
325
+ collection = LegacyCollection.new(1, 1, 2)
326
+
327
+ assert_deprecated collection.class.name do
328
+ paginate collection
329
+ end
330
+ end
331
+
332
+ uses_mocha 'view internals' do
333
+ def test_collection_name_can_be_guessed
334
+ collection = mock
335
+ collection.expects(:total_pages).returns(1)
336
+
337
+ @template = '<%= will_paginate options %>'
338
+ @controller.controller_name = 'developers'
339
+ @view.assigns['developers'] = collection
340
+
341
+ paginate(nil)
342
+ end
343
+ end
344
+
345
+ def test_inferred_collection_name_raises_error_when_nil
346
+ @template = '<%= will_paginate options %>'
347
+ @controller.controller_name = 'developers'
348
+
349
+ e = assert_raise ArgumentError do
350
+ paginate(nil)
351
+ end
352
+ assert e.message.include?('@developers')
353
+ end
354
+
355
+ if ActionController::Base.respond_to? :rescue_responses
356
+ # only on Rails 2
357
+ def test_rescue_response_hook_presence
358
+ assert_equal :not_found,
359
+ ActionController::Base.rescue_responses['WillPaginate::InvalidPage']
360
+ end
361
+ end
362
+
363
+ end