sunspot_matchers 1.3.0.2 → 2.0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile.lock +6 -8
- data/README.markdown +28 -18
- data/lib/sunspot_matchers/matchers.rb +20 -9
- data/lib/sunspot_matchers/test_helper.rb +6 -6
- data/lib/sunspot_matchers/version.rb +1 -1
- data/spec/sunspot_matchers_spec.rb +98 -70
- data/sunspot_matchers.gemspec +1 -1
- data/test/sunspot_matchers_test.rb +62 -62
- metadata +70 -91
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,17 +1,16 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
sunspot_matchers (
|
4
|
+
sunspot_matchers (2.0.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: http://rubygems.org/
|
8
8
|
specs:
|
9
|
-
builder (3.
|
9
|
+
builder (3.2.0)
|
10
10
|
diff-lcs (1.1.2)
|
11
|
-
escape (0.0.4)
|
12
11
|
pr_geohash (1.0.0)
|
13
12
|
rake (0.8.7)
|
14
|
-
rsolr (1.0.
|
13
|
+
rsolr (1.0.9)
|
15
14
|
builder (>= 2.1.2)
|
16
15
|
rspec (2.4.0)
|
17
16
|
rspec-core (~> 2.4.0)
|
@@ -21,10 +20,9 @@ GEM
|
|
21
20
|
rspec-expectations (2.4.0)
|
22
21
|
diff-lcs (~> 1.1.2)
|
23
22
|
rspec-mocks (2.4.0)
|
24
|
-
sunspot (
|
25
|
-
escape (~> 0.0.4)
|
23
|
+
sunspot (2.0.0)
|
26
24
|
pr_geohash (~> 1.0)
|
27
|
-
rsolr (~> 1.0.
|
25
|
+
rsolr (~> 1.0.7)
|
28
26
|
|
29
27
|
PLATFORMS
|
30
28
|
ruby
|
@@ -33,5 +31,5 @@ DEPENDENCIES
|
|
33
31
|
bundler (>= 1.0.0)
|
34
32
|
rake
|
35
33
|
rspec (~> 2.4.0)
|
36
|
-
sunspot (~>
|
34
|
+
sunspot (~> 2.0.0)
|
37
35
|
sunspot_matchers!
|
data/README.markdown
CHANGED
@@ -60,6 +60,12 @@ If you want to verify that a model has a searchable field, you can use this matc
|
|
60
60
|
|
61
61
|
`Post.should have_searchable_field(:name)`
|
62
62
|
|
63
|
+
You can also use the shorthand syntax:
|
64
|
+
|
65
|
+
describe User do
|
66
|
+
it { should have_searchable_field(:name) }
|
67
|
+
end
|
68
|
+
|
63
69
|
## have_search_params
|
64
70
|
|
65
71
|
This is where the bulk of the functionality lies. There are seven types of search matches you can perform: `keywords` or `fulltext`,
|
@@ -70,11 +76,15 @@ have a dozen `with` restrictions on a search and still write an expectation on a
|
|
70
76
|
|
71
77
|
Negative expectations also work correctly. `should_not` will fail if the search actually includes the expectation.
|
72
78
|
|
73
|
-
With all matchers, you can
|
74
|
-
|
75
|
-
you specify `keywords` and `with` restrictions in the same
|
79
|
+
With all matchers, you can pass a block and perform multi statement expectations inside the
|
80
|
+
block. Keep in mind, that only the expectation type specified as the argument will actually be checked. So if
|
81
|
+
you specify `keywords` and `with` restrictions in the same block, but you said `have_search_params(:keywords, ...`
|
76
82
|
the `with` restrictions are simply ignored.
|
77
83
|
|
84
|
+
Without creative usage of parentheses you can not use do...end blocks to pass multi statement expectations to the matcher
|
85
|
+
though. Because do...end have such a low binding precedent, the block is passed to the wrong method. Curly syntax blocks
|
86
|
+
will work though {...}, or you can pass a Proc as the last argument.
|
87
|
+
|
78
88
|
### wildcard matching
|
79
89
|
|
80
90
|
keywords, with, without, and order_by support wildcard expectations using the `any_param` parameter:
|
@@ -109,7 +119,7 @@ You can match against a with restriction:
|
|
109
119
|
|
110
120
|
Sunspot.session.should have_search_params(:with, :author_name, 'Mark Twain')
|
111
121
|
|
112
|
-
Complex conditions can be matched by using a
|
122
|
+
Complex conditions can be matched by using a block instead of a value. Be aware that order does matter, not for
|
113
123
|
the actual results that would come out of Solr, but the matcher will fail of the order of `with` restrictions is
|
114
124
|
different.
|
115
125
|
|
@@ -120,12 +130,12 @@ different.
|
|
120
130
|
end
|
121
131
|
end
|
122
132
|
|
123
|
-
Sunspot.session.should have_search_params(:with
|
133
|
+
Sunspot.session.should have_search_params(:with) {
|
124
134
|
any_of do
|
125
135
|
with :category_ids, 1
|
126
136
|
with :category_ids, 2
|
127
137
|
end
|
128
|
-
}
|
138
|
+
}
|
129
139
|
|
130
140
|
### :without
|
131
141
|
|
@@ -149,7 +159,7 @@ You can also specify only page or per_page, both are not required.
|
|
149
159
|
|
150
160
|
### :order_by
|
151
161
|
|
152
|
-
Expectations on multiple orderings are supported using using the
|
162
|
+
Expectations on multiple orderings are supported using using the block format mentioned above.
|
153
163
|
|
154
164
|
Sunspot.search(Post) do
|
155
165
|
order_by :published_at, :desc
|
@@ -174,10 +184,10 @@ Faceting where a query is excluded:
|
|
174
184
|
facet(:category_ids, :exclude => category_filter)
|
175
185
|
end
|
176
186
|
|
177
|
-
Sunspot.session.should have_search_params(:facet
|
187
|
+
Sunspot.session.should have_search_params(:facet) {
|
178
188
|
category_filter = with(:category_ids, 2)
|
179
189
|
facet(:category_ids, :exclude => category_filter)
|
180
|
-
}
|
190
|
+
}
|
181
191
|
|
182
192
|
Query faceting:
|
183
193
|
|
@@ -192,7 +202,7 @@ Query faceting:
|
|
192
202
|
end
|
193
203
|
end
|
194
204
|
|
195
|
-
Sunspot.session.should have_search_params(:facet
|
205
|
+
Sunspot.session.should have_search_params(:facet) {
|
196
206
|
facet(:average_rating) do
|
197
207
|
row(1.0..2.0) do
|
198
208
|
with(:average_rating, 1.0..2.0)
|
@@ -201,7 +211,7 @@ Query faceting:
|
|
201
211
|
with(:average_rating, 2.0..3.0)
|
202
212
|
end
|
203
213
|
end
|
204
|
-
}
|
214
|
+
}
|
205
215
|
|
206
216
|
### :boost
|
207
217
|
|
@@ -213,11 +223,11 @@ Field boost matching:
|
|
213
223
|
end
|
214
224
|
end
|
215
225
|
|
216
|
-
Sunspot.session.should have_search_params(:boost
|
226
|
+
Sunspot.session.should have_search_params(:boost) {
|
217
227
|
keywords 'great pizza' do
|
218
228
|
boost_fields :body => 2.0
|
219
229
|
end
|
220
|
-
}
|
230
|
+
}
|
221
231
|
|
222
232
|
Boost query matching:
|
223
233
|
|
@@ -229,13 +239,13 @@ Boost query matching:
|
|
229
239
|
end
|
230
240
|
end
|
231
241
|
|
232
|
-
Sunspot.session.should have_search_params(:boost
|
242
|
+
Sunspot.session.should have_search_params(:boost) {
|
233
243
|
keywords 'great pizza' do
|
234
244
|
boost(2.0) do
|
235
245
|
with :blog_id, 4
|
236
246
|
end
|
237
247
|
end
|
238
|
-
}
|
248
|
+
}
|
239
249
|
|
240
250
|
Boost function matching:
|
241
251
|
|
@@ -245,11 +255,11 @@ Boost function matching:
|
|
245
255
|
end
|
246
256
|
end
|
247
257
|
|
248
|
-
Sunspot.session.should have_search_params(:boost
|
258
|
+
Sunspot.session.should have_search_params(:boost) {
|
249
259
|
keywords 'great pizza' do
|
250
260
|
boost(function { sum(:average_rating, product(:popularity, 10)) })
|
251
261
|
end
|
252
|
-
}
|
262
|
+
}
|
253
263
|
|
254
264
|
# Assertions
|
255
265
|
|
@@ -270,7 +280,7 @@ These are used like:
|
|
270
280
|
Sunspot.search(Post) do
|
271
281
|
with :category_ids, 1..3
|
272
282
|
end
|
273
|
-
assert_has_search_params Sunspot.session, :with
|
283
|
+
assert_has_search_params Sunspot.session, :with {
|
274
284
|
with :category_ids, 1..3
|
275
285
|
}
|
276
286
|
|
@@ -123,9 +123,9 @@ module SunspotMatchers
|
|
123
123
|
end
|
124
124
|
|
125
125
|
class HaveSearchParams
|
126
|
-
def initialize(method, *args)
|
126
|
+
def initialize(method, *args, &block)
|
127
127
|
@method = method
|
128
|
-
@args = args
|
128
|
+
@args = [*args, block].compact
|
129
129
|
end
|
130
130
|
|
131
131
|
def matches?(actual)
|
@@ -158,12 +158,14 @@ module SunspotMatchers
|
|
158
158
|
OrderByMatcher
|
159
159
|
when :paginate
|
160
160
|
PaginationMatcher
|
161
|
+
when :group
|
162
|
+
GroupMatcher
|
161
163
|
end
|
162
164
|
end
|
163
165
|
end
|
164
166
|
|
165
|
-
def have_search_params(method, *args)
|
166
|
-
HaveSearchParams.new(method, *args)
|
167
|
+
def have_search_params(method, *args, &block)
|
168
|
+
HaveSearchParams.new(method, *args, &block)
|
167
169
|
end
|
168
170
|
|
169
171
|
class WithMatcher < BaseMatcher
|
@@ -273,6 +275,16 @@ module SunspotMatchers
|
|
273
275
|
end
|
274
276
|
end
|
275
277
|
|
278
|
+
class GroupMatcher < BaseMatcher
|
279
|
+
def search_method
|
280
|
+
:group
|
281
|
+
end
|
282
|
+
|
283
|
+
def keys_to_compare
|
284
|
+
comparison_params.keys.select {|key| /group/ =~ key.to_s}
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
276
288
|
class BeASearchFor
|
277
289
|
def initialize(expected_class)
|
278
290
|
@expected_class = expected_class
|
@@ -312,11 +324,10 @@ module SunspotMatchers
|
|
312
324
|
@field = field
|
313
325
|
end
|
314
326
|
|
315
|
-
def matches?(
|
316
|
-
@klass =
|
317
|
-
Sunspot::Setup.for(@klass)
|
318
|
-
|
319
|
-
end
|
327
|
+
def matches?(klass_or_object)
|
328
|
+
@klass = klass_or_object.class.name == 'Class' ? klass_or_object : klass_or_object.class
|
329
|
+
@sunspot = Sunspot::Setup.for(@klass)
|
330
|
+
(@sunspot.all_text_fields + @sunspot.fields).collect(&:name).include?(@field)
|
320
331
|
end
|
321
332
|
|
322
333
|
def failure_message_for_should
|
@@ -6,10 +6,10 @@ module SunspotMatchers
|
|
6
6
|
class HaveSearchParamsForSession
|
7
7
|
include Test::Unit::Assertions
|
8
8
|
|
9
|
-
def initialize(session, method, *args)
|
9
|
+
def initialize(session, method, *args, &block)
|
10
10
|
@session = session
|
11
11
|
@method = method
|
12
|
-
@args = args
|
12
|
+
@args = [*args, block].compact
|
13
13
|
end
|
14
14
|
|
15
15
|
def get_matcher
|
@@ -63,15 +63,15 @@ module SunspotMatchers
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
module TestHelper
|
66
|
-
def assert_has_search_params(session, *method_and_args)
|
66
|
+
def assert_has_search_params(session, *method_and_args, &block)
|
67
67
|
method, *args = method_and_args
|
68
|
-
matcher = HaveSearchParamsForSession.new(session, method, *args).get_matcher
|
68
|
+
matcher = HaveSearchParamsForSession.new(session, method, *args, &block).get_matcher
|
69
69
|
assert matcher.match?, matcher.missing_param_error_message
|
70
70
|
end
|
71
71
|
|
72
|
-
def assert_has_no_search_params(session, *method_and_args)
|
72
|
+
def assert_has_no_search_params(session, *method_and_args, &block)
|
73
73
|
method, *args = method_and_args
|
74
|
-
matcher = HaveSearchParamsForSession.new(session, method, *args).get_matcher
|
74
|
+
matcher = HaveSearchParamsForSession.new(session, method, *args, &block).get_matcher
|
75
75
|
assert !matcher.match?, matcher.unexpected_match_error_message
|
76
76
|
end
|
77
77
|
|