search_controller_test.rb
11 KB
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
require File.dirname(__FILE__) + '/../test_helper'
require 'search_controller'
# Re-raise errors caught by the controller.
class SearchController; def rescue_action(e) raise e end; end
class SearchControllerTest < Test::Unit::TestCase
def setup
@controller = SearchController.new
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
end
should 'filter stop words' do
@controller.expects(:locale).returns('pt_BR').at_least_once
get 'index', :query => 'a carne da vaca'
assert_response :success
assert_template 'index'
assert_equal 'carne vaca', assigns('filtered_query')
end
should 'search with filtered query' do
@controller.expects(:locale).returns('pt_BR').at_least_once
@controller.expects(:search).with(anything, 'carne vaca').at_least_once
@controller.expects(:search).with(anything, 'a carne da vaca').never
get 'index', :query => 'a carne da vaca'
end
should 'search only in specified types of content' do
get :index, :query => 'something not important', :find_in => [ 'articles' ]
assert_equal [:articles], assigns(:results).keys
end
should 'search in more than one specified types of content' do
get :index, :query => 'something not important', :find_in => [ 'articles', 'comments' ]
assert_equivalent [:articles, :comments ], assigns(:results).keys
end
should 'render success in search' do
get :index, :query => 'something not important'
assert_response :success
end
should 'search for articles' do
person = create_user('teste').person
art = person.articles.build(:name => 'an article to be found'); art.save!
get 'index', :query => 'article found', :find_in => [ 'articles' ]
assert_includes assigns(:results)[:articles], art
end
should 'search for articles in a specific category' do
person = create_user('teste').person
category = Category.create!(:name => 'my category', :environment => Environment.default)
# in category
art1 = person.articles.build(:name => 'an article to be found')
art1.categories << category
art1.save!
# not in category
art2 = person.articles.build(:name => 'another article to be found')
art2.save!
get :index, :category_path => [ 'my-category' ], :query => 'article found', :find_in => [ 'articles' ]
assert_includes assigns(:results)[:articles], art1
assert_not_includes assigns(:results)[:articles], art2
end
# 'assets' menu
should 'list articles in a specific category'
should 'search in comments' do
person = create_user('teste').person
art = person.articles.build(:name => 'an article to be found'); art.save!
comment = art.comments.build(:title => 'comment to be found', :body => 'hfyfyh', :author => person); comment.save!
get 'index', :query => 'found', :find_in => [ 'comments' ]
assert_includes assigns(:results)[:comments], comment
end
should 'search in comments in a specific category' do
person = create_user('teste').person
category = Category.create!(:name => 'my category', :environment => Environment.default)
# in category
art1 = person.articles.build(:name => 'an article to be found')
art1.categories << category
art1.save!
comment1 = art1.comments.build(:title => 'comment to be found', :body => 'hfyfyh', :author => person); comment1.save!
# not in category
art2 = person.articles.build(:name => 'another article to be found')
art2.save!
comment2 = art2.comments.build(:title => 'comment to be found', :body => 'hfyfyh', :author => person); comment2.save!
get :index, :category_path => ['my-category'], :query => 'found', :find_in => [ 'comments' ]
assert_includes assigns(:results)[:comments], comment1
assert_not_includes assigns(:results)[:comments], comment2
end
should 'find enterprises' do
ent = Enterprise.create!(:name => 'teste', :identifier => 'teste')
get 'index', :query => 'teste', :find_in => [ 'enterprises' ]
assert_includes assigns(:results)[:enterprises], ent
end
should 'find enterprises in a specified category' do
category = Category.create!(:name => 'my category', :environment => Environment.default)
# in category
ent1 = Enterprise.create!(:name => 'testing enterprise 1', :identifier => 'test1', :categories => [category])
# not in category
ent2 = Enterprise.create!(:name => 'testing enterprise 2', :identifier => 'test2')
get :index, :category_path => [ 'my-category' ], :query => 'testing', :find_in => [ 'enterprises' ]
assert_includes assigns(:results)[:enterprises], ent1
assert_not_includes assigns(:results)[:enterprises], ent2
end
# 'assets' menu
should 'list enterprises in a specified category'
should 'find people' do
p1 = create_user('people_1').person; p1.name = 'a beautiful person'; p1.save!
get :index, :query => 'beautiful', :find_in => [ 'people' ]
assert_includes assigns(:results)[:people], p1
end
should 'find people in a specific category' do
c = Category.create!(:name => 'my category', :environment => Environment.default)
p1 = create_user('people_1').person; p1.name = 'a beautiful person'; p1.categories << c; p1.save!
p2 = create_user('people_2').person; p2.name = 'another beautiful person'; p2.save!
get :index, :category_path => [ 'my-category' ], :query => 'beautiful', :find_in => [ 'people' ]
assert_includes assigns(:results)[:people], p1
assert_not_includes assigns(:results)[:people], p2
end
# 'assets' menu
should 'list people in a specified category'
should 'find communities' do
c1 = Community.create!(:name => 'a beautiful community', :identifier => 'bea_comm', :environment => Environment.default)
get :index, :query => 'beautiful', :find_in => [ 'communities' ]
assert_includes assigns(:results)[:communities], c1
end
should 'find communities in a specified category' do
c = Category.create!(:name => 'my category', :environment => Environment.default)
c1 = Community.create!(:name => 'a beautiful community', :identifier => 'bea_comm', :environment => Environment.default)
c2 = Community.create!(:name => 'another beautiful community', :identifier => 'an_bea_comm', :environment => Environment.default)
c1.categories << c; c1.save!
get :index, :category_path => [ 'my-category' ], :query => 'beautiful', :find_in => [ 'communities' ]
assert_includes assigns(:results)[:communities], c1
assert_not_includes assigns(:results)[:communities], c2
end
# 'assets' menu
should 'list communities in a specified category'
should 'find products' do
ent = Enterprise.create!(:name => 'teste', :identifier => 'teste')
prod = ent.products.create!(:name => 'a beautiful product')
get 'index', :query => 'beautiful', :find_in => ['products']
assert_includes assigns(:results)[:products], prod
end
should 'find products in a specific category' do
c = Category.create!(:name => 'my category', :environment => Environment.default)
ent1 = Enterprise.create!(:name => 'teste1', :identifier => 'teste1'); ent1.categories << c
ent2 = Enterprise.create!(:name => 'teste2', :identifier => 'teste2')
prod1 = ent1.products.create!(:name => 'a beautiful product')
prod2 = ent2.products.create!(:name => 'another beautiful product')
get :index, :category_path => ['my-category'], :query => 'beautiful', :find_in => ['products']
assert_includes assigns(:results)[:products], prod1
assert_not_includes assigns(:results)[:products], prod2
end
# 'assets' menu
should 'list products in a specific category'
should 'display search results' do
ent = Enterprise.create!(:name => 'display enterprise', :identifier => 'teste1')
product = ent.products.create!(:name => 'display product')
person = create_user('displayperson').person; person.name = 'display person'; person.save!
article = person.articles.create!(:name => 'display article')
comment = article.comments.create!(:title => 'display comment', :body => '...', :author => person)
community = Community.create!(:name => 'display community', :identifier => 'an_bea_comm')
get :index, :query => 'display'
names = {
:articles => 'Articles',
:comments => 'Comments',
:people => 'People',
:enterprises => 'Enterprises',
:communities => 'Communities',
:products => 'Products',
}
names.each do |thing, description|
assert_tag :tag => 'div', :attributes => { :id => "search-results-#{thing}" }, :descendant => { :tag => 'h3', :content => description }
assert_tag :tag => 'a', :content => "display #{thing.to_s.singularize}"
end
end
should 'present options of where to search' do
get :popup
names = {
:articles => 'Articles',
:comments => 'Comments',
:people => 'People',
:enterprises => 'Enterprises',
:communities => 'Communities',
:products => 'Products',
}
names.each do |thing,description|
assert_tag :tag => 'input', :attributes => { :type => 'checkbox', :name => "find_in[]", :value => thing.to_s, :checked => 'checked' }
assert_tag :tag => 'span', :content => description
end
end
should 'not display option to choose where to search when not inside filter' do
get :popup
assert_no_tag :tag => 'input', :attributes => { :type => 'radio', :name => 'search_whole_site', :value => 'yes' }
end
should 'display option to choose searching in whole site or in current category' do
parent = Category.create!(:name => 'cat', :environment => Environment.default)
Category.create!(:name => 'sub', :environment => Environment.default, :parent => parent)
get :popup, :category_path => [ 'cat', 'sub']
assert_tag :tag => 'input', :attributes => { :type => 'radio', :name => 'search_whole_site', :value => 'yes' }
assert_tag :tag => 'input', :attributes => { :type => 'radio', :name => 'search_whole_site', :value => 'no', :checked => 'checked' }
end
should 'search in whole site when told so' do
parent = Category.create!(:name => 'randomcat', :environment => Environment.default)
Category.create!(:name => 'randomchild', :environment => Environment.default, :parent => parent)
get :index, :category_path => [ 'randomcat', 'randomchild' ], :query => 'some random query', :search_whole_site => 'yes'
# search_whole_site must be removed to precent a infinite redirect loop
assert_redirected_to :action => 'index', :category_path => [], :query => 'some random query', :search_whole_site => nil
end
should 'submit form to root when not inside a filter' do
get :popup
assert_tag :tag => 'form', :attributes => { :action => '/search' }
end
should 'submit form to category path when inside a filter' do
get :popup, :category_path => Category.create!(:name => 'mycat', :environment => Environment.default).explode_path
assert_tag :tag => 'form', :attributes => { :action => '/search/index/mycat' }
end
should 'use GET method to search' do
get :popup
assert_tag :tag => 'form' , :attributes => { :method => 'get' }
end
end