1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
require "cases/helper"
require 'models/post'
require 'models/comment'
module ActiveRecord
class RelationTest < ActiveRecord::TestCase
fixtures :posts, :comments
class FakeKlass < Struct.new(:table_name)
end
def test_construction
relation = nil
assert_nothing_raised do
relation = Relation.new :a, :b
end
assert_equal :a, relation.klass
assert_equal :b, relation.table
assert !relation.loaded, 'relation is not loaded'
end
def test_single_values
assert_equal [:limit, :offset, :lock, :readonly, :from, :reordering, :reverse_order, :uniq].map(&:to_s).sort,
Relation::SINGLE_VALUE_METHODS.map(&:to_s).sort
end
def test_initialize_single_values
relation = Relation.new :a, :b
Relation::SINGLE_VALUE_METHODS.each do |method|
assert_nil relation.send("#{method}_value"), method.to_s
end
end
def test_association_methods
assert_equal [:includes, :eager_load, :preload].map(&:to_s).sort,
Relation::ASSOCIATION_METHODS.map(&:to_s).sort
end
def test_initialize_association_methods
relation = Relation.new :a, :b
Relation::ASSOCIATION_METHODS.each do |method|
assert_equal [], relation.send("#{method}_values"), method.to_s
end
end
def test_multi_value_methods
assert_equal [:select, :group, :order, :joins, :where, :having, :bind, :references].map(&:to_s).sort,
Relation::MULTI_VALUE_METHODS.map(&:to_s).sort
end
def test_multi_value_initialize
relation = Relation.new :a, :b
Relation::MULTI_VALUE_METHODS.each do |method|
assert_equal [], relation.send("#{method}_values"), method.to_s
end
end
def test_extensions
relation = Relation.new :a, :b
assert_equal [], relation.extensions
end
def test_empty_where_values_hash
relation = Relation.new :a, :b
assert_equal({}, relation.where_values_hash)
relation.where_values << :hello
assert_equal({}, relation.where_values_hash)
end
def test_has_values
relation = Relation.new Post, Post.arel_table
relation.where_values << relation.table[:id].eq(10)
assert_equal({:id => 10}, relation.where_values_hash)
end
def test_values_wrong_table
relation = Relation.new Post, Post.arel_table
relation.where_values << Comment.arel_table[:id].eq(10)
assert_equal({}, relation.where_values_hash)
end
def test_tree_is_not_traversed
relation = Relation.new Post, Post.arel_table
left = relation.table[:id].eq(10)
right = relation.table[:id].eq(10)
combine = left.and right
relation.where_values << combine
assert_equal({}, relation.where_values_hash)
end
def test_table_name_delegates_to_klass
relation = Relation.new FakeKlass.new('foo'), :b
assert_equal 'foo', relation.table_name
end
def test_scope_for_create
relation = Relation.new :a, :b
assert_equal({}, relation.scope_for_create)
end
def test_create_with_value
relation = Relation.new Post, Post.arel_table
hash = { :hello => 'world' }
relation.create_with_value = hash
assert_equal hash, relation.scope_for_create
end
def test_create_with_value_with_wheres
relation = Relation.new Post, Post.arel_table
relation.where_values << relation.table[:id].eq(10)
relation.create_with_value = {:hello => 'world'}
assert_equal({:hello => 'world', :id => 10}, relation.scope_for_create)
end
# FIXME: is this really wanted or expected behavior?
def test_scope_for_create_is_cached
relation = Relation.new Post, Post.arel_table
assert_equal({}, relation.scope_for_create)
relation.where_values << relation.table[:id].eq(10)
assert_equal({}, relation.scope_for_create)
relation.create_with_value = {:hello => 'world'}
assert_equal({}, relation.scope_for_create)
end
def test_empty_eager_loading?
relation = Relation.new :a, :b
assert !relation.eager_loading?
end
def test_eager_load_values
relation = Relation.new :a, :b
relation.eager_load_values << :b
assert relation.eager_loading?
end
def test_references_values
relation = Relation.new :a, :b
assert_equal [], relation.references_values
relation = relation.references(:foo).references(:omg, :lol)
assert_equal ['foo', 'omg', 'lol'], relation.references_values
end
def test_references_values_dont_duplicate
relation = Relation.new :a, :b
relation = relation.references(:foo).references(:foo)
assert_equal ['foo'], relation.references_values
end
def test_apply_finder_options_takes_references
relation = Relation.new :a, :b
relation = relation.apply_finder_options(:references => :foo)
assert_equal ['foo'], relation.references_values
end
end
end
|