-
Notifications
You must be signed in to change notification settings - Fork 1
/
dsl_test.rb
173 lines (143 loc) · 5.81 KB
/
dsl_test.rb
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
require File.expand_path(File.dirname(__FILE__)) + "/test_helper"
require 'schema'
require 'relata/dsl'
class DSLTest < ActiveSupport::TestCase
setup do
setup_db
@caelum = Post.create :body => "CaelumObjects training and inovation"
@guilherme = Post.create :body => "Guilherme Silveira"
end
test "given an attribute and expectation, gives the results" do
posts = Post.where(:body).like?("%caelum%").all
assert_equal @caelum, posts[0]
assert_equal 1, posts.size
posts = Post.where { body.like? "%caelum%" }
assert_equal @caelum, posts[0]
assert_equal 1, posts.size
end
test "given an attribute and constraint expectation, gives the results" do
posts = Post.where { body.length < 22 }
assert_equal @guilherme, posts[0]
assert_equal 1, posts.size
end
test "exists posts with comments" do
@caelum.update_attributes(:comments => [Comment.create])
posts = Post.where(:comments).count.exists?
assert_equal @caelum, posts[0]
assert_equal 1, posts.size
end
test "exists posts with comments can be shortcuted with exists?" do
@caelum.update_attributes(:comments => [Comment.create])
posts = Post.where(:comments).exists?
assert_equal @caelum, posts[0]
assert_equal 1, posts.size
posts = Post.where { comments.exists? }
assert_equal @caelum, posts[0]
assert_equal 1, posts.size
end
test "exists posts with more than 2 comments" do
@caelum.update_attributes(:comments => [Comment.create, Comment.create, Comment.create])
posts = Post.where(:comments).count.gt(2)
assert_equal @caelum, posts.first
assert_equal 3, posts.first.comments.size
end
test "exists posts with less than 2 comments" do
@caelum.update_attributes(:comments => [Comment.create])
posts = Post.where(:comments).count.lt(2)
assert_equal @caelum, posts.first
assert_equal 1, posts.first.comments.size
end
test "exists posts with more than or equals 2 comments" do
@caelum.update_attributes(:comments => [Comment.create, Comment.create])
@guilherme.update_attributes(:comments => [Comment.create, Comment.create, Comment.create])
posts = Post.where(:comments).count.ge(2).all
assert_equal 2, posts.size
assert_equal @caelum, posts[0]
assert_equal @guilherme, posts[1]
end
test "dsl query supports first" do
@caelum.update_attributes(:comments => [Comment.create, Comment.create])
@guilherme.update_attributes(:comments => [Comment.create, Comment.create, Comment.create])
posts = Post.where(:comments).count.ge(2).first
assert_equal @caelum, posts
end
test "exists posts using strict extended methods" do
@caelum.update_attributes(:comments => [Comment.create, Comment.create])
@guilherme.update_attributes(:comments => [Comment.create, Comment.create, Comment.create])
posts = Post.where { comments >= 2 }
assert_equal @caelum, posts[0]
assert_equal 2, posts.size
assert_equal @guilherme, posts[1]
end
test "strict block supports first" do
@caelum.update_attributes(:comments => [Comment.create, Comment.create])
@guilherme.update_attributes(:comments => [Comment.create, Comment.create, Comment.create])
post = Post.where { comments >= 2 }.first
assert_equal @caelum, post
end
test "exists posts using range expectations" do
@caelum.update_attributes :published_at => 1.year.ago
posts = Post.where { published_at.between(2.years.ago, 6.months.ago) }
assert_equal @caelum, posts[0]
assert_equal 1, posts.size
end
test "accepts two conditions inline" do
@caelum.update_attributes :published_at => 1.year.ago
@guilherme.update_attributes :published_at => 1.year.ago
posts = Post.where {
published_at.between(2.years.ago, 6.months.ago)
body.like?("%lum%")
}
assert_equal @caelum, posts[0]
assert_equal 1, posts.size
end
test "supports two conditions in dsl mixing everything together" do
@caelum.update_attributes(:comments => [Comment.create, Comment.create])
@guilherme.update_attributes(:comments => [Comment.create, Comment.create, Comment.create])
posts = Post.where { comments >= 1 }.where(:body).like?("%lum%")
assert_equal @caelum, posts[0]
assert_equal 1, posts.size
end
test "supports == with relation count" do
@caelum.update_attributes(:comments => [Comment.create, Comment.create])
posts = Post.where { comments == 2 }
assert_equal @caelum, posts[0]
assert_equal 1, posts.size
end
test "supports == with simple field" do
posts = Post.where { body == "CaelumObjects training and inovation" }
assert_equal @caelum, posts[0]
assert_equal 1, posts.size
end
test "supports != with simple field" do
posts = Post.where { body != "diff" }
assert_equal @caelum, posts[0]
assert_equal @guilherme, posts[1]
assert_equal 2, posts.size
end
test "accepts two conditions one after the other" do
@caelum.update_attributes :published_at => 1.year.ago
@guilherme.update_attributes :published_at => 1.year.ago
posts = Post.where { published_at.between(2.years.ago, 6.months.ago) }
assert_equal @caelum, posts[0]
assert_equal 2, posts.size
posts = posts.where { body.like?("%lum%") }
assert_equal @caelum, posts[0]
assert_equal 1, posts.size
end
test "accepts any custom condition" do
posts = Post.where { body "like ?", "%lum%" }
assert_equal @caelum, posts[0]
assert_equal 1, posts.size
end
# test "second level relation in a dsl" do
# comment = Comment.create :description => "dsl test"
# @caelum.update_attributes :comments => [comment]
#
# posts = Post.where{ comments.description.like?("%dsl test%") }
# assert_equal @caelum, posts[0]
# assert_equal 1, posts.size
#
# end
# Author.where(:posts).comments.count.gt(2)
end