will_paginate-rails3 3.0.pre

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 (56) hide show
  1. data/CHANGELOG.rdoc +105 -0
  2. data/LICENSE +18 -0
  3. data/README.rdoc +125 -0
  4. data/Rakefile +32 -0
  5. data/lib/will_paginate.rb +23 -0
  6. data/lib/will_paginate/array.rb +33 -0
  7. data/lib/will_paginate/collection.rb +145 -0
  8. data/lib/will_paginate/core_ext.rb +69 -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 +24 -0
  17. data/lib/will_paginate/version.rb +9 -0
  18. data/lib/will_paginate/view_helpers.rb +42 -0
  19. data/lib/will_paginate/view_helpers/action_view.rb +134 -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/spec/fixtures/admin.rb +3 -0
  37. data/spec/fixtures/developer.rb +13 -0
  38. data/spec/fixtures/developers_projects.yml +13 -0
  39. data/spec/fixtures/project.rb +13 -0
  40. data/spec/fixtures/projects.yml +6 -0
  41. data/spec/fixtures/replies.yml +29 -0
  42. data/spec/fixtures/reply.rb +7 -0
  43. data/spec/fixtures/schema.rb +38 -0
  44. data/spec/fixtures/topic.rb +7 -0
  45. data/spec/fixtures/topics.yml +30 -0
  46. data/spec/fixtures/user.rb +2 -0
  47. data/spec/fixtures/users.yml +35 -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 +356 -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 +127 -0
@@ -0,0 +1,29 @@
1
+ witty_retort:
2
+ id: 1
3
+ topic_id: 1
4
+ content: Birdman is better!
5
+ created_at: <%= 6.hours.ago.to_s(:db) %>
6
+
7
+ another:
8
+ id: 2
9
+ topic_id: 2
10
+ content: Nuh uh!
11
+ created_at: <%= 1.hour.ago.to_s(:db) %>
12
+
13
+ spam:
14
+ id: 3
15
+ topic_id: 1
16
+ content: Nice site!
17
+ created_at: <%= 1.hour.ago.to_s(:db) %>
18
+
19
+ decisive:
20
+ id: 4
21
+ topic_id: 4
22
+ content: "I'm getting to the bottom of this"
23
+ created_at: <%= 30.minutes.ago.to_s(:db) %>
24
+
25
+ brave:
26
+ id: 5
27
+ topic_id: 4
28
+ content: "AR doesn't scare me a bit"
29
+ created_at: <%= 10.minutes.ago.to_s(:db) %>
@@ -0,0 +1,7 @@
1
+ class Reply < ActiveRecord::Base
2
+ belongs_to :topic, :include => [:replies]
3
+
4
+ scope :recent, :conditions => ['replies.created_at > ?', 15.minutes.ago]
5
+
6
+ validates_presence_of :content
7
+ end
@@ -0,0 +1,38 @@
1
+ ActiveRecord::Schema.define do
2
+
3
+ create_table "users", :force => true do |t|
4
+ t.column "name", :text
5
+ t.column "salary", :integer, :default => 70000
6
+ t.column "created_at", :datetime
7
+ t.column "updated_at", :datetime
8
+ t.column "type", :text
9
+ end
10
+
11
+ create_table "projects", :force => true do |t|
12
+ t.column "name", :text
13
+ end
14
+
15
+ create_table "developers_projects", :id => false, :force => true do |t|
16
+ t.column "developer_id", :integer, :null => false
17
+ t.column "project_id", :integer, :null => false
18
+ t.column "joined_on", :date
19
+ t.column "access_level", :integer, :default => 1
20
+ end
21
+
22
+ create_table "topics", :force => true do |t|
23
+ t.column "project_id", :integer
24
+ t.column "title", :string
25
+ t.column "subtitle", :string
26
+ t.column "content", :text
27
+ t.column "created_at", :datetime
28
+ t.column "updated_at", :datetime
29
+ end
30
+
31
+ create_table "replies", :force => true do |t|
32
+ t.column "content", :text
33
+ t.column "created_at", :datetime
34
+ t.column "updated_at", :datetime
35
+ t.column "topic_id", :integer
36
+ end
37
+
38
+ end
@@ -0,0 +1,7 @@
1
+ class Topic < ActiveRecord::Base
2
+ has_many :replies, :dependent => :destroy, :order => 'replies.created_at DESC'
3
+ belongs_to :project
4
+
5
+ scope :mentions_activerecord, :conditions => ['topics.title LIKE ?', '%ActiveRecord%']
6
+ scope :distinct, :select => "DISTINCT #{table_name}.*"
7
+ end
@@ -0,0 +1,30 @@
1
+ futurama:
2
+ id: 1
3
+ title: Isnt futurama awesome?
4
+ subtitle: It really is, isnt it.
5
+ content: I like futurama
6
+ created_at: <%= 1.day.ago.to_s(:db) %>
7
+ updated_at:
8
+
9
+ harvey_birdman:
10
+ id: 2
11
+ title: Harvey Birdman is the king of all men
12
+ subtitle: yup
13
+ content: He really is
14
+ created_at: <%= 2.hours.ago.to_s(:db) %>
15
+ updated_at:
16
+
17
+ rails:
18
+ id: 3
19
+ project_id: 1
20
+ title: Rails is nice
21
+ subtitle: It makes me happy
22
+ content: except when I have to hack internals to fix pagination. even then really.
23
+ created_at: <%= 20.minutes.ago.to_s(:db) %>
24
+
25
+ ar:
26
+ id: 4
27
+ project_id: 1
28
+ title: ActiveRecord sometimes freaks me out
29
+ content: "I mean, what's the deal with eager loading?"
30
+ created_at: <%= 15.minutes.ago.to_s(:db) %>
@@ -0,0 +1,2 @@
1
+ class User < ActiveRecord::Base
2
+ end
@@ -0,0 +1,35 @@
1
+ david:
2
+ id: 1
3
+ name: David
4
+ salary: 80000
5
+ type: Developer
6
+
7
+ jamis:
8
+ id: 2
9
+ name: Jamis
10
+ salary: 150000
11
+ type: Developer
12
+
13
+ <% for digit in 3..10 %>
14
+ dev_<%= digit %>:
15
+ id: <%= digit %>
16
+ name: fixture_<%= digit %>
17
+ salary: 100000
18
+ type: Developer
19
+ <% end %>
20
+
21
+ poor_jamis:
22
+ id: 11
23
+ name: Jamis
24
+ salary: 9000
25
+ type: Developer
26
+
27
+ admin:
28
+ id: 12
29
+ name: admin
30
+ type: Admin
31
+
32
+ goofy:
33
+ id: 13
34
+ name: Goofy
35
+ type: Admin
@@ -0,0 +1,2 @@
1
+ --exclude ^\/,^spec\/,core_ext.rb,deprecation.rb
2
+ --no-validator-links
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --reverse
@@ -0,0 +1,74 @@
1
+ require 'spec/autorun'
2
+
3
+ module MyExtras
4
+ protected
5
+
6
+ def include_phrase(string)
7
+ PhraseMatcher.new(string)
8
+ end
9
+
10
+ def collection(params = {})
11
+ if params[:total_pages]
12
+ params[:per_page] = 1
13
+ params[:total_entries] = params[:total_pages]
14
+ end
15
+ WillPaginate::Collection.new(params[:page] || 1, params[:per_page] || 30, params[:total_entries])
16
+ end
17
+
18
+ def have_deprecation
19
+ DeprecationMatcher.new
20
+ end
21
+ end
22
+
23
+ Spec::Runner.configure do |config|
24
+ # config.include My::Pony, My::Horse, :type => :farm
25
+ config.include MyExtras
26
+ # config.predicate_matchers[:swim] = :can_swim?
27
+
28
+ config.mock_with :mocha
29
+ end
30
+
31
+ class PhraseMatcher
32
+ def initialize(string)
33
+ @string = string
34
+ @pattern = /\b#{string}\b/
35
+ end
36
+
37
+ def matches?(actual)
38
+ @actual = actual.to_s
39
+ @actual =~ @pattern
40
+ end
41
+
42
+ def failure_message
43
+ "expected #{@actual.inspect} to contain phrase #{@string.inspect}"
44
+ end
45
+
46
+ def negative_failure_message
47
+ "expected #{@actual.inspect} not to contain phrase #{@string.inspect}"
48
+ end
49
+ end
50
+
51
+ class DeprecationMatcher
52
+ def initialize
53
+ @old_behavior = WillPaginate::Deprecation.behavior
54
+ @messages = []
55
+ WillPaginate::Deprecation.behavior = lambda { |message, callstack|
56
+ @messages << message
57
+ }
58
+ end
59
+
60
+ def matches?(block)
61
+ block.call
62
+ !@messages.empty?
63
+ ensure
64
+ WillPaginate::Deprecation.behavior = @old_behavior
65
+ end
66
+
67
+ def failure_message
68
+ "expected block to raise a deprecation warning"
69
+ end
70
+
71
+ def negative_failure_message
72
+ "expected block not to raise deprecation warnings, #{@messages.size} raised"
73
+ end
74
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec/rake/spectask'
2
+
3
+ spec_opts = 'spec/spec.opts'
4
+
5
+ desc 'Run framework-agnostic specs'
6
+ Spec::Rake::SpecTask.new(:spec) do |t|
7
+ t.libs << 'spec'
8
+ t.spec_opts = ['--options', spec_opts]
9
+ t.spec_files = FileList.new('spec/**/*_spec.rb') do |files|
10
+ files.exclude(/\b(active_record|active_resource|action_view|data_mapper|sequel)_/)
11
+ end
12
+ end
13
+
14
+ namespace :spec do
15
+ desc 'Run specs for core, ActiveRecord and ActionView'
16
+ Spec::Rake::SpecTask.new(:rails) do |t|
17
+ t.libs << 'spec'
18
+ t.spec_opts = ['--options', spec_opts]
19
+ t.spec_files = FileList.new('spec/**/*_spec.rb') do |files|
20
+ files.exclude(/\b(data_mapper|sequel)_/)
21
+ end
22
+ end
23
+
24
+ desc 'Run specs for DataMapper'
25
+ Spec::Rake::SpecTask.new(:datamapper) do |t|
26
+ t.libs << 'spec'
27
+ t.spec_opts = ['--options', spec_opts]
28
+ t.spec_files = FileList.new('spec/finders_spec.rb', 'spec/finders/data_mapper_spec.rb')
29
+ end
30
+
31
+ desc 'Run specs for Sequel'
32
+ Spec::Rake::SpecTask.new(:sequel) do |t|
33
+ t.libs << 'spec'
34
+ t.spec_opts = ['--options', spec_opts]
35
+ t.spec_files = FileList.new('spec/finders_spec.rb', 'spec/finders/sequel_spec.rb')
36
+ end
37
+
38
+ desc 'Analyze spec coverage with RCov'
39
+ Spec::Rake::SpecTask.new(:rcov) do |t|
40
+ t.libs << 'spec'
41
+ t.spec_opts = ['--options', spec_opts]
42
+ t.rcov = true
43
+ t.rcov_opts = lambda do
44
+ IO.readlines('spec/rcov.opts').map { |l| l.chomp.split(" ") }.flatten
45
+ end
46
+ end
47
+
48
+ desc 'Print Specdoc for all specs'
49
+ Spec::Rake::SpecTask.new(:doc) do |t|
50
+ t.libs << 'spec'
51
+ t.spec_opts = ['--format', 'specdoc', '--dry-run']
52
+ end
53
+
54
+ desc 'Generate HTML report'
55
+ Spec::Rake::SpecTask.new(:html) do |t|
56
+ t.libs << 'spec'
57
+ t.spec_opts = ['--format', 'html:doc/spec_results.html', '--diff']
58
+ t.fail_on_error = false
59
+ end
60
+ end
@@ -0,0 +1,356 @@
1
+ require 'spec_helper'
2
+ require 'active_support/rescuable' # needed for Ruby 1.9.1
3
+ require 'action_controller'
4
+ require 'view_helpers/view_example_group'
5
+ require 'will_paginate/view_helpers/action_view'
6
+ require 'will_paginate/collection'
7
+
8
+ ActionView::Base.send(:include, WillPaginate::ViewHelpers::ActionView)
9
+
10
+ Routes = ActionDispatch::Routing::RouteSet.new
11
+
12
+ Routes.draw do
13
+ match 'dummy/page/:page' => 'dummy#index'
14
+ match 'dummy/dots/page.:page' => 'dummy#dots'
15
+ match 'ibocorp(/:page)' => 'ibocorp#index',
16
+ :constraints => { :page => /\d+/ }, :defaults => { :page => 1 }
17
+
18
+ match ':controller(/:action(/:id(.:format)))'
19
+ end
20
+
21
+ describe WillPaginate::ViewHelpers::ActionView do
22
+ before(:each) do
23
+ @assigns = {}
24
+ @controller = DummyController.new
25
+ @request = @controller.request
26
+ @template = '<%= will_paginate collection, options %>'
27
+ end
28
+
29
+ attr_reader :assigns, :controller, :request
30
+
31
+ def render(locals)
32
+ @view = ActionView::Base.new([], @assigns, @controller)
33
+ @view.request = @request
34
+ @view.singleton_class.send(:include, @controller._router.url_helpers)
35
+ @view.render(:inline => @template, :locals => locals)
36
+ end
37
+
38
+ ## basic pagination ##
39
+
40
+ it "should render" do
41
+ paginate do |pagination|
42
+ assert_select 'a[href]', 3 do |elements|
43
+ validate_page_numbers [2,3,2], elements
44
+ assert_select elements.last, ':last-child', "Next &#8594;"
45
+ end
46
+ assert_select 'span', 1
47
+ assert_select 'span.disabled:first-child', '&#8592; Previous'
48
+ assert_select 'em', '1'
49
+ pagination.first.inner_text.should == '&#8592; Previous 1 2 3 Next &#8594;'
50
+ end
51
+ end
52
+
53
+ it "should render nothing when there is only 1 page" do
54
+ paginate(:per_page => 30).should be_empty
55
+ end
56
+
57
+ it "should paginate with options" do
58
+ paginate({ :page => 2 }, :class => 'will_paginate', :previous_label => 'Prev', :next_label => 'Next') do
59
+ assert_select 'a[href]', 4 do |elements|
60
+ validate_page_numbers [1,1,3,3], elements
61
+ # test rel attribute values:
62
+ assert_select elements[1], 'a', '1' do |link|
63
+ link.first['rel'].should == 'prev start'
64
+ end
65
+ assert_select elements.first, 'a', "Prev" do |link|
66
+ link.first['rel'].should == 'prev start'
67
+ end
68
+ assert_select elements.last, 'a', "Next" do |link|
69
+ link.first['rel'].should == 'next'
70
+ end
71
+ end
72
+ assert_select 'em', '2'
73
+ end
74
+ end
75
+
76
+ it "should paginate using a custom renderer class" do
77
+ paginate({}, :renderer => AdditionalLinkAttributesRenderer) do
78
+ assert_select 'a[default=true]', 3
79
+ end
80
+ end
81
+
82
+ it "should paginate using a custom renderer instance" do
83
+ renderer = WillPaginate::ViewHelpers::LinkRenderer.new
84
+ def renderer.gap() '<span class="my-gap">~~</span>' end
85
+
86
+ paginate({ :per_page => 2 }, :inner_window => 0, :outer_window => 0, :renderer => renderer) do
87
+ assert_select 'span.my-gap', '~~'
88
+ end
89
+
90
+ renderer = AdditionalLinkAttributesRenderer.new(:title => 'rendered')
91
+ paginate({}, :renderer => renderer) do
92
+ assert_select 'a[title=rendered]', 3
93
+ end
94
+ end
95
+
96
+ it "should have classnames on previous/next links" do
97
+ paginate do |pagination|
98
+ assert_select 'span.disabled.previous_page:first-child'
99
+ assert_select 'a.next_page[href]:last-child'
100
+ end
101
+ end
102
+
103
+ it "should warn about :prev_label being deprecated" do
104
+ lambda {
105
+ paginate({ :page => 2 }, :prev_label => 'Deprecated') do
106
+ assert_select 'a[href]:first-child', 'Deprecated'
107
+ end
108
+ }.should have_deprecation
109
+ end
110
+
111
+ it "should match expected markup" do
112
+ paginate
113
+ expected = <<-HTML
114
+ <div class="pagination"><span class="previous_page disabled">&#8592; Previous</span>
115
+ <em>1</em>
116
+ <a href="/foo/bar?page=2" rel="next">2</a>
117
+ <a href="/foo/bar?page=3">3</a>
118
+ <a href="/foo/bar?page=2" class="next_page" rel="next">Next &#8594;</a></div>
119
+ HTML
120
+ expected.strip!.gsub!(/\s{2,}/, ' ')
121
+ expected_dom = HTML::Document.new(expected).root
122
+
123
+ html_document.root.should == expected_dom
124
+ end
125
+
126
+ it "should output escaped URLs" do
127
+ paginate({:page => 1, :per_page => 1, :total_entries => 2},
128
+ :page_links => false, :params => { :tag => '<br>' })
129
+
130
+ assert_select 'a[href]', 1 do |links|
131
+ query = links.first['href'].split('?', 2)[1]
132
+ query.split('&amp;').sort.should == %w(page=2 tag=%3Cbr%3E)
133
+ end
134
+ end
135
+
136
+ ## advanced options for pagination ##
137
+
138
+ it "should be able to render without container" do
139
+ paginate({}, :container => false)
140
+ assert_select 'div.pagination', 0, 'main DIV present when it shouldn\'t'
141
+ assert_select 'a[href]', 3
142
+ end
143
+
144
+ it "should be able to render without page links" do
145
+ paginate({ :page => 2 }, :page_links => false) do
146
+ assert_select 'a[href]', 2 do |elements|
147
+ validate_page_numbers [1,3], elements
148
+ end
149
+ end
150
+ end
151
+
152
+ it "should have magic HTML ID for the container" do
153
+ paginate do |div|
154
+ div.first['id'].should be_nil
155
+ end
156
+
157
+ # magic ID
158
+ paginate({}, :id => true) do |div|
159
+ div.first['id'].should == 'fixnums_pagination'
160
+ end
161
+
162
+ # explicit ID
163
+ paginate({}, :id => 'custom_id') do |div|
164
+ div.first['id'].should == 'custom_id'
165
+ end
166
+ end
167
+
168
+ ## other helpers ##
169
+
170
+ it "should render a paginated section" do
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
+ ## parameter handling in page links ##
183
+
184
+ it "should preserve parameters on GET" do
185
+ request.params :foo => { :bar => 'baz' }
186
+ paginate
187
+ assert_links_match /foo\[bar\]=baz/
188
+ end
189
+
190
+ it "should not preserve parameters on POST" do
191
+ request.post
192
+ request.params :foo => 'bar'
193
+ paginate
194
+ assert_no_links_match /foo=bar/
195
+ end
196
+
197
+ it "should add additional parameters to links" do
198
+ paginate({}, :params => { :foo => 'bar' })
199
+ assert_links_match /foo=bar/
200
+ end
201
+
202
+ it "should add anchor parameter" do
203
+ paginate({}, :params => { :anchor => 'anchor' })
204
+ assert_links_match /#anchor$/
205
+ end
206
+
207
+ it "should remove arbitrary parameters" do
208
+ request.params :foo => 'bar'
209
+ paginate({}, :params => { :foo => nil })
210
+ assert_no_links_match /foo=bar/
211
+ end
212
+
213
+ it "should override default route parameters" do
214
+ paginate({}, :params => { :controller => 'baz', :action => 'list' })
215
+ assert_links_match %r{\Wbaz/list\W}
216
+ end
217
+
218
+ it "should paginate with custom page parameter" do
219
+ paginate({ :page => 2 }, :param_name => :developers_page) do
220
+ assert_select 'a[href]', 4 do |elements|
221
+ validate_page_numbers [1,1,3,3], elements, :developers_page
222
+ end
223
+ end
224
+ end
225
+
226
+ it "should paginate with complex custom page parameter" do
227
+ request.params :developers => { :page => 2 }
228
+
229
+ paginate({ :page => 2 }, :param_name => 'developers[page]') do
230
+ assert_select 'a[href]', 4 do |links|
231
+ assert_links_match /\?developers\[page\]=\d+$/, links
232
+ validate_page_numbers [1,1,3,3], links, 'developers[page]'
233
+ end
234
+ end
235
+ end
236
+
237
+ it "should paginate with custom route page parameter" do
238
+ request.symbolized_path_parameters.update :controller => 'dummy', :action => nil
239
+ paginate :per_page => 2 do
240
+ assert_select 'a[href]', 6 do |links|
241
+ assert_links_match %r{/page/(\d+)$}, links, [2, 3, 4, 5, 6, 2]
242
+ end
243
+ end
244
+ end
245
+
246
+ it "should paginate with custom route with dot separator page parameter" do
247
+ request.symbolized_path_parameters.update :controller => 'dummy', :action => 'dots'
248
+ paginate :per_page => 2 do
249
+ assert_select 'a[href]', 6 do |links|
250
+ assert_links_match %r{/page\.(\d+)$}, links, [2, 3, 4, 5, 6, 2]
251
+ end
252
+ end
253
+ end
254
+
255
+ it "should paginate with custom route and first page number implicit" do
256
+ request.symbolized_path_parameters.update :controller => 'ibocorp', :action => nil
257
+ paginate :page => 2, :per_page => 2 do
258
+ assert_select 'a[href]', 7 do |links|
259
+ assert_links_match %r{/ibocorp(?:/(\d+))?$}, links, [nil, nil, 3, 4, 5, 6, 3]
260
+ end
261
+ end
262
+ # Routes.recognize_path('/ibocorp/2').should == {:page=>'2', :action=>'index', :controller=>'ibocorp'}
263
+ # Routes.recognize_path('/ibocorp/foo').should == {:action=>'foo', :controller=>'ibocorp'}
264
+ end
265
+
266
+ ## internal hardcore stuff ##
267
+
268
+ it "should be able to guess the collection name" do
269
+ collection = mock
270
+ collection.expects(:total_pages).returns(1)
271
+
272
+ @template = '<%= will_paginate options %>'
273
+ controller.controller_name = 'developers'
274
+ assigns['developers'] = collection
275
+
276
+ paginate(nil)
277
+ end
278
+
279
+ it "should fail if the inferred collection is nil" do
280
+ @template = '<%= will_paginate options %>'
281
+ controller.controller_name = 'developers'
282
+
283
+ lambda {
284
+ paginate(nil)
285
+ }.should raise_error(ActionView::TemplateError, /@developers/)
286
+ end
287
+ end
288
+
289
+ class AdditionalLinkAttributesRenderer < WillPaginate::ViewHelpers::LinkRenderer
290
+ def initialize(link_attributes = nil)
291
+ super()
292
+ @additional_link_attributes = link_attributes || { :default => 'true' }
293
+ end
294
+
295
+ def link(text, target, attributes = {})
296
+ super(text, target, attributes.merge(@additional_link_attributes))
297
+ end
298
+ end
299
+
300
+ class DummyController
301
+ attr_reader :request
302
+ attr_accessor :controller_name
303
+
304
+ include ActionController::UrlFor
305
+ include Routes.url_helpers
306
+
307
+ def initialize
308
+ @request = DummyRequest.new
309
+ end
310
+
311
+ def params
312
+ @request.params
313
+ end
314
+ end
315
+
316
+ class IbocorpController < DummyController
317
+ end
318
+
319
+ class DummyRequest
320
+ attr_accessor :symbolized_path_parameters
321
+
322
+ def initialize
323
+ @get = true
324
+ @params = {}
325
+ @symbolized_path_parameters = { :controller => 'foo', :action => 'bar' }
326
+ end
327
+
328
+ def get?
329
+ @get
330
+ end
331
+
332
+ def post
333
+ @get = false
334
+ end
335
+
336
+ def relative_url_root
337
+ ''
338
+ end
339
+
340
+ def script_name
341
+ ''
342
+ end
343
+
344
+ def params(more = nil)
345
+ @params.update(more) if more
346
+ @params
347
+ end
348
+
349
+ def host_with_port
350
+ 'example.com'
351
+ end
352
+
353
+ def protocol
354
+ 'http:'
355
+ end
356
+ end