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