14
14
15
15
import pretend
16
16
import pytest
17
+ from webob .multidict import MultiDict
17
18
18
19
from pyramid .httpexceptions import HTTPNotFound
19
20
23
24
search ,
24
25
)
25
26
27
+ from ..common .db .accounts import UserFactory
28
+ from ..common .db .classifiers import ClassifierFactory
26
29
from ..common .db .packaging import (
27
30
ProjectFactory , ReleaseFactory , FileFactory ,
28
31
)
29
- from ..common .db .accounts import UserFactory
30
32
31
33
32
34
def test_httpexception_view ():
@@ -98,19 +100,21 @@ def test_esi_current_user_indicator():
98
100
class TestSearch :
99
101
100
102
@pytest .mark .parametrize ("page" , [None , 1 , 5 ])
101
- def test_with_a_query (self , monkeypatch , page ):
102
- params = {"q" : "foo bar" }
103
+ def test_with_a_query (self , monkeypatch , db_request , page ):
104
+ params = MultiDict ( {"q" : "foo bar" })
103
105
if page is not None :
104
106
params ["page" ] = page
105
- suggest = pretend .stub ()
106
- query = pretend .stub (
107
+ db_request .params = params
108
+
109
+ sort = pretend .stub ()
110
+ suggest = pretend .stub (
111
+ sort = pretend .call_recorder (lambda * a , ** kw : sort ),
112
+ )
113
+ es_query = pretend .stub (
107
114
suggest = pretend .call_recorder (lambda * a , ** kw : suggest ),
108
115
)
109
- request = pretend .stub (
110
- es = pretend .stub (
111
- query = pretend .call_recorder (lambda * a , ** kw : query ),
112
- ),
113
- params = params ,
116
+ db_request .es = pretend .stub (
117
+ query = pretend .call_recorder (lambda * a , ** kw : es_query )
114
118
)
115
119
116
120
page_obj = pretend .stub (page_count = (page or 1 ) + 10 )
@@ -121,16 +125,18 @@ def test_with_a_query(self, monkeypatch, page):
121
125
url_maker_factory = pretend .call_recorder (lambda request : url_maker )
122
126
monkeypatch .setattr (views , "paginate_url_factory" , url_maker_factory )
123
127
124
- assert search (request ) == {
128
+ assert search (db_request ) == {
125
129
"page" : page_obj ,
126
- "term" : params .get ("q" ),
127
- "order" : params .get ("o" ),
130
+ "term" : params .get ("q" , '' ),
131
+ "order" : params .get ("o" , '' ),
132
+ "applied_filters" : [],
133
+ "available_filters" : [],
128
134
}
129
135
assert page_cls .calls == [
130
136
pretend .call (suggest , url_maker = url_maker , page = page or 1 ),
131
137
]
132
- assert url_maker_factory .calls == [pretend .call (request )]
133
- assert request .es .query .calls == [
138
+ assert url_maker_factory .calls == [pretend .call (db_request )]
139
+ assert db_request .es .query .calls == [
134
140
pretend .call (
135
141
"multi_match" ,
136
142
query = "foo bar" ,
@@ -142,7 +148,7 @@ def test_with_a_query(self, monkeypatch, page):
142
148
],
143
149
),
144
150
]
145
- assert query .suggest .calls == [
151
+ assert es_query .suggest .calls == [
146
152
pretend .call (
147
153
name = "name_suggestion" ,
148
154
term = {"field" : "name" },
@@ -151,22 +157,21 @@ def test_with_a_query(self, monkeypatch, page):
151
157
]
152
158
153
159
@pytest .mark .parametrize ("page" , [None , 1 , 5 ])
154
- def test_with_an_ordering (self , monkeypatch , page ):
155
- params = {"q" : "foo bar" , "o" : "-created" }
160
+ def test_with_an_ordering (self , monkeypatch , db_request , page ):
161
+ params = MultiDict ( {"q" : "foo bar" , "o" : "-created" })
156
162
if page is not None :
157
163
params ["page" ] = page
164
+ db_request .params = params
165
+
158
166
sort = pretend .stub ()
159
167
suggest = pretend .stub (
160
168
sort = pretend .call_recorder (lambda * a , ** kw : sort ),
161
169
)
162
- query = pretend .stub (
170
+ es_query = pretend .stub (
163
171
suggest = pretend .call_recorder (lambda * a , ** kw : suggest ),
164
172
)
165
- request = pretend .stub (
166
- es = pretend .stub (
167
- query = pretend .call_recorder (lambda * a , ** kw : query ),
168
- ),
169
- params = params ,
173
+ db_request .es = pretend .stub (
174
+ query = pretend .call_recorder (lambda * a , ** kw : es_query )
170
175
)
171
176
172
177
page_obj = pretend .stub (page_count = (page or 1 ) + 10 )
@@ -177,16 +182,18 @@ def test_with_an_ordering(self, monkeypatch, page):
177
182
url_maker_factory = pretend .call_recorder (lambda request : url_maker )
178
183
monkeypatch .setattr (views , "paginate_url_factory" , url_maker_factory )
179
184
180
- assert search (request ) == {
185
+ assert search (db_request ) == {
181
186
"page" : page_obj ,
182
- "term" : params .get ("q" ),
183
- "order" : params .get ("o" ),
187
+ "term" : params .get ("q" , '' ),
188
+ "order" : params .get ("o" , '' ),
189
+ "applied_filters" : [],
190
+ "available_filters" : [],
184
191
}
185
192
assert page_cls .calls == [
186
193
pretend .call (sort , url_maker = url_maker , page = page or 1 ),
187
194
]
188
- assert url_maker_factory .calls == [pretend .call (request )]
189
- assert request .es .query .calls == [
195
+ assert url_maker_factory .calls == [pretend .call (db_request )]
196
+ assert db_request .es .query .calls == [
190
197
pretend .call (
191
198
"multi_match" ,
192
199
query = "foo bar" ,
@@ -198,7 +205,7 @@ def test_with_an_ordering(self, monkeypatch, page):
198
205
],
199
206
),
200
207
]
201
- assert query .suggest .calls == [
208
+ assert es_query .suggest .calls == [
202
209
pretend .call (
203
210
name = "name_suggestion" ,
204
211
term = {"field" : "name" },
@@ -210,15 +217,28 @@ def test_with_an_ordering(self, monkeypatch, page):
210
217
]
211
218
212
219
@pytest .mark .parametrize ("page" , [None , 1 , 5 ])
213
- def test_without_a_query (self , monkeypatch , page ):
214
- params = {}
220
+ def test_with_classifiers (self , monkeypatch , db_request , page ):
221
+ params = MultiDict ([
222
+ ("q" , "foo bar" ),
223
+ ("c" , "foo :: bar" ),
224
+ ("c" , "fiz :: buz" ),
225
+ ])
215
226
if page is not None :
216
227
params ["page" ] = page
217
- query = pretend .stub ()
218
- request = pretend .stub (
219
- es = pretend .stub (query = lambda : query ),
220
- params = params ,
228
+ db_request .params = params
229
+
230
+ es_query = pretend .stub (
231
+ suggest = pretend .call_recorder (lambda * a , ** kw : es_query ),
232
+ filter = pretend .call_recorder (lambda * a , ** kw : es_query ),
233
+ sort = pretend .call_recorder (lambda * a , ** kw : es_query ),
221
234
)
235
+ db_request .es = pretend .stub (
236
+ query = pretend .call_recorder (lambda * a , ** kw : es_query )
237
+ )
238
+
239
+ classifier1 = ClassifierFactory .create (classifier = "foo :: bar" )
240
+ classifier2 = ClassifierFactory .create (classifier = "foo :: baz" )
241
+ classifier3 = ClassifierFactory .create (classifier = "fiz :: buz" )
222
242
223
243
page_obj = pretend .stub (page_count = (page or 1 ) + 10 )
224
244
page_cls = pretend .call_recorder (lambda * a , ** kw : page_obj )
@@ -228,23 +248,82 @@ def test_without_a_query(self, monkeypatch, page):
228
248
url_maker_factory = pretend .call_recorder (lambda request : url_maker )
229
249
monkeypatch .setattr (views , "paginate_url_factory" , url_maker_factory )
230
250
231
- assert search (request ) == {
251
+ assert search (db_request ) == {
232
252
"page" : page_obj ,
233
- "term" : params .get ("q" ),
234
- "order" : params .get ("o" ),
253
+ "term" : params .get ("q" , '' ),
254
+ "order" : params .get ("o" , '' ),
255
+ "applied_filters" : params .getall ("c" ),
256
+ "available_filters" : [
257
+ ('fiz' , [classifier3 .classifier ]),
258
+ ('foo' , [
259
+ classifier1 .classifier ,
260
+ classifier2 .classifier ,
261
+ ])
262
+ ],
235
263
}
236
264
assert page_cls .calls == [
237
- pretend .call (query , url_maker = url_maker , page = page or 1 ),
265
+ pretend .call (es_query , url_maker = url_maker , page = page or 1 ),
266
+ ]
267
+ assert url_maker_factory .calls == [pretend .call (db_request )]
268
+ assert db_request .es .query .calls == [
269
+ pretend .call (
270
+ "multi_match" ,
271
+ query = "foo bar" ,
272
+ fields = [
273
+ "name^2" , "version" , "author" , "author_email" ,
274
+ "maintainer" , "maintainer_email" , "home_page" , "license" ,
275
+ "summary" , "description" , "keywords" , "platform" ,
276
+ "download_url" ,
277
+ ],
278
+ ),
279
+ ]
280
+ assert es_query .suggest .calls == [
281
+ pretend .call (
282
+ name = "name_suggestion" ,
283
+ term = {"field" : "name" },
284
+ text = "foo bar" ,
285
+ ),
286
+ ]
287
+ assert es_query .filter .calls == [
288
+ pretend .call ('terms' , classifiers = ['foo :: bar' , 'fiz :: buz' ])
238
289
]
239
- assert url_maker_factory .calls == [pretend .call (request )]
240
290
241
- def test_raises_404_with_pagenum_too_high (self , monkeypatch ):
242
- params = {"page" : 15 }
243
- query = pretend .stub ()
244
- request = pretend .stub (
245
- es = pretend .stub (query = lambda : query ),
246
- params = params ,
247
- )
291
+ @pytest .mark .parametrize ("page" , [None , 1 , 5 ])
292
+ def test_without_a_query (self , monkeypatch , db_request , page ):
293
+ params = MultiDict ()
294
+ if page is not None :
295
+ params ["page" ] = page
296
+ db_request .params = params
297
+
298
+ es_query = pretend .stub ()
299
+ db_request .es = pretend .stub (query = lambda * a , ** kw : es_query )
300
+
301
+ page_obj = pretend .stub (page_count = (page or 1 ) + 10 )
302
+ page_cls = pretend .call_recorder (lambda * a , ** kw : page_obj )
303
+ monkeypatch .setattr (views , "ElasticsearchPage" , page_cls )
304
+
305
+ url_maker = pretend .stub ()
306
+ url_maker_factory = pretend .call_recorder (lambda request : url_maker )
307
+ monkeypatch .setattr (views , "paginate_url_factory" , url_maker_factory )
308
+
309
+ assert search (db_request ) == {
310
+ "page" : page_obj ,
311
+ "term" : params .get ("q" , '' ),
312
+ "order" : params .get ("o" , '' ),
313
+ "applied_filters" : [],
314
+ "available_filters" : [],
315
+ }
316
+ assert page_cls .calls == [
317
+ pretend .call (es_query , url_maker = url_maker , page = page or 1 ),
318
+ ]
319
+ assert url_maker_factory .calls == [pretend .call (db_request )]
320
+
321
+ def test_raises_404_with_pagenum_too_high (self , monkeypatch , db_request ):
322
+ params = MultiDict ({"page" : 15 })
323
+ db_request .params = params
324
+
325
+ es_query = pretend .stub ()
326
+ db_request .es = pretend .stub (query = lambda * a , ** kw : es_query )
248
327
249
328
page_obj = pretend .stub (page_count = 10 )
250
329
page_cls = pretend .call_recorder (lambda * a , ** kw : page_obj )
@@ -255,9 +334,9 @@ def test_raises_404_with_pagenum_too_high(self, monkeypatch):
255
334
monkeypatch .setattr (views , "paginate_url_factory" , url_maker_factory )
256
335
257
336
with pytest .raises (HTTPNotFound ):
258
- search (request )
337
+ search (db_request )
259
338
260
339
assert page_cls .calls == [
261
- pretend .call (query , url_maker = url_maker , page = 15 or 1 ),
340
+ pretend .call (es_query , url_maker = url_maker , page = 15 or 1 ),
262
341
]
263
- assert url_maker_factory .calls == [pretend .call (request )]
342
+ assert url_maker_factory .calls == [pretend .call (db_request )]
0 commit comments