Ejemplo n.º 1
0
 def check_followers_count(self, sort, column):
     # Checks that we show the correct type/number of followers.
     r = self.client.get(urlparams(self.url, sort=sort))
     items = pq(r.content)('.primary .item')
     for idx, c in enumerate(r.context['pager'].object_list):
         assert items.eq(idx).find('.followers').text().split()[0] == (
             numberfmt(getattr(c, column)))
Ejemplo n.º 2
0
 def test_name_sort(self):
     r = self.client.get(urlparams(self.url, sort='name'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'extra-opt'
     assert sel.text() == 'Name'
     a = r.context['addons'].object_list
     assert list(a) == sorted(a, key=lambda x: x.name)
Ejemplo n.º 3
0
    def test_results_popularity(self):
        personas = [
            ('Harry Potter', 2000),
            ('Japanese Koi Tattoo', 67),
            ('Japanese Tattoo', 250),
            ('Japanese Tattoo boop', 50),
            ('Japanese Tattoo ballin', 200),
            ('The Japanese Tattooed Girl', 242),
        ]
        for name, popularity in personas:
            self._addons.append(amo.tests.addon_factory(name=name,
                                                        type=amo.ADDON_PERSONA,
                                                        popularity=popularity))
        self.refresh()

        # Japanese Tattoo should be the #1 most relevant result. Obviously.
        expected_name, expected_popularity = personas[2]
        for sort in ('downloads', 'popularity', 'users'):
            r = self.client.get(urlparams(self.url, q='japanese tattoo',
                                          sort=sort), follow=True)
            assert r.status_code == 200
            results = list(r.context['pager'].object_list)
            first = results[0]
            assert six.text_type(first.name) == expected_name, (
                'Was not first result for %r. Results: %s' % (sort, results))
            assert first.persona.popularity == expected_popularity, (
                'Incorrect popularity for %r. Got %r. Expected %r.' % (
                    sort, first.persona.popularity, results))
            assert first.average_daily_users == expected_popularity, (
                'Incorrect users for %r. Got %r. Expected %r.' % (
                    sort, first.average_daily_users, results))
            assert first.weekly_downloads == expected_popularity, (
                'Incorrect weekly_downloads for %r. Got %r. Expected %r.' % (
                    sort, first.weekly_downloads, results))
Ejemplo n.º 4
0
 def test_updated_sort(self):
     r = self.client.get(urlparams(self.url, sort='updated'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'extra-opt'
     assert sel.text() == 'Recently Updated'
     a = r.context['addons'].object_list
     assert list(a) == sorted(a, key=lambda x: x.last_updated, reverse=True)
Ejemplo n.º 5
0
 def test_upandcoming_sort(self):
     r = self.client.get(urlparams(self.url, sort='hotness'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'extra-opt'
     assert sel.text() == 'Up & Coming'
     a = r.context['addons'].object_list
     assert list(a) == sorted(a, key=lambda x: x.hotness, reverse=True)
Ejemplo n.º 6
0
 def test_upandcoming_sort(self):
     r = self.client.get(urlparams(self.url, sort='hotness'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'extra-opt'
     assert sel.text() == 'Up & Coming'
     a = r.context['addons'].object_list
     assert list(a) == sorted(a, key=lambda x: x.hotness, reverse=True)
Ejemplo n.º 7
0
    def file_details(self, file):
        platform = file.platform
        if self.latest and not self.is_beta and (
                self.addon.status == file.status == amo.STATUS_PUBLIC):
            url = file.latest_xpi_url()
            download_url = file.latest_xpi_url(attachment=True)
        elif self.latest and self.is_beta and self.addon.show_beta:
            url = file.latest_xpi_url(beta=True)
            download_url = file.latest_xpi_url(beta=True, attachment=True)
        else:
            url = file.get_url_path(self.src)
            download_url = file.get_url_path(self.src, attachment=True)

        if platform == amo.PLATFORM_ALL.id:
            text, os = ugettext('Download Now'), None
        else:
            text, os = ugettext('Download'), amo.PLATFORMS[platform]

        if self.show_contrib:
            # L10n: please keep   in the string so → does not wrap.
            text = jinja2.Markup(ugettext('Continue to Download →'))
            roadblock = reverse('addons.roadblock', args=[self.addon.id])
            url = urlparams(roadblock, version=self.version.version)

        return text, url, download_url, os
Ejemplo n.º 8
0
 def test_updated_sort(self):
     r = self.client.get(urlparams(self.url, sort='updated'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'extra-opt'
     assert sel.text() == 'Recently Updated'
     a = r.context['addons'].object_list
     assert list(a) == sorted(a, key=lambda x: x.last_updated, reverse=True)
Ejemplo n.º 9
0
    def test_results_popularity(self):
        personas = [
            ('Harry Potter', 2000),
            ('Japanese Koi Tattoo', 67),
            ('Japanese Tattoo', 250),
            ('Japanese Tattoo boop', 50),
            ('Japanese Tattoo ballin', 200),
            ('The Japanese Tattooed Girl', 242),
        ]
        for name, popularity in personas:
            self._addons.append(amo.tests.addon_factory(name=name,
                                                        type=amo.ADDON_PERSONA,
                                                        popularity=popularity))
        self.refresh()

        # Japanese Tattoo should be the #1 most relevant result. Obviously.
        expected_name, expected_popularity = personas[2]
        for sort in ('downloads', 'popularity', 'users'):
            r = self.client.get(urlparams(self.url, q='japanese tattoo',
                                          sort=sort), follow=True)
            assert r.status_code == 200
            results = list(r.context['pager'].object_list)
            first = results[0]
            assert unicode(first.name) == expected_name, (
                'Was not first result for %r. Results: %s' % (sort, results))
            assert first.persona.popularity == expected_popularity, (
                'Incorrect popularity for %r. Got %r. Expected %r.' % (
                    sort, first.persona.popularity, results))
            assert first.average_daily_users == expected_popularity, (
                'Incorrect users for %r. Got %r. Expected %r.' % (
                    sort, first.average_daily_users, results))
            assert first.weekly_downloads == expected_popularity, (
                'Incorrect weekly_downloads for %r. Got %r. Expected %r.' % (
                    sort, first.weekly_downloads, results))
Ejemplo n.º 10
0
 def test_updated_timestamp(self):
     self._generate()
     r = self.client.get(urlparams(self.url, sort='updated'))
     items = pq(r.content)('.primary .item')
     for idx, c in enumerate(r.context['pager'].object_list):
         assert trim_whitespace(items.eq(idx).find('.modified').text()) == (
             'Updated %s' % trim_whitespace(datetime_filter(c.modified)))
Ejemplo n.º 11
0
 def test_name_sort(self):
     r = self.client.get(urlparams(self.url, sort='name'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'extra-opt'
     assert sel.text() == 'Name'
     a = r.context['addons'].object_list
     assert list(a) == sorted(a, key=lambda x: x.name)
Ejemplo n.º 12
0
 def setUp(self):
     super(TestFeaturedLocale, self).setUp()
     self.addon = Addon.objects.get(pk=3615)
     self.persona = Addon.objects.get(pk=15679)
     self.extension = Addon.objects.get(pk=2464)
     self.category = Category.objects.get(slug='bookmarks')
     self.url = urlparams(reverse('browse.extensions', args=['bookmarks']),
                          {}, sort='featured')
Ejemplo n.º 13
0
    def check_cat_filters(self, params=None, selected='All Add-ons'):
        if not params:
            params = {}

        r = self.client.get(urlparams(self.url, **params))
        assert sorted(a.id for a in self.addons) == (
            sorted(a.id for a in r.context['pager'].object_list))

        cat = self.addons[0].all_categories[0]
        links = pq(r.content)('#category-facets li a')
        expected = [
            ('All Add-ons', self.url),
            ('Extensions', urlparams(self.url, atype=amo.ADDON_EXTENSION)),
            (unicode(cat.name), urlparams(self.url, atype=amo.ADDON_EXTENSION,
                                          cat=cat.id)),
        ]
        amo.tests.check_links(expected, links, selected, verify=False)
Ejemplo n.º 14
0
 def test_users_adu_unit(self):
     doc = pq(self.client.get(urlparams(self.url, sort='users')).content)
     for item in doc('.items .item'):
         item = pq(item)
         addon_id = item('.install').attr('data-addon')
         adu = Addon.objects.get(id=addon_id).average_daily_users
         assert item('.adu').text() == (
             '%s user%s' % (numberfmt(adu), 's' if adu != 1 else ''))
Ejemplo n.º 15
0
 def test_updated_date(self):
     doc = pq(self.client.get(urlparams(self.url, sort='updated')).content)
     for item in doc('.items .item'):
         item = pq(item)
         addon_id = item('.install').attr('data-addon')
         ts = Addon.objects.get(id=addon_id).last_updated
         assert item('.updated').text() == (
             u'Updated %s' % translation.trim_whitespace(format_date(ts)))
Ejemplo n.º 16
0
 def test_weeklydownloads_sort(self):
     r = self.client.get(urlparams(self.url, sort='popular'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'extra-opt'
     assert sel.text() == 'Weekly Downloads'
     a = r.context['addons'].object_list
     assert list(a) == sorted(
         a, key=lambda x: x.weekly_downloads, reverse=True)
Ejemplo n.º 17
0
 def test_updated_date(self):
     doc = pq(self.client.get(urlparams(self.url, sort='updated')).content)
     for item in doc('.items .item'):
         item = pq(item)
         addon_id = item('.install').attr('data-addon')
         ts = Addon.objects.get(id=addon_id).last_updated
         assert item('.updated').text() == (
             u'Updated %s' % trim_whitespace(format_date(ts)))
Ejemplo n.º 18
0
 def test_weeklydownloads_sort(self):
     r = self.client.get(urlparams(self.url, sort='popular'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'extra-opt'
     assert sel.text() == 'Weekly Downloads'
     a = r.context['addons'].object_list
     assert list(a) == sorted(
         a, key=lambda x: x.weekly_downloads, reverse=True)
Ejemplo n.º 19
0
 def test_toprated_sort(self):
     r = self.client.get(urlparams(self.url, sort='rating'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'opt'
     assert sel.text() == 'Top Rated'
     a = r.context['addons'].object_list
     assert list(a) == sorted(
         a, key=lambda x: x.bayesian_rating, reverse=True)
Ejemplo n.º 20
0
 def test_mostusers_sort(self):
     r = self.client.get(urlparams(self.url, sort='users'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'opt'
     assert sel.text() == 'Most Users'
     a = r.context['addons'].object_list
     assert list(a) == (
         sorted(a, key=lambda x: x.average_daily_users, reverse=True))
Ejemplo n.º 21
0
 def test_users_adu_unit(self):
     doc = pq(self.client.get(urlparams(self.url, sort='users')).content)
     for item in doc('.items .item'):
         item = pq(item)
         addon_id = item('.install').attr('data-addon')
         adu = Addon.objects.get(id=addon_id).average_daily_users
         assert item('.adu').text() == (
             '%s user%s' % (numberfmt(adu), 's' if adu != 1 else ''))
Ejemplo n.º 22
0
 def test_mostusers_sort(self):
     r = self.client.get(urlparams(self.url, sort='users'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'opt'
     assert sel.text() == 'Most Users'
     a = r.context['addons'].object_list
     assert list(a) == (
         sorted(a, key=lambda x: x.average_daily_users, reverse=True))
Ejemplo n.º 23
0
 def _make_download_url(self, view_name, src, attachment=False):
     kwargs = {
         'file_id': self.pk
     }
     if attachment:
         kwargs['type'] = 'attachment'
     url = os.path.join(reverse(view_name, kwargs=kwargs), self.filename)
     return absolutify(urlparams(url, src=src))
Ejemplo n.º 24
0
 def test_added_date(self):
     doc = pq(self.client.get(urlparams(self.url, sort='created')).content)
     for item in doc('.items .item'):
         item = pq(item)
         addon_id = item('.install').attr('data-addon')
         ts = Addon.objects.get(id=addon_id).created
         assert item('.updated').text() == (
             u'Added %s' % trim_whitespace(datetime_filter(ts)))
Ejemplo n.º 25
0
 def test_toprated_sort(self):
     r = self.client.get(urlparams(self.url, sort='rating'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'opt'
     assert sel.text() == 'Top Rated'
     a = r.context['addons'].object_list
     assert list(a) == sorted(
         a, key=lambda x: x.bayesian_rating, reverse=True)
Ejemplo n.º 26
0
    def check_cat_filters(self, params=None, selected='All Add-ons'):
        if not params:
            params = {}

        r = self.client.get(urlparams(self.url, **params))
        assert sorted(a.id for a in self.addons) == (sorted(
            a.id for a in r.context['pager'].object_list))

        cat = self.addons[0].all_categories[0]
        links = pq(r.content)('#category-facets li a')
        expected = [
            ('All Add-ons', self.url),
            ('Extensions', urlparams(self.url, atype=amo.ADDON_EXTENSION)),
            (unicode(cat.name),
             urlparams(self.url, atype=amo.ADDON_EXTENSION, cat=cat.id)),
        ]
        amo.tests.check_links(expected, links, selected, verify=False)
Ejemplo n.º 27
0
 def _make_download_url(self, view_name, src, attachment=False):
     kwargs = {
         'file_id': self.pk
     }
     if attachment:
         kwargs['type'] = 'attachment'
     url = os.path.join(reverse(view_name, kwargs=kwargs), self.filename)
     return absolutify(urlparams(url, src=src))
Ejemplo n.º 28
0
 def setUp(self):
     super(TestFeaturedLocale, self).setUp()
     self.addon = Addon.objects.get(pk=3615)
     self.persona = Addon.objects.get(pk=15679)
     self.extension = Addon.objects.get(pk=2464)
     self.category = Category.objects.get(slug='bookmarks')
     self.url = urlparams(reverse('browse.extensions', args=['bookmarks']),
                          {},
                          sort='featured')
Ejemplo n.º 29
0
    def test_unreviewed(self):
        pop = urlparams(self.url, sort='popular')

        # Only 3 without unreviewed.
        response = self.client.get(pop)
        assert len(response.context['addons'].object_list) == 2

        response = self.client.get(pop)
        assert len(response.context['addons'].object_list) == 2
Ejemplo n.º 30
0
 def test_popular_adu_unit(self):
     doc = pq(self.client.get(urlparams(self.url, sort='popular')).content)
     for item in doc('.items .item'):
         item = pq(item)
         addon_id = item('.install').attr('data-addon')
         adu = Addon.objects.get(id=addon_id).weekly_downloads
         assert item('.adu').text() == (
             '%s weekly download%s' %
             (numberfmt(adu), 's' if adu != 1 else ''))
Ejemplo n.º 31
0
 def test_popular_adu_unit(self):
     doc = pq(self.client.get(urlparams(self.url, sort='popular')).content)
     for item in doc('.items .item'):
         item = pq(item)
         addon_id = item('.install').attr('data-addon')
         adu = Addon.objects.get(id=addon_id).weekly_downloads
         assert item('.adu').text() == (
             '%s weekly download%s' % (numberfmt(adu),
                                       's' if adu != 1 else ''))
Ejemplo n.º 32
0
    def test_unreviewed(self):
        pop = urlparams(self.url, sort='popular')

        # Only 3 without unreviewed.
        response = self.client.get(pop)
        assert len(response.context['addons'].object_list) == 2

        response = self.client.get(pop)
        assert len(response.context['addons'].object_list) == 2
Ejemplo n.º 33
0
    def test_results_popularity(self):
        collections = [
            ('Traveler Pack', 2000),
        ]
        webdev_collections = [
            ('Tools for Developer', 67),
            ('Web Developer', 250),
            ('Web Developer Necessities', 50),
            ('Web Pro', 200),
            ('Web Developer Pack', 242),
        ]
        sorted_webdev_collections = sorted(webdev_collections,
                                           key=lambda x: x[1],
                                           reverse=True)

        # Create collections, in "random" order, with an additional collection
        # that isn't relevant to our query.
        for name, subscribers in (collections + webdev_collections):
            self.all_collections.append(
                amo.tests.collection_factory(name=name,
                                             subscribers=subscribers,
                                             weekly_subscribers=subscribers))
        self.refresh()

        # No sort = sort by weekly subscribers, 'all' = sort by subscribers.
        for sort in ('', 'all'):
            if sort:
                r = self.client.get(urlparams(self.url,
                                              q='web developer',
                                              sort=sort),
                                    follow=True)
            else:
                r = self.client.get(urlparams(self.url, q='web developer'),
                                    follow=True)
            assert r.status_code == 200
            results = list(r.context['pager'].object_list)
            assert len(results) == len(webdev_collections)
            for coll, expected in zip(results, sorted_webdev_collections):
                assert unicode(
                    coll.name) == expected[0], ('Wrong order for sort %r.' %
                                                sort)
                assert coll.subscribers == expected[1], (
                    'Incorrect subscribers for sort %r.' % sort)
Ejemplo n.º 34
0
    def test_cat_facet_stale(self):
        AddonCategory.objects.all().delete()

        r = self.client.get(self.url)
        expected = [
            ('All Add-ons', self.url),
            ('Extensions', urlparams(self.url, atype=amo.ADDON_EXTENSION)),
        ]
        amo.tests.check_links(expected, pq(r.content)('#category-facets li a'),
                              verify=False)
Ejemplo n.º 35
0
    def test_cat_facet_stale(self):
        AddonCategory.objects.all().delete()

        r = self.client.get(self.url)
        expected = [
            ('All Add-ons', self.url),
            ('Extensions', urlparams(self.url, atype=amo.ADDON_EXTENSION)),
        ]
        amo.tests.check_links(expected, pq(r.content)('#category-facets li a'),
                              verify=False)
Ejemplo n.º 36
0
 def build_list(self):
     """Populate a list of dictionaries based on label => property."""
     results = []
     for item in self.queryset()[:self.limit]:
         if item.id in self.excluded_ids:
             continue
         d = self._build_fields(item, self.fields)
         if self.src and 'url' in d:
             d['url'] = urlparams(d['url'], src=self.src)
         results.append(d)
     return results
Ejemplo n.º 37
0
 def build_list(self):
     """Populate a list of dictionaries based on label => property."""
     results = []
     for item in self.queryset()[:self.limit]:
         if item.id in self.excluded_ids:
             continue
         d = self._build_fields(item, self.fields)
         if self.src and 'url' in d:
             d['url'] = urlparams(d['url'], src=self.src)
         results.append(d)
     return results
Ejemplo n.º 38
0
    def test_redirect(self):
        self.client.login(email='*****@*****.**')
        self.client.get('/', follow=True)
        url = '/en-US/about'
        r = self.client.get(urlparams(reverse('users.logout'), to=url),
                            follow=True)
        self.assert3xx(r, url, status_code=302)

        url = urlparams(reverse('users.logout'), to='/addon/new',
                        domain='builder')
        r = self.client.get(url, follow=True)
        to, code = r.redirect_chain[0]
        assert to == 'https://builder.addons.mozilla.org/addon/new'
        assert code == 302

        # Test an invalid domain
        url = urlparams(reverse('users.logout'), to='/en-US/about',
                        domain='http://evil.com')
        r = self.client.get(url, follow=True)
        self.assert3xx(r, '/en-US/about', status_code=302)
Ejemplo n.º 39
0
    def test_redirect(self):
        self.client.login(email='*****@*****.**')
        self.client.get('/', follow=True)
        url = '/en-US/about'
        response = self.client.get(urlparams(reverse('users.logout'), to=url),
                                   follow=True)
        self.assert3xx(response, url, status_code=302)

        url = urlparams(reverse('users.logout'), to='/addon/new',
                        domain='builder')
        response = self.client.get(url, follow=False)
        self.assert3xx(
            response, 'https://builder.addons.mozilla.org/addon/new',
            status_code=302)

        # Test an invalid domain
        url = urlparams(reverse('users.logout'), to='/en-US/about',
                        domain='http://evil.com')
        response = self.client.get(url, follow=False)
        self.assert3xx(response, '/en-US/about', status_code=302)
Ejemplo n.º 40
0
 def check_sort_links(self, key, title=None, sort_by=None, reverse=True,
                      params=None):
     if params is None:
         params = {}
     response = self.client.get(urlparams(self.url, sort=key, **params))
     assert response.status_code == 200
     doc = pq(response.content)
     if title:
         assert doc('#sorter .selected').text() == title
     if sort_by:
         results = response.context['pager'].object_list
         if sort_by == 'name':
             expected = sorted(results, key=lambda x: six.text_type(x.name))
         else:
             expected = sorted(results, key=lambda x: getattr(x, sort_by),
                               reverse=reverse)
         assert list(results) == expected
Ejemplo n.º 41
0
 def check_sort_links(self, key, title=None, sort_by=None, reverse=True,
                      params=None):
     if params is None:
         params = {}
     response = self.client.get(urlparams(self.url, sort=key, **params))
     assert response.status_code == 200
     doc = pq(response.content)
     if title:
         assert doc('#sorter .selected').text() == title
     if sort_by:
         results = response.context['pager'].object_list
         if sort_by == 'name':
             expected = sorted(results, key=lambda x: unicode(x.name))
         else:
             expected = sorted(results, key=lambda x: getattr(x, sort_by),
                               reverse=reverse)
         assert list(results) == expected
Ejemplo n.º 42
0
    def test_tag_filters_on_search_page(self):
        Tag(tag_text='sky').save_tag(self.addons[0])
        Tag(tag_text='sky').save_tag(self.addons[1])
        Tag(tag_text='sky').save_tag(self.addons[2])
        Tag(tag_text='earth').save_tag(self.addons[0])
        Tag(tag_text='earth').save_tag(self.addons[1])
        Tag(tag_text='ocean').save_tag(self.addons[0])
        self.reindex(Addon)

        response = self.client.get(self.url, {'tag': 'sky'})
        assert response.status_code == 200
        assert self.get_results(response)

        # Tags filter UI should show 4 items ("All Tags" + 3 different tags)
        tags_links = pq(response.content)('#tag-facets li a[data-params]')
        assert len(tags_links) == 4

        # First link should be "All Tags".
        assert tags_links[0].attrib['href'] == self.url
        assert json.loads(tags_links[0].attrib['data-params']) == {
            'tag': None,
            'page': None
        }

        # Then we should have the tags.
        expected_tags = ('sky', 'earth', 'ocean')
        for index, link in enumerate(tags_links[1:]):
            tag_text = expected_tags[index]
            assert link.attrib['href'] == urlparams(self.url, tag=tag_text)
            assert json.loads(link.attrib['data-params']) == {
                'tag': tag_text,
                'page': None
            }

        # Selected tag should be the one we passed in the URL: 'sky'.
        link = pq(response.content)('#tag-facets li.selected a[data-params]')
        assert json.loads(link.attr('data-params')) == {
            'tag': 'sky',
            'page': None
        }
Ejemplo n.º 43
0
    def test_tag_filters_on_search_page(self):
        Tag(tag_text='sky').save_tag(self.addons[0])
        Tag(tag_text='sky').save_tag(self.addons[1])
        Tag(tag_text='sky').save_tag(self.addons[2])
        Tag(tag_text='earth').save_tag(self.addons[0])
        Tag(tag_text='earth').save_tag(self.addons[1])
        Tag(tag_text='ocean').save_tag(self.addons[0])
        self.reindex(Addon)

        response = self.client.get(self.url, {'tag': 'sky'})
        assert response.status_code == 200
        assert self.get_results(response)

        # Tags filter UI should show 4 items ("All Tags" + 3 different tags)
        tags_links = pq(response.content)('#tag-facets li a[data-params]')
        assert len(tags_links) == 4

        # First link should be "All Tags".
        assert tags_links[0].attrib['href'] == self.url
        assert json.loads(tags_links[0].attrib['data-params']) == {
            'tag': None, 'page': None
        }

        # Then we should have the tags.
        expected_tags = ('sky', 'earth', 'ocean')
        for index, link in enumerate(tags_links[1:]):
            tag_text = expected_tags[index]
            assert link.attrib['href'] == urlparams(self.url, tag=tag_text)
            assert json.loads(link.attrib['data-params']) == {
                'tag': tag_text, 'page': None
            }

        # Selected tag should be the one we passed in the URL: 'sky'.
        link = pq(response.content)('#tag-facets li.selected a[data-params]')
        assert json.loads(link.attr('data-params')) == {
            'tag': 'sky', 'page': None
        }
Ejemplo n.º 44
0
def search(request, tag_name=None):
    APP = request.APP
    types = (amo.ADDON_EXTENSION, amo.ADDON_THEME, amo.ADDON_DICT,
             amo.ADDON_SEARCH, amo.ADDON_LPAPP)

    category = request.GET.get('cat')

    if category == 'collections':
        extra_params = {'sort': {'newest': 'created'}}
    else:
        extra_params = None

    fixed = fix_search_query(request.GET, extra_params=extra_params)
    if fixed is not request.GET:
        # We generally want a 301, except if it's a "type", because that's only
        # here to support the new frontend, so a permanent redirect could mess
        # things up when the user is going back and forth between the old and
        # new frontend. https://github.com/mozilla/addons-server/issues/6846
        status = 302 if 'type' in request.GET else 301
        return http.HttpResponseRedirect(
            urlparams(request.path, **fixed), status=status)

    facets = request.GET.copy()

    # In order to differentiate between "all versions" and an undefined value,
    # we use "any" instead of "" in the frontend.
    if 'appver' in facets and facets['appver'] == 'any':
        facets['appver'] = ''

    form = ESSearchForm(facets or {})
    form.is_valid()  # Let the form try to clean data.

    form_data = form.cleaned_data
    if tag_name:
        form_data['tag'] = tag_name

    if category == 'collections':
        return _collections(request)
    elif category == 'themes' or form_data.get('atype') == amo.ADDON_PERSONA:
        return _personas(request)

    sort, extra_sort = split_choices(form.sort_choices, 'created')
    if form_data.get('atype') == amo.ADDON_SEARCH:
        # Search add-ons should not be searched by ADU, so replace 'Users'
        # sort with 'Weekly Downloads'.
        sort, extra_sort = list(sort), list(extra_sort)
        sort[1] = extra_sort[1]
        del extra_sort[1]

    # Perform search, using aggregation so that we can build the facets UI.
    # Note that we don't need to aggregate on platforms, that facet it built
    # from our constants directly, using the current application for this
    # request (request.APP).
    appversion_field = 'current_version.compatible_apps.%s.max' % APP.id
    qs = (Addon.search_public().filter(app=APP.id)
          .aggregate(tags={'terms': {'field': 'tags'}},
                     appversions={'terms': {'field': appversion_field}},
                     categories={'terms': {'field': 'category', 'size': 200}})
          )

    filters = ['atype', 'appver', 'cat', 'sort', 'tag', 'platform']
    mapping = {'users': '-average_daily_users',
               'rating': '-bayesian_rating',
               'created': '-created',
               'name': 'name.raw',
               'downloads': '-weekly_downloads',
               'updated': '-last_updated',
               'hotness': '-hotness'}
    qs = _filter_search(request, qs, form_data, filters, mapping, types=types)

    pager = amo.utils.paginate(request, qs)

    ctx = {
        'is_pjax': request.META.get('HTTP_X_PJAX'),
        'pager': pager,
        'query': form_data,
        'form': form,
        'sort_opts': sort,
        'extra_sort_opts': extra_sort,
        'sorting': sort_sidebar(request, form_data, form),
        'sort': form_data.get('sort'),
    }
    if not ctx['is_pjax']:
        aggregations = pager.object_list.aggregations
        ctx.update({
            'tag': tag_name,
            'categories': category_sidebar(request, form_data, aggregations),
            'platforms': platform_sidebar(request, form_data),
            'versions': version_sidebar(request, form_data, aggregations),
            'tags': tag_sidebar(request, form_data, aggregations),
        })
    return render(request, 'search/results.html', ctx)
Ejemplo n.º 45
0
 def test_featured_sort(self):
     r = self.client.get(urlparams(self.url, sort='featured'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'opt'
     assert sel.text() == 'Featured'
Ejemplo n.º 46
0
 def check_name_results(self, params, expected):
     r = self.client.get(urlparams(self.url, **params), follow=True)
     assert r.status_code == 200
     got = self.get_results(r)
     assert got == expected, params
Ejemplo n.º 47
0
def migrate_path(next_path=None):
    return urlparams(reverse('users.migrate'), to=next_path)
Ejemplo n.º 48
0
def migrate_path(next_path=None):
    return urlparams(reverse('users.migrate'), to=next_path)
Ejemplo n.º 49
0
 def fix_link(self, url):
     if self.src:
         url = urlparams(url, src=self.src)
     if self.collection:
         url = urlparams(url, collection_id=self.collection)
     return url
Ejemplo n.º 50
0
 def check_name_results(self, params, expected):
     r = self.client.get(urlparams(self.url, **params), follow=True)
     assert r.status_code == 200
     got = self.get_results(r)
     assert got == expected, params
Ejemplo n.º 51
0
 def setUp(self):
     super(TestPersonaSearch, self).setUp()
     self.url = urlparams(reverse('search.search'), atype=amo.ADDON_PERSONA)
Ejemplo n.º 52
0
 def _get_download_url(self, file_):
     url = drf_reverse(
         'signing.file', request=self._context.get('request'),
         kwargs={'file_id': file_.id})
     url = os.path.join(url, file_.filename)
     return absolutify(urlparams(url, src='api'))
Ejemplo n.º 53
0
 def setUp(self):
     super(TestPersonaSearch, self).setUp()
     self.url = urlparams(reverse('search.search'), atype=amo.ADDON_PERSONA)
Ejemplo n.º 54
0
 def test_unknown_tag_filter(self):
     r = self.client.get(urlparams(self.url, tag='xxx'))
     a = pq(r.content)('#tag-facets li.selected a')
     assert a.length == 1
     assert a.text() == 'xxx'
     assert list(r.context['pager'].object_list) == []
Ejemplo n.º 55
0
 def test_search_space(self):
     response = self.client.get(urlparams(self.url, q='+'))
     assert response.status_code == 200
Ejemplo n.º 56
0
 def test_unknown_tag_filter(self):
     r = self.client.get(urlparams(self.url, tag='xxx'))
     a = pq(r.content)('#tag-facets li.selected a')
     assert a.length == 1
     assert a.text() == 'xxx'
     assert list(r.context['pager'].object_list) == []
Ejemplo n.º 57
0
 def test_search_space(self):
     response = self.client.get(urlparams(self.url, q='+'))
     assert response.status_code == 200
Ejemplo n.º 58
0
 def test_featured_sort(self):
     r = self.client.get(urlparams(self.url, sort='featured'))
     sel = pq(r.content)('#sorter ul > li.selected')
     assert sel.find('a').attr('class') == 'opt'
     assert sel.text() == 'Featured'
Ejemplo n.º 59
0
 def fix_link(self, url):
     if self.src:
         url = urlparams(url, src=self.src)
     if self.collection:
         url = urlparams(url, collection_id=self.collection)
     return url