beast rev 2066
[beast-modified.git] / vendor / plugins / will_paginate / test / finder_test.rb
blob7a7822d1796b7ec85a60fca81d901d37f774ed11
1 require File.dirname(__FILE__) + '/helper'
2 require File.dirname(__FILE__) + '/../init'
4 class FinderTest < ActiveRecordTestCase
5   fixtures :topics, :replies, :users, :projects, :developers_projects
7   def test_new_methods_presence
8     assert_respond_to_all Topic, %w(per_page paginate paginate_by_sql)
9   end
11   def test_paginated_collection
12     entries = %w(a b c)
13     collection = WillPaginate::Collection.new 2, 3, 10
14     collection.replace entries
16     assert_equal entries, collection
17     assert_respond_to_all collection, %w(page_count each offset size current_page per_page total_entries)
18     assert_equal Array, collection.entries.class
19     assert_equal 3, collection.offset
20   end
21   
22   def test_simple_paginate
23     entries = Topic.paginate :page => nil
24     assert_equal 1, entries.current_page
25     assert_nil entries.previous_page
26     assert_nil entries.next_page
27     assert_equal 1, entries.page_count
28     assert_equal 4, entries.size
29     
30     entries = Topic.paginate :page => 2
31     assert_equal 2, entries.current_page
32     assert_equal 1, entries.previous_page
33     assert_equal 1, entries.page_count
34     assert entries.empty?
36     # :page parameter in options is required!
37     assert_raise(ArgumentError){ Topic.paginate }
38     assert_raise(ArgumentError){ Topic.paginate({}) }
39   end
40   
41   def test_paginate_with_per_page
42     entries = Topic.paginate :page => 1, :per_page => 1
43     assert_equal 1, entries.size
44     assert_equal 4, entries.page_count
46     # Developer class has explicit per_page at 10
47     entries = Developer.paginate :page => 1
48     assert_equal 10, entries.size
49     assert_equal 2, entries.page_count
51     entries = Developer.paginate :page => 1, :per_page => 5
52     assert_equal 11, entries.total_entries
53     assert_equal 5, entries.size
54     assert_equal 3, entries.page_count
55   end
56   
57   def test_paginate_with_order
58     entries = Topic.paginate :page => 1, :order => 'created_at desc'
59     expected = [topics(:futurama), topics(:harvey_birdman), topics(:rails), topics(:ar)].reverse
60     assert_equal expected, entries.to_a
61     assert_equal 1, entries.page_count
62   end
63   
64   def test_paginate_with_conditions
65     entries = Topic.paginate :page => 1, :conditions => ["created_at > ?", 30.minutes.ago]
66     expected = [topics(:rails), topics(:ar)]
67     assert_equal expected, entries.to_a
68     assert_equal 1, entries.page_count
69   end
71   def test_paginate_through_associations
72     dhh = users :david
73     expected = [projects(:active_record), projects(:action_controller)]
74     entries = dhh.projects.paginate(:page => 1, :order => 'projects.id')
75     assert_equal expected, entries
76     assert_equal 2, entries.total_entries
78     assert_nothing_raised { dhh.projects.find(:all, :order => 'topics.id', :limit => 4) }
79     entries = dhh.projects.paginate(:page => 1, :order => 'topics.id', :per_page => 4)
80     assert_equal expected.reverse, entries
81   end
82   
83   def test_paginate_with_joins
84     entries = Developer.paginate :page => 1,
85                         :joins => 'LEFT JOIN developers_projects ON users.id = developers_projects.developer_id',
86                         :conditions => 'project_id = 1'        
87     assert_equal 2, entries.size
88     developer_names = entries.map { |d| d.name }
89     assert developer_names.include?('David')
90     assert developer_names.include?('Jamis')
92     expected = entries.to_a
93     entries = Developer.paginate :page => 1,
94                         :joins => 'LEFT JOIN developers_projects ON users.id = developers_projects.developer_id',
95                         :conditions => 'project_id = 1', :count => { :select => "users.id" }
96     assert_equal expected, entries.to_a
97   end
98   
99   def test_paginate_with_include_and_order
100     entries = Topic.paginate :page => 1, :include => :replies,  :order => 'replies.created_at asc, topics.created_at asc', :per_page => 10
101     expected = Topic.find :all, :include => 'replies', :order => 'replies.created_at asc, topics.created_at asc', :limit => 10
102     assert_equal expected, entries.to_a
103   end
105   def test_paginate_with_group
106     entries = Developer.paginate :page => 1, :per_page => 10, :group => 'salary'
107     expected = [ users(:david), users(:jamis), users(:dev_10), users(:poor_jamis) ].sort_by(&:salary)
108     assert_equal expected, entries.to_a.sort_by(&:salary)
109   end
111   def test_paginate_with_dynamic_finder
112     expected = [replies(:witty_retort), replies(:spam)]
113     assert_equal expected, Reply.paginate_all_by_topic_id(1, :page => 1)
114     assert_equal expected, Reply.paginate_by_topic_id(1, :page => 1)
116     entries = Developer.paginate :conditions => { :salary => 100000 }, :page => 1, :per_page => 5
117     assert_equal 8, entries.total_entries
118     assert_equal entries, Developer.paginate_by_salary(100000, :page => 1, :per_page => 5)
120     assert_raises StandardError do
121       Developer.paginate_by_inexistent_attribute 100000, :page => 1
122     end
123   end
125   def test_paginate_by_sql
126     assert_respond_to Developer, :paginate_by_sql
127     entries = Developer.paginate_by_sql ['select * from users where salary > ?', 80000],
128       :page => 2, :per_page => 3, :total_entries => 9
130     assert_equal (5..7).to_a, entries.map(&:id)
131     assert_equal 9, entries.total_entries
132   end
134   def test_edge_case_api_madness
135     # explicit :all should not break anything
136     assert_equal Topic.paginate(:page => nil), Topic.paginate(:all, :page => 1)
138     # this is a little weird test for issue #37
139     # the Topic model find and count methods accept an extra option, :foo
140     # this checks if that extra option was intact by our paginating finder
141     entries = Topic.paginate(:foo => 'bar', :page => 1)
142     assert_equal 'bar', entries.first
143     assert_equal 100, entries.total_entries
145     # Are we on edge? Find out by testing find_all which was removed in [6998]
146     unless Developer.respond_to? :find_all
147       # AR finders also accept arrays of IDs
148       # (this was broken in Rails before [6912])
149       entries = Developer.paginate((1..8).to_a, :per_page => 3, :page => 2)
150       assert_equal (4..6).to_a, entries.map(&:id)
151       assert_equal 8, entries.total_entries
152     end
153   end
155 protected
157   def assert_respond_to_all object, methods
158     methods.each do |method|
159       [method.to_s, method.to_sym].each {|m| assert_respond_to object, m }
160     end
161   end