Updated to latest will_paginate
[gitorious:dgiuntas-clone.git] / vendor / plugins / will_paginate / test / view_test.rb
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', :prev_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_full_output
85     paginate
86     expected = <<-HTML
87       <div class="pagination"><span class="disabled prev_page">&laquo; Previous</span>
88       <span class="current">1</span>
89       <a href="/foo/bar?page=2" rel="next">2</a>
90       <a href="/foo/bar?page=3">3</a>
91       <a href="/foo/bar?page=2" class="next_page" rel="next">Next &raquo;</a></div>
92     HTML
93     expected.strip!.gsub!(/\s{2,}/, ' ')
94     
95     assert_dom_equal expected, @html_result
96   end
97
98   def test_escaping_of_urls
99     paginate({:page => 1, :per_page => 1, :total_entries => 2},
100              :page_links => false, :params => { :tag => '<br>' })
101     
102     assert_select 'a[href]', 1 do |links|
103       query = links.first['href'].split('?', 2)[1]
104       assert_equal %w(page=2 tag=%3Cbr%3E), query.split('&amp;').sort
105     end
106   end
107
108   ## advanced options for pagination ##
109
110   def test_will_paginate_without_container
111     paginate({}, :container => false)
112     assert_select 'div.pagination', 0, 'main DIV present when it shouldn\'t'
113     assert_select 'a[href]', 3
114   end
115
116   def test_will_paginate_without_page_links
117     paginate({ :page => 2 }, :page_links => false) do
118       assert_select 'a[href]', 2 do |elements|
119         validate_page_numbers [1,3], elements
120       end
121     end
122   end
123
124   def test_will_paginate_windows
125     paginate({ :page => 6, :per_page => 1 }, :inner_window => 1) do |pagination|
126       assert_select 'a[href]', 8 do |elements|
127         validate_page_numbers [5,1,2,5,7,10,11,7], elements
128         assert_select elements.first, 'a', '&laquo; Previous'
129         assert_select elements.last, 'a', 'Next &raquo;'
130       end
131       assert_select 'span.current', '6'
132       assert_equal '&laquo; Previous 1 2 &hellip; 5 6 7 &hellip; 10 11 Next &raquo;', pagination.first.inner_text
133     end
134   end
135
136   def test_will_paginate_eliminates_small_gaps
137     paginate({ :page => 6, :per_page => 1 }, :inner_window => 2) do
138       assert_select 'a[href]', 12 do |elements|
139         validate_page_numbers [5,1,2,3,4,5,7,8,9,10,11,7], elements
140       end
141     end
142   end
143   
144   def test_container_id
145     paginate do |div|
146       assert_nil div.first['id']
147     end
148     
149     # magic ID
150     paginate({}, :id => true) do |div|
151       assert_equal 'fixnums_pagination', div.first['id']
152     end
153     
154     # explicit ID
155     paginate({}, :id => 'custom_id') do |div|
156       assert_equal 'custom_id', div.first['id']
157     end
158   end
159
160   ## other helpers ##
161   
162   def test_paginated_section
163     @template = <<-ERB
164       <% paginated_section collection, options do %>
165         <%= content_tag :div, '', :id => "developers" %>
166       <% end %>
167     ERB
168     
169     paginate
170     assert_select 'div.pagination', 2
171     assert_select 'div.pagination + div#developers', 1
172   end
173
174   def test_page_entries_info
175     @template = '<%= page_entries_info collection %>'
176     array = ('a'..'z').to_a
177     
178     paginate array.paginate(:page => 2, :per_page => 5)
179     assert_equal %{Displaying strings <b>6&nbsp;-&nbsp;10</b> of <b>26</b> in total},
180       @html_result
181     
182     paginate array.paginate(:page => 7, :per_page => 4)
183     assert_equal %{Displaying strings <b>25&nbsp;-&nbsp;26</b> of <b>26</b> in total},
184       @html_result
185   end
186
187   def test_page_entries_info_with_longer_class_name
188     @template = '<%= page_entries_info collection %>'
189     collection = ('a'..'z').to_a.paginate
190     collection.first.stubs(:class).returns(mock('class', :name => 'ProjectType'))
191     
192     paginate collection
193     assert @html_result.index('project types'), "expected <#{@html_result.inspect}> to mention 'project types'"
194   end
195
196   def test_page_entries_info_with_single_page_collection
197     @template = '<%= page_entries_info collection %>'
198     
199     paginate(('a'..'d').to_a.paginate(:page => 1, :per_page => 5))
200     assert_equal %{Displaying <b>all 4</b> strings}, @html_result
201     
202     paginate(['a'].paginate(:page => 1, :per_page => 5))
203     assert_equal %{Displaying <b>1</b> string}, @html_result
204     
205     paginate([].paginate(:page => 1, :per_page => 5))
206     assert_equal %{No entries found}, @html_result
207   end
208   
209   def test_page_entries_info_with_custom_entry_name
210     @template = '<%= page_entries_info collection, :entry_name => "author" %>'
211     
212     entries = (1..20).to_a
213     
214     paginate(entries.paginate(:page => 1, :per_page => 5))
215     assert_equal %{Displaying authors <b>1&nbsp;-&nbsp;5</b> of <b>20</b> in total}, @html_result
216     
217     paginate(entries.paginate(:page => 1, :per_page => 20))
218     assert_equal %{Displaying <b>all 20</b> authors}, @html_result
219     
220     paginate(['a'].paginate(:page => 1, :per_page => 5))
221     assert_equal %{Displaying <b>1</b> author}, @html_result
222     
223     paginate([].paginate(:page => 1, :per_page => 5))
224     assert_equal %{No authors found}, @html_result
225   end
226   
227   ## parameter handling in page links ##
228   
229   def test_will_paginate_preserves_parameters_on_get
230     @request.params :foo => { :bar => 'baz' }
231     paginate
232     assert_links_match /foo%5Bbar%5D=baz/
233   end
234   
235   def test_will_paginate_doesnt_preserve_parameters_on_post
236     @request.post
237     @request.params :foo => 'bar'
238     paginate
239     assert_no_links_match /foo=bar/
240   end
241   
242   def test_adding_additional_parameters
243     paginate({}, :params => { :foo => 'bar' })
244     assert_links_match /foo=bar/
245   end
246   
247   def test_adding_anchor_parameter
248     paginate({}, :params => { :anchor => 'anchor' })
249     assert_links_match /#anchor$/
250   end
251   
252   def test_removing_arbitrary_parameters
253     @request.params :foo => 'bar'
254     paginate({}, :params => { :foo => nil })
255     assert_no_links_match /foo=bar/
256   end
257     
258   def test_adding_additional_route_parameters
259     paginate({}, :params => { :controller => 'baz', :action => 'list' })
260     assert_links_match %r{\Wbaz/list\W}
261   end
262   
263   def test_will_paginate_with_custom_page_param
264     paginate({ :page => 2 }, :param_name => :developers_page) do
265       assert_select 'a[href]', 4 do |elements|
266         validate_page_numbers [1,1,3,3], elements, :developers_page
267       end
268     end    
269   end
270   
271   def test_complex_custom_page_param
272     @request.params :developers => { :page => 2 }
273     
274     paginate({ :page => 2 }, :param_name => 'developers[page]') do
275       assert_select 'a[href]', 4 do |links|
276         assert_links_match /\?developers%5Bpage%5D=\d+$/, links
277         validate_page_numbers [1,1,3,3], links, 'developers[page]'
278       end
279     end
280   end
281
282   def test_custom_routing_page_param
283     @request.symbolized_path_parameters.update :controller => 'dummy', :action => nil
284     paginate :per_page => 2 do
285       assert_select 'a[href]', 6 do |links|
286         assert_links_match %r{/page/(\d+)$}, links, [2, 3, 4, 5, 6, 2]
287       end
288     end
289   end
290
291   def test_custom_routing_page_param_with_dot_separator
292     @request.symbolized_path_parameters.update :controller => 'dummy', :action => 'dots'
293     paginate :per_page => 2 do
294       assert_select 'a[href]', 6 do |links|
295         assert_links_match %r{/page\.(\d+)$}, links, [2, 3, 4, 5, 6, 2]
296       end
297     end
298   end
299
300   def test_custom_routing_with_first_page_hidden
301     @request.symbolized_path_parameters.update :controller => 'ibocorp', :action => nil
302     paginate :page => 2, :per_page => 2 do
303       assert_select 'a[href]', 7 do |links|
304         assert_links_match %r{/ibocorp(?:/(\d+))?$}, links, [nil, nil, 3, 4, 5, 6, 3]
305       end
306     end
307   end
308
309   ## internal hardcore stuff ##
310
311   class LegacyCollection < WillPaginate::Collection
312     alias :page_count :total_pages
313     undef :total_pages
314   end
315
316   def test_deprecation_notices_with_page_count
317     collection = LegacyCollection.new(1, 1, 2)
318
319     assert_deprecated collection.class.name do
320       paginate collection
321     end
322   end
323   
324   uses_mocha 'view internals' do
325     def test_collection_name_can_be_guessed
326       collection = mock
327       collection.expects(:total_pages).returns(1)
328       
329       @template = '<%= will_paginate options %>'
330       @controller.controller_name = 'developers'
331       @view.assigns['developers'] = collection
332       
333       paginate(nil)
334     end
335   end
336   
337   def test_inferred_collection_name_raises_error_when_nil
338     @template = '<%= will_paginate options %>'
339     @controller.controller_name = 'developers'
340     
341     e = assert_raise ArgumentError do
342       paginate(nil)
343     end
344     assert e.message.include?('@developers')
345   end
346
347   if ActionController::Base.respond_to? :rescue_responses
348     # only on Rails 2
349     def test_rescue_response_hook_presence
350       assert_equal :not_found,
351         ActionController::Base.rescue_responses['WillPaginate::InvalidPage']
352     end
353   end
354   
355 end