Updated to latest rspec
[gitorious:dgiuntas-clone.git] / vendor / plugins / will_paginate / test / array_pagination_test.rb
1 require File.dirname(__FILE__) + '/helper'
2 require 'will_paginate'
3 require 'will_paginate/core_ext'
4
5 class ArrayPaginationTest < Test::Unit::TestCase
6   def test_simple
7     collection = ('a'..'e').to_a
8     
9     [{ :page => 1,  :per_page => 3,  :expected => %w( a b c ) },
10      { :page => 2,  :per_page => 3,  :expected => %w( d e ) },
11      { :page => 1,  :per_page => 5,  :expected => %w( a b c d e ) },
12      { :page => 3,  :per_page => 5,  :expected => [] },
13      { :page => -1, :per_page => 5,  :expected => [] },
14      { :page => 1,  :per_page => -5, :expected => [] },
15     ].
16     each do |conditions|
17       assert_equal conditions[:expected], collection.paginate(conditions.slice(:page, :per_page))
18     end
19   end
20
21   def test_defaults
22     result = (1..50).to_a.paginate
23     assert_equal 1, result.current_page
24     assert_equal 30, result.size
25   end
26
27   def test_deprecated_api
28     assert_deprecated 'paginate API' do
29       result = (1..50).to_a.paginate(2, 10)
30       assert_equal 2, result.current_page
31       assert_equal (11..20).to_a, result
32       assert_equal 50, result.total_entries
33     end
34     
35     assert_deprecated { [].paginate nil }
36   end
37
38   def test_total_entries_has_precedence
39     result = %w(a b c).paginate :total_entries => 5
40     assert_equal 5, result.total_entries
41   end
42
43   def test_argument_error_with_params_and_another_argument
44     assert_raise ArgumentError do
45       [].paginate({}, 5)
46     end
47   end
48
49   def test_paginated_collection
50     entries = %w(a b c)
51     collection = create(2, 3, 10) do |pager|
52       assert_equal entries, pager.replace(entries)
53     end
54
55     assert_equal entries, collection
56     assert_respond_to_all collection, %w(page_count each offset size current_page per_page total_entries)
57     assert_kind_of Array, collection
58     assert_instance_of Array, collection.entries
59     assert_equal 3, collection.offset
60     assert_equal 4, collection.page_count
61     assert !collection.out_of_bounds?
62   end
63
64   def test_out_of_bounds
65     entries = create(2, 3, 2){}
66     assert entries.out_of_bounds?
67     
68     entries = create(0, 3, 2){}
69     assert entries.out_of_bounds?
70     
71     entries = create(1, 3, 2){}
72     assert !entries.out_of_bounds?
73   end
74
75   def test_guessing_total_count
76     entries = create do |pager|
77       # collection is shorter than limit
78       pager.replace array
79     end
80     assert_equal 8, entries.total_entries
81     
82     entries = create(2, 5, 10) do |pager|
83       # collection is shorter than limit, but we have an explicit count
84       pager.replace array
85     end
86     assert_equal 10, entries.total_entries
87     
88     entries = create do |pager|
89       # collection is the same as limit; we can't guess
90       pager.replace array(5)
91     end
92     assert_equal nil, entries.total_entries
93     
94     entries = create do |pager|
95       # collection is empty; we can't guess
96       pager.replace array(0)
97     end
98     assert_equal nil, entries.total_entries
99   end
100
101   private
102     def create(page = 2, limit = 5, total = nil, &block)
103       WillPaginate::Collection.create(page, limit, total, &block)
104     end
105
106     def array(size = 3)
107       Array.new(size)
108     end
109     
110     def collect_deprecations
111       old_behavior = WillPaginate::Deprecation.behavior
112       deprecations = []
113       WillPaginate::Deprecation.behavior = Proc.new do |message, callstack|
114         deprecations << message
115       end
116       result = yield
117       [result, deprecations]
118     ensure
119       WillPaginate::Deprecation.behavior = old_behavior
120     end
121 end