To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / .svn / pristine / 38 / 384178c4f05b1a0eb059a8f4d3cd70f8c0aec17d.svn-base @ 1297:0a574315af3e

History | View | Annotate | Download (6.46 KB)

1
require 'test/unit'
2

    
3
require 'rubygems'
4
require 'active_record'
5

    
6
$:.unshift File.dirname(__FILE__) + '/../lib'
7
require File.dirname(__FILE__) + '/../init'
8

    
9
class Test::Unit::TestCase
10
  def assert_queries(num = 1)
11
    $query_count = 0
12
    yield
13
  ensure
14
    assert_equal num, $query_count, "#{$query_count} instead of #{num} queries were executed."
15
  end
16

    
17
  def assert_no_queries(&block)
18
    assert_queries(0, &block)
19
  end
20
end
21

    
22
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:")
23

    
24
# AR keeps printing annoying schema statements
25
$stdout = StringIO.new
26

    
27
def setup_db
28
  ActiveRecord::Base.logger
29
  ActiveRecord::Schema.define(:version => 1) do
30
    create_table :mixins do |t|
31
      t.column :type, :string
32
      t.column :parent_id, :integer
33
    end
34
  end
35
end
36

    
37
def teardown_db
38
  ActiveRecord::Base.connection.tables.each do |table|
39
    ActiveRecord::Base.connection.drop_table(table)
40
  end
41
end
42

    
43
class Mixin < ActiveRecord::Base
44
end
45

    
46
class TreeMixin < Mixin 
47
  acts_as_tree :foreign_key => "parent_id", :order => "id"
48
end
49

    
50
class TreeMixinWithoutOrder < Mixin
51
  acts_as_tree :foreign_key => "parent_id"
52
end
53

    
54
class RecursivelyCascadedTreeMixin < Mixin
55
  acts_as_tree :foreign_key => "parent_id"
56
  has_one :first_child, :class_name => 'RecursivelyCascadedTreeMixin', :foreign_key => :parent_id
57
end
58

    
59
class TreeTest < Test::Unit::TestCase
60
  
61
  def setup
62
    setup_db
63
    @root1 = TreeMixin.create!
64
    @root_child1 = TreeMixin.create! :parent_id => @root1.id
65
    @child1_child = TreeMixin.create! :parent_id => @root_child1.id
66
    @root_child2 = TreeMixin.create! :parent_id => @root1.id
67
    @root2 = TreeMixin.create!
68
    @root3 = TreeMixin.create!
69
  end
70

    
71
  def teardown
72
    teardown_db
73
  end
74

    
75
  def test_children
76
    assert_equal @root1.children, [@root_child1, @root_child2]
77
    assert_equal @root_child1.children, [@child1_child]
78
    assert_equal @child1_child.children, []
79
    assert_equal @root_child2.children, []
80
  end
81

    
82
  def test_parent
83
    assert_equal @root_child1.parent, @root1
84
    assert_equal @root_child1.parent, @root_child2.parent
85
    assert_nil @root1.parent
86
  end
87

    
88
  def test_delete
89
    assert_equal 6, TreeMixin.count
90
    @root1.destroy
91
    assert_equal 2, TreeMixin.count
92
    @root2.destroy
93
    @root3.destroy
94
    assert_equal 0, TreeMixin.count
95
  end
96

    
97
  def test_insert
98
    @extra = @root1.children.create
99

    
100
    assert @extra
101

    
102
    assert_equal @extra.parent, @root1
103

    
104
    assert_equal 3, @root1.children.size
105
    assert @root1.children.include?(@extra)
106
    assert @root1.children.include?(@root_child1)
107
    assert @root1.children.include?(@root_child2)
108
  end
109

    
110
  def test_ancestors
111
    assert_equal [], @root1.ancestors
112
    assert_equal [@root1], @root_child1.ancestors
113
    assert_equal [@root_child1, @root1], @child1_child.ancestors
114
    assert_equal [@root1], @root_child2.ancestors
115
    assert_equal [], @root2.ancestors
116
    assert_equal [], @root3.ancestors
117
  end
118

    
119
  def test_root
120
    assert_equal @root1, TreeMixin.root
121
    assert_equal @root1, @root1.root
122
    assert_equal @root1, @root_child1.root
123
    assert_equal @root1, @child1_child.root
124
    assert_equal @root1, @root_child2.root
125
    assert_equal @root2, @root2.root
126
    assert_equal @root3, @root3.root
127
  end
128

    
129
  def test_roots
130
    assert_equal [@root1, @root2, @root3], TreeMixin.roots
131
  end
132

    
133
  def test_siblings
134
    assert_equal [@root2, @root3], @root1.siblings
135
    assert_equal [@root_child2], @root_child1.siblings
136
    assert_equal [], @child1_child.siblings
137
    assert_equal [@root_child1], @root_child2.siblings
138
    assert_equal [@root1, @root3], @root2.siblings
139
    assert_equal [@root1, @root2], @root3.siblings
140
  end
141

    
142
  def test_self_and_siblings
143
    assert_equal [@root1, @root2, @root3], @root1.self_and_siblings
144
    assert_equal [@root_child1, @root_child2], @root_child1.self_and_siblings
145
    assert_equal [@child1_child], @child1_child.self_and_siblings
146
    assert_equal [@root_child1, @root_child2], @root_child2.self_and_siblings
147
    assert_equal [@root1, @root2, @root3], @root2.self_and_siblings
148
    assert_equal [@root1, @root2, @root3], @root3.self_and_siblings
149
  end           
150
end
151

    
152
class TreeTestWithEagerLoading < Test::Unit::TestCase
153
  
154
  def setup 
155
    teardown_db
156
    setup_db
157
    @root1 = TreeMixin.create!
158
    @root_child1 = TreeMixin.create! :parent_id => @root1.id
159
    @child1_child = TreeMixin.create! :parent_id => @root_child1.id
160
    @root_child2 = TreeMixin.create! :parent_id => @root1.id
161
    @root2 = TreeMixin.create!
162
    @root3 = TreeMixin.create!
163
    
164
    @rc1 = RecursivelyCascadedTreeMixin.create!
165
    @rc2 = RecursivelyCascadedTreeMixin.create! :parent_id => @rc1.id 
166
    @rc3 = RecursivelyCascadedTreeMixin.create! :parent_id => @rc2.id
167
    @rc4 = RecursivelyCascadedTreeMixin.create! :parent_id => @rc3.id
168
  end
169

    
170
  def teardown
171
    teardown_db
172
  end
173
    
174
  def test_eager_association_loading
175
    roots = TreeMixin.find(:all, :include => :children, :conditions => "mixins.parent_id IS NULL", :order => "mixins.id")
176
    assert_equal [@root1, @root2, @root3], roots                     
177
    assert_no_queries do
178
      assert_equal 2, roots[0].children.size
179
      assert_equal 0, roots[1].children.size
180
      assert_equal 0, roots[2].children.size
181
    end   
182
  end
183
  
184
  def test_eager_association_loading_with_recursive_cascading_three_levels_has_many
185
    root_node = RecursivelyCascadedTreeMixin.find(:first, :include => { :children => { :children => :children } }, :order => 'mixins.id')
186
    assert_equal @rc4, assert_no_queries { root_node.children.first.children.first.children.first }
187
  end
188
  
189
  def test_eager_association_loading_with_recursive_cascading_three_levels_has_one
190
    root_node = RecursivelyCascadedTreeMixin.find(:first, :include => { :first_child => { :first_child => :first_child } }, :order => 'mixins.id')
191
    assert_equal @rc4, assert_no_queries { root_node.first_child.first_child.first_child }
192
  end
193
  
194
  def test_eager_association_loading_with_recursive_cascading_three_levels_belongs_to
195
    leaf_node = RecursivelyCascadedTreeMixin.find(:first, :include => { :parent => { :parent => :parent } }, :order => 'mixins.id DESC')
196
    assert_equal @rc1, assert_no_queries { leaf_node.parent.parent.parent }
197
  end 
198
end
199

    
200
class TreeTestWithoutOrder < Test::Unit::TestCase
201
  
202
  def setup                               
203
    setup_db
204
    @root1 = TreeMixinWithoutOrder.create!
205
    @root2 = TreeMixinWithoutOrder.create!
206
  end
207

    
208
  def teardown
209
    teardown_db
210
  end
211

    
212
  def test_root
213
    assert [@root1, @root2].include?(TreeMixinWithoutOrder.root)
214
  end
215
  
216
  def test_roots
217
    assert_equal [], [@root1, @root2] - TreeMixinWithoutOrder.roots
218
  end
219
end