will_paginate 2.3.17 → 3.0.pre

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of will_paginate might be problematic. Click here for more details.

Files changed (83) hide show
  1. data/CHANGELOG.rdoc +24 -80
  2. data/LICENSE +1 -1
  3. data/README.rdoc +125 -0
  4. data/Rakefile +26 -22
  5. data/lib/will_paginate.rb +10 -84
  6. data/lib/will_paginate/array.rb +25 -8
  7. data/lib/will_paginate/collection.rb +15 -28
  8. data/lib/will_paginate/core_ext.rb +26 -0
  9. data/lib/will_paginate/deprecation.rb +50 -0
  10. data/lib/will_paginate/finders.rb +9 -0
  11. data/lib/will_paginate/finders/active_record.rb +158 -0
  12. data/lib/will_paginate/finders/active_resource.rb +51 -0
  13. data/lib/will_paginate/finders/base.rb +112 -0
  14. data/lib/will_paginate/finders/data_mapper.rb +30 -0
  15. data/lib/will_paginate/finders/sequel.rb +23 -0
  16. data/lib/will_paginate/railtie.rb +26 -0
  17. data/lib/will_paginate/version.rb +5 -5
  18. data/lib/will_paginate/view_helpers.rb +25 -436
  19. data/lib/will_paginate/view_helpers/action_view.rb +142 -0
  20. data/lib/will_paginate/view_helpers/base.rb +126 -0
  21. data/lib/will_paginate/view_helpers/link_renderer.rb +130 -0
  22. data/lib/will_paginate/view_helpers/link_renderer_base.rb +83 -0
  23. data/lib/will_paginate/view_helpers/merb.rb +13 -0
  24. data/spec/collection_spec.rb +147 -0
  25. data/spec/console +8 -0
  26. data/spec/console_fixtures.rb +8 -0
  27. data/spec/database.yml +22 -0
  28. data/spec/finders/active_record_spec.rb +377 -0
  29. data/spec/finders/active_resource_spec.rb +52 -0
  30. data/spec/finders/activerecord_test_connector.rb +114 -0
  31. data/spec/finders/data_mapper_spec.rb +62 -0
  32. data/spec/finders/data_mapper_test_connector.rb +20 -0
  33. data/spec/finders/sequel_spec.rb +53 -0
  34. data/spec/finders/sequel_test_connector.rb +9 -0
  35. data/spec/finders_spec.rb +76 -0
  36. data/{test → spec}/fixtures/admin.rb +0 -0
  37. data/{test → spec}/fixtures/developer.rb +2 -3
  38. data/{test → spec}/fixtures/developers_projects.yml +0 -0
  39. data/{test → spec}/fixtures/project.rb +2 -6
  40. data/{test → spec}/fixtures/projects.yml +1 -1
  41. data/{test → spec}/fixtures/replies.yml +0 -0
  42. data/{test → spec}/fixtures/reply.rb +1 -1
  43. data/{test → spec}/fixtures/schema.rb +0 -0
  44. data/spec/fixtures/topic.rb +7 -0
  45. data/{test → spec}/fixtures/topics.yml +0 -0
  46. data/{test → spec}/fixtures/user.rb +0 -0
  47. data/{test → spec}/fixtures/users.yml +0 -0
  48. data/spec/rcov.opts +2 -0
  49. data/spec/spec.opts +2 -0
  50. data/spec/spec_helper.rb +74 -0
  51. data/spec/tasks.rake +60 -0
  52. data/spec/view_helpers/action_view_spec.rb +345 -0
  53. data/spec/view_helpers/base_spec.rb +64 -0
  54. data/spec/view_helpers/link_renderer_base_spec.rb +84 -0
  55. data/spec/view_helpers/view_example_group.rb +103 -0
  56. metadata +60 -65
  57. data/README.md +0 -53
  58. data/lib/will_paginate/finder.rb +0 -269
  59. data/lib/will_paginate/i18n.rb +0 -29
  60. data/lib/will_paginate/locale/en.yml +0 -33
  61. data/lib/will_paginate/named_scope.rb +0 -170
  62. data/lib/will_paginate/named_scope_patch.rb +0 -37
  63. data/lib/will_paginate/per_page.rb +0 -27
  64. data/test/ci.rb +0 -60
  65. data/test/collection_test.rb +0 -160
  66. data/test/console +0 -8
  67. data/test/database.yml +0 -16
  68. data/test/finder_test.rb +0 -527
  69. data/test/fixtures/topic.rb +0 -12
  70. data/test/gemfiles/Gemfile.1.2 +0 -13
  71. data/test/gemfiles/Gemfile.1.2.lock +0 -39
  72. data/test/gemfiles/Gemfile.2.0 +0 -16
  73. data/test/gemfiles/Gemfile.2.0.lock +0 -28
  74. data/test/gemfiles/Gemfile.2.1 +0 -16
  75. data/test/gemfiles/Gemfile.2.1.lock +0 -28
  76. data/test/gemfiles/Gemfile.2.2 +0 -16
  77. data/test/gemfiles/Gemfile.2.2.lock +0 -28
  78. data/test/helper.rb +0 -34
  79. data/test/lib/activerecord_test_case.rb +0 -38
  80. data/test/lib/activerecord_test_connector.rb +0 -86
  81. data/test/lib/load_fixtures.rb +0 -12
  82. data/test/lib/view_test_process.rb +0 -186
  83. data/test/view_test.rb +0 -380
data/test/view_test.rb DELETED
@@ -1,380 +0,0 @@
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
- uses_mocha 'class name' do
196
- def test_page_entries_info_with_longer_class_name
197
- @template = '<%= page_entries_info collection %>'
198
- collection = ('a'..'z').to_a.paginate
199
- collection.first.stubs(:class).returns(mock('class', :to_s => 'ProjectType'))
200
-
201
- paginate collection
202
- assert @html_result.index('project types'), "expected <#{@html_result.inspect}> to mention 'project types'"
203
- end
204
- end
205
-
206
- def test_page_entries_info_with_single_page_collection
207
- @template = '<%= page_entries_info collection %>'
208
-
209
- paginate(('a'..'d').to_a.paginate(:page => 1, :per_page => 5))
210
- assert_equal %{Displaying <b>all&nbsp;4</b> strings}, @html_result
211
-
212
- paginate(['a'].paginate(:page => 1, :per_page => 5))
213
- assert_equal %{Displaying <b>1</b> string}, @html_result
214
-
215
- paginate([].paginate(:page => 1, :per_page => 5))
216
- assert_equal %{No entries found}, @html_result
217
- end
218
-
219
- def test_page_entries_info_with_custom_entry_name
220
- @template = '<%= page_entries_info collection, :model => "author" %>'
221
-
222
- entries = (1..20).to_a
223
-
224
- paginate(entries.paginate(:page => 1, :per_page => 5))
225
- assert_equal %{Displaying authors <b>1&nbsp;-&nbsp;5</b> of <b>20</b> in total}, @html_result
226
-
227
- paginate(entries.paginate(:page => 1, :per_page => 20))
228
- assert_equal %{Displaying <b>all&nbsp;20</b> authors}, @html_result
229
-
230
- paginate(['a'].paginate(:page => 1, :per_page => 5))
231
- assert_equal %{Displaying <b>1</b> author}, @html_result
232
-
233
- paginate([].paginate(:page => 1, :per_page => 5))
234
- assert_equal %{No authors found}, @html_result
235
- end
236
-
237
- ## parameter handling in page links ##
238
-
239
- def test_will_paginate_preserves_parameters_on_get
240
- @request.params :foo => { :bar => 'baz' }
241
- paginate
242
- assert_links_match /foo%5Bbar%5D=baz/
243
- end
244
-
245
- def test_will_paginate_prevents_host_and_protocol_tampering
246
- @request.params :host => 'disney.com', :protocol => 'javascript'
247
- paginate
248
- assert_no_links_match /disney/
249
- assert_no_links_match /javascript/
250
- end
251
-
252
- def test_will_paginate_doesnt_preserve_parameters_on_post
253
- @request.post
254
- @request.params :foo => 'bar'
255
- paginate
256
- assert_no_links_match /foo=bar/
257
- end
258
-
259
- def test_adding_additional_parameters
260
- paginate({}, :params => { :foo => 'bar' })
261
- assert_links_match /foo=bar/
262
- end
263
-
264
- def test_adding_anchor_parameter
265
- paginate({}, :params => { :anchor => 'anchor' })
266
- assert_links_match /#anchor$/
267
- end
268
-
269
- def test_removing_arbitrary_parameters
270
- @request.params :foo => 'bar'
271
- paginate({}, :params => { :foo => nil })
272
- assert_no_links_match /foo=bar/
273
- end
274
-
275
- def test_adding_additional_route_parameters
276
- paginate({}, :params => { :controller => 'baz', :action => 'list' })
277
- assert_links_match %r{\Wbaz/list\W}
278
- end
279
-
280
- def test_will_paginate_with_custom_page_param
281
- paginate({ :page => 2 }, :param_name => :developers_page) do
282
- assert_select 'a[href]', 4 do |elements|
283
- validate_page_numbers [1,1,3,3], elements, :developers_page
284
- end
285
- end
286
- end
287
-
288
- def test_will_paginate_with_atmark_url
289
- @request.symbolized_path_parameters[:action] = "@tag"
290
- renderer = WillPaginate::LinkRenderer.new
291
-
292
- paginate({ :page => 1 }, :renderer=>renderer)
293
- assert_links_match %r[/foo/(?:@|%40)tag\?page=\d]
294
- end
295
-
296
- def test_complex_custom_page_param
297
- @request.params :developers => { :page => 2 }
298
-
299
- paginate({ :page => 2 }, :param_name => 'developers[page]') do
300
- assert_select 'a[href]', 4 do |links|
301
- assert_links_match /\?developers%5Bpage%5D=\d+$/, links
302
- validate_page_numbers [1,1,3,3], links, 'developers[page]'
303
- end
304
- end
305
- end
306
-
307
- def test_custom_routing_page_param
308
- @request.symbolized_path_parameters.update :controller => 'dummy', :action => nil
309
- paginate :per_page => 2 do
310
- assert_select 'a[href]', 6 do |links|
311
- assert_links_match %r{/page/(\d+)$}, links, [2, 3, 4, 5, 6, 2]
312
- end
313
- end
314
- end
315
-
316
- def test_custom_routing_page_param_with_dot_separator
317
- @request.symbolized_path_parameters.update :controller => 'dummy', :action => 'dots'
318
- paginate :per_page => 2 do
319
- assert_select 'a[href]', 6 do |links|
320
- assert_links_match %r{/page\.(\d+)$}, links, [2, 3, 4, 5, 6, 2]
321
- end
322
- end
323
- end
324
-
325
- def test_custom_routing_with_first_page_hidden
326
- @request.symbolized_path_parameters.update :controller => 'ibocorp', :action => nil
327
- paginate :page => 2, :per_page => 2 do
328
- assert_select 'a[href]', 7 do |links|
329
- assert_links_match %r{/ibocorp(?:/(\d+))?$}, links, [nil, nil, 3, 4, 5, 6, 3]
330
- end
331
- end
332
- end
333
-
334
- ## internal hardcore stuff ##
335
-
336
- class LegacyCollection < WillPaginate::Collection
337
- alias :page_count :total_pages
338
- undef :total_pages
339
- end
340
-
341
- def test_deprecation_notices_with_page_count
342
- collection = LegacyCollection.new(1, 1, 2)
343
-
344
- assert_deprecated collection.class.name do
345
- paginate collection
346
- end
347
- end
348
-
349
- uses_mocha 'view internals' do
350
- def test_collection_name_can_be_guessed
351
- collection = mock
352
- collection.expects(:total_pages).returns(1)
353
-
354
- @template = '<%= will_paginate options %>'
355
- @controller.controller_name = 'developers'
356
- @view.assigns['developers'] = collection
357
-
358
- paginate(nil)
359
- end
360
- end
361
-
362
- def test_inferred_collection_name_raises_error_when_nil
363
- @template = '<%= will_paginate options %>'
364
- @controller.controller_name = 'developers'
365
-
366
- e = assert_raise ArgumentError do
367
- paginate(nil)
368
- end
369
- assert e.message.include?('@developers')
370
- end
371
-
372
- if ActionController::Base.respond_to? :rescue_responses
373
- # only on Rails 2
374
- def test_rescue_response_hook_presence
375
- assert_equal :not_found,
376
- ActionController::Base.rescue_responses['WillPaginate::InvalidPage']
377
- end
378
- end
379
-
380
- end