Updated to latest rspec
[gitorious:dgiuntas-clone.git] / vendor / plugins / will_paginate / test / pagination_test.rb
1 require File.dirname(__FILE__) + '/helper'
2 require 'action_controller'
3 require 'action_controller/test_process'
4
5 ActionController::Routing::Routes.reload rescue nil
6 ActionController::Routing::Routes.draw do |map|
7   map.connect ':controller/:action/:id'
8 end
9
10 ActionController::Base.perform_caching = false
11
12 require 'will_paginate'
13 WillPaginate.enable_actionpack
14
15 class PaginationTest < Test::Unit::TestCase
16   
17   class PaginationController < ActionController::Base
18     def list_developers
19       @options = params.delete(:options) || {}
20       
21       @developers = (1..11).to_a.paginate(
22         :page => params[@options[:param_name] || :page] || 1,
23         :per_page => params[:per_page] || 4
24       )
25
26       render :inline => '<%= will_paginate @developers, @options %>'
27     end
28
29     protected
30       def rescue_errors(e) raise e end
31       def rescue_action(e) raise e end
32   end
33   
34   def setup
35     @controller = PaginationController.new
36     @request    = ActionController::TestRequest.new
37     @response   = ActionController::TestResponse.new
38     super
39   end
40
41   def test_will_paginate
42     get :list_developers
43
44     entries = assigns :developers
45     assert entries
46     assert_equal 4, entries.size
47
48     assert_select 'div.pagination', 1, 'no main DIV' do |el|
49       assert_select 'a[href]', 3 do |elements|
50         validate_page_numbers [2,3,2], elements
51         assert_select elements.last, ':last-child', "Next &raquo;"
52       end
53       assert_select 'span', 2
54       assert_select 'span.disabled:first-child', "&laquo; Previous"
55       assert_select 'span.current', entries.current_page.to_s
56     end
57   end
58
59   def test_will_paginate_with_options
60     get :list_developers, :page => 2, :options => {
61       :class => 'will_paginate', :prev_label => 'Prev', :next_label => 'Next'
62     }
63     assert_response :success
64     
65     entries = assigns :developers
66     assert entries
67     assert_equal 4, entries.size
68
69     assert_select 'div.will_paginate', 1, 'no main DIV' do
70       assert_select 'a[href]', 4 do |elements|
71         validate_page_numbers [nil,nil,3,3], elements
72         assert_select elements.first, 'a', "Prev"
73         assert_select elements.last, 'a', "Next"
74       end
75       assert_select 'span.current', entries.current_page.to_s
76     end
77   end
78   
79   def test_will_paginate_preserves_parameters
80     get :list_developers, :foo => { :bar => 'baz' }
81     assert_response :success
82     
83     assert_select 'div.pagination', 1, 'no main DIV' do
84       assert_select 'a[href]', 3 do |elements|
85         elements.each do |el|
86           assert_match /foo%5Bbar%5D=baz/, el['href'], "THIS IS A BUG in Rails 1.2 which " +
87             "has been fixed in Rails 2.0."
88           # there is no need to worry *unless* you too are using hashes in parameters which
89           # need to be preserved over pages
90         end
91       end
92     end
93   end
94   
95   def test_will_paginate_with_custom_page_param
96     get :list_developers, :developers_page => 2, :options => { :param_name => :developers_page }
97     assert_response :success
98     
99     entries = assigns :developers
100     assert entries
101     assert_equal 4, entries.size
102
103     assert_select 'div.pagination', 1, 'no main DIV' do
104       assert_select 'a[href]', 4 do |elements|
105         validate_page_numbers [nil,nil,3,3], elements, :developers_page
106       end
107       assert_select 'span.current', entries.current_page.to_s
108     end    
109   end
110
111   def test_will_paginate_windows
112     get :list_developers, :page => 6, :per_page => 1, :options => { :inner_window => 2 }
113     assert_response :success
114     
115     entries = assigns :developers
116     assert entries
117     assert_equal 1, entries.size
118
119     assert_select 'div.pagination', 1, 'no main DIV' do
120       assert_select 'a[href]', 10 do |elements|
121         validate_page_numbers [5,nil,2,4,5,7,8,10,11,7], elements
122         assert_select elements.first, 'a', "&laquo; Previous"
123         assert_select elements.last, 'a', "Next &raquo;"
124       end
125       assert_select 'span.current', entries.current_page.to_s
126     end
127   end
128
129   def test_no_pagination
130     get :list_developers, :per_page => 12
131     entries = assigns :developers
132     assert_equal 1, entries.page_count
133     assert_equal 11, entries.size
134
135     assert_equal '', @response.body
136   end
137   
138 protected
139
140   def validate_page_numbers expected, links, param_name = :page
141     assert_equal(expected, links.map { |e|
142       e['href'] =~ /\W#{param_name}=([^&]*)/
143       $1 ? $1.to_i : $1
144     })
145   end
146 end