Tweak oob method name
[gitorious:just_paginate.git] / test / test_just_paginate.rb
1 require File.dirname(__FILE__) + '/test_helper.rb'
2
3 class JustPaginateTest < Test::Unit::TestCase
4
5   context "The backend pagination function" do
6     should "basically work like this" do
7       paged_collection = [1,2,3,4,5,6,7,8,9,10]
8
9       entries, page_count = JustPaginate.paginate(1, 5, 100) do |index_range|
10         paged_collection.slice(index_range)
11       end
12
13       assert_equal 5, entries.size
14       assert_equal 20, page_count
15       assert_equal [1,2,3,4,5], entries
16     end
17
18     should "blow up if no selection strategy block is present" do
19       assert_raises RuntimeError do
20         JustPaginate.paginate(1, 20, 100)
21       end
22     end
23
24     should "provide predicate to check if pagination would exceed total pagecount" do
25       assert JustPaginate.page_out_of_bounds?(7,2,4)
26       assert !JustPaginate.page_out_of_bounds?(1,20,100)
27     end
28
29     should "state that pages below page 1 are out of bounds" do
30       assert JustPaginate.page_out_of_bounds?(-2,2,4)
31       assert JustPaginate.page_out_of_bounds?(-1,2,4)
32       assert JustPaginate.page_out_of_bounds?(0,2,4)
33     end
34
35     should "calculate correct total page count" do
36       assert_equal 25, JustPaginate.total_page_number(500, 20)
37       assert_equal 25, JustPaginate.total_page_number(498, 20)
38     end
39
40     should "correctly apply the supplied selection strategy" do
41       ran = false
42       sliced_entries, page_count = JustPaginate.paginate(1, 5, 10) do |index_range|
43         assert index_range.class == Range
44         assert_equal 0..4, index_range
45         ran = true
46       end
47       assert ran, "selection block didn't run"
48     end
49
50     should "calculate correct index ranges" do
51       assert_equal 0..1, JustPaginate.index_range(1,2,4)
52       assert_equal 2..3, JustPaginate.index_range(2,2,4)
53
54       assert_equal 0..2, JustPaginate.index_range(1,3,9)
55       assert_equal 3..5, JustPaginate.index_range(2,3,9)
56       assert_equal 6..8, JustPaginate.index_range(3,3,9)
57
58       assert_equal 0..2, JustPaginate.index_range(1,3,9)
59       assert_equal 3..5, JustPaginate.index_range(2,3,9)
60       assert_equal 6..8, JustPaginate.index_range(3,3,9)
61
62       assert_equal 0..19, JustPaginate.index_range(1,20,100)
63       assert_equal 60..79, JustPaginate.index_range(4,20,100)
64       assert_equal 60..79, JustPaginate.index_range(4,20,95)
65       assert_equal 80..99, JustPaginate.index_range(5,20,100)
66       assert_equal 80..95, JustPaginate.index_range(5,20,95)
67
68       assert_equal 460..479, JustPaginate.index_range(24,20,500)
69       assert_equal 480..499, JustPaginate.index_range(25,20,500)
70     end
71   end
72
73   should "just fall back to largest possible page if given page extends past collection bounds" do
74     assert_equal 2..3, JustPaginate.index_range(2,2,4)
75     assert_equal 2..3, JustPaginate.index_range(3,2,4)
76     assert_equal 2..3, JustPaginate.index_range(4,2,4)
77   end
78
79   context "The frontend pagination html helper" do
80     should "basically work like this" do
81       generated = JustPaginate.page_navigation(1, 10) { |page_no| "/projects/index?page=#{page_no}" }
82       # TODO write this and following tests after I've manually browser-reload-iterated something stable'
83     end
84
85     should "do page nav labels, truncation and quicklinks correctly" do
86       assert_correct_paging_labels "1 2 3 4 5 6 7 8 9 10", 1, 10
87
88       assert_correct_paging_labels "1 2 3 4 5 6 7 8 9 10 ... 50 >", 1, 50
89       assert_correct_paging_labels "1 2 3 4 5 6 7 8 9 10 ... 50 >", 5, 50
90       assert_correct_paging_labels "1 2 3 4 5 6 7 8 9 10 ... 50 >", 10, 50
91       assert_correct_paging_labels "1 2 3 4 5 6 7 8 9 10 ... 545 >", 1, 545
92
93       assert_correct_paging_labels "< 1 ... 11 12 13 14 15 16 17 18 19 20 ... 50 >", 11, 50
94       assert_correct_paging_labels "< 1 ... 12 13 14 15 16 17 18 19 20 21 ... 50 >", 12, 50
95       assert_correct_paging_labels "< 1 ... 21 22 23 24 25 26 27 28 29 30 ... 50 >", 21, 50
96       assert_correct_paging_labels "< 1 ... 40 41 42 43 44 45 46 47 48 49 ... 50 >", 40, 50
97
98       assert_correct_paging_labels "< 1 ... 41 42 43 44 45 46 47 48 49 50", 41, 50
99       assert_correct_paging_labels "< 1 ... 41 42 43 44 45 46 47 48 49 50", 45, 50
100       assert_correct_paging_labels "< 1 ... 41 42 43 44 45 46 47 48 49 50", 50, 50
101
102       assert_correct_paging_labels "< 1 ... 16 17 18 19 20 21 22 23 24 25", 24, 25
103       assert_correct_paging_labels "< 1 ... 16 17 18 19 20 21 22 23 24 25", 25, 25
104     end
105   end
106
107   def assert_correct_paging_labels(expected_joined, page, total)
108     p = JustPaginate
109     actual = p.page_labels(page, total).join(" ")
110     assert_equal expected_joined, actual, "labels didn't match expected paging labels'"
111   end
112
113 end