22
33from django .conf import settings
44
5+ import mock
56from nose import SkipTest
67from nose .tools import eq_ , nottest
78from pyquery import PyQuery as pq
1314from amo .urlresolvers import reverse
1415from amo .utils import urlparams
1516from search .tests .test_views import TestAjaxSearch
17+ from stats .models import ClientData
18+ from users .models import UserProfile
1619
1720import mkt
1821from mkt .search .forms import DEVICE_CHOICES_IDS
1922from mkt .webapps .tests .test_views import PaidAppMixin
20- from mkt .webapps .models import AddonExcludedRegion as AER , Webapp
23+ from mkt .webapps .models import AddonExcludedRegion as AER , Installed , Webapp
2124
2225
2326class SearchBase (amo .tests .ESTestCase ):
@@ -50,6 +53,7 @@ def check_results(self, params, expected):
5053 got = self .get_results (r )
5154 eq_ (got , expected ,
5255 'Got: %s. Expected: %s. Parameters: %s' % (got , expected , params ))
56+ return r
5357
5458
5559class TestWebappSearch (PaidAppMixin , SearchBase ):
@@ -239,7 +243,7 @@ def test_device_tablet(self):
239243
240244 def test_results_sort_default (self ):
241245 self ._generate (3 )
242- self .check_sort_links (None , 'Relevance' , 'weekly_downloads ' )
246+ self .check_sort_links (None , 'Relevance' , 'popularity ' )
243247
244248 def test_results_sort_unknown (self ):
245249 self ._generate (3 )
@@ -267,7 +271,7 @@ def test_price_sort_visible_for_paid_search(self):
267271 def test_price_sort_visible_for_paid_browse (self ):
268272 # 'Sort by Price' option should be removed if filtering by free apps.
269273 r = self .client .get (reverse ('browse.apps' ),
270- {'price' : 'free' , 'sort' : 'downloads ' })
274+ {'price' : 'free' , 'sort' : 'popularity ' })
271275 eq_ (r .status_code , 200 )
272276 assert 'price' not in dict (r .context ['sort_opts' ]), (
273277 'Unexpected price sort' )
@@ -289,7 +293,7 @@ def test_redirect_free_price_sort(self):
289293 # `sort=price` should be changed to `sort=downloads` if
290294 # `price=free` is in querystring.
291295 r = self .client .get (url , {'price' : 'free' , 'sort' : 'price' })
292- self .assert3xx (r , urlparams (url , price = 'free' , sort = 'downloads ' ),
296+ self .assert3xx (r , urlparams (url , price = 'free' , sort = 'popularity ' ),
293297 302 )
294298
295299 def test_region_exclusions (self ):
@@ -300,6 +304,81 @@ def test_region_exclusions(self):
300304 self .check_results ({'q' : 'Steam' , 'region' : region },
301305 [] if region == 'br' else [self .webapp .id ])
302306
307+ @mock .patch .object (mkt .regions .BR , 'adolescent' , True )
308+ def test_adolescent_popularity (self ):
309+ self .skip_if_disabled (settings .REGION_STORES )
310+
311+ # Adolescent regions use global popularity.
312+
313+ # Webapp: Global: 0, Regional: 0
314+ # Unknown1: Global: 1, Regional: 1 + 10 * 1 = 11
315+ # Unknown2: Global: 2, Regional: 0
316+
317+ user = UserProfile .objects .all ()[0 ]
318+ cd = ClientData .objects .create (region = mkt .regions .BR .id )
319+
320+ unknown1 = amo .tests .app_factory ()
321+ Installed .objects .create (addon = unknown1 , user = user , client_data = cd )
322+
323+ unknown2 = amo .tests .app_factory ()
324+ Installed .objects .create (addon = unknown2 , user = user )
325+ Installed .objects .create (addon = unknown2 , user = user )
326+
327+ self .reindex (Webapp )
328+
329+ r = self .check_results ({'sort' : 'popularity' ,
330+ 'region' : mkt .regions .BR .slug },
331+ [unknown2 .id , unknown1 .id , self .webapp .id ])
332+
333+ # Check the actual popularity scores.
334+ by_popularity = list (r .context ['pager' ].object_list
335+ .values_dict ('popularity' ))
336+ eq_ (by_popularity ,
337+ [{'id' : unknown2 .id , 'popularity' : 2 },
338+ {'id' : unknown1 .id , 'popularity' : 1 },
339+ {'id' : self .webapp .id , 'popularity' : 0 }])
340+
341+ @mock .patch .object (mkt .regions .BR , 'adolescent' , False )
342+ def test_mature_popularity (self ):
343+ self .skip_if_disabled (settings .REGION_STORES )
344+
345+ # Mature regions use regional popularity.
346+
347+ # Webapp: Global: 1, Regional: 1 * 2 + 10 * 1 = 12
348+ # Unknown1: Global: 1, Regional: 1 * 2 + 10 * 2 = 22
349+ # Unknown2: Global: 2, Regional: 2
350+
351+ region = mkt .regions .BR
352+
353+ user = UserProfile .objects .all ()[0 ]
354+ cd = ClientData .objects .create (region = region .id )
355+
356+ Installed .objects .get_or_create (addon = self .webapp , user = user )
357+ Installed .objects .create (addon = self .webapp , user = user , client_data = cd )
358+
359+ unknown1 = amo .tests .app_factory ()
360+ Installed .objects .create (addon = unknown1 , user = user , client_data = cd )
361+ Installed .objects .create (addon = unknown1 ,
362+ user = UserProfile .objects .create (), client_data = cd )
363+
364+ unknown2 = amo .tests .app_factory ()
365+ Installed .objects .create (addon = unknown2 , user = user )
366+ Installed .objects .create (addon = unknown2 , user = user )
367+
368+ self .reindex (Webapp )
369+
370+ r = self .check_results ({'sort' : 'popularity' ,
371+ 'region' : region .slug },
372+ [unknown1 .id , self .webapp .id , unknown2 .id ])
373+
374+ # Check the actual popularity scores.
375+ by_popularity = list (r .context ['pager' ].object_list
376+ .values_dict ('popularity_%s' % region .id ))
377+ eq_ (by_popularity ,
378+ [{'id' : unknown1 .id , 'popularity_7' : 22 },
379+ {'id' : self .webapp .id , 'popularity_7' : 12 },
380+ {'id' : unknown2 .id , 'popularity_7' : 2 }])
381+
303382
304383class TestSuggestions (TestAjaxSearch ):
305384
0 commit comments