Ejemplo n.º 1
0
 def test_post_addon_restricted(self):
     Addon.objects.all().get().delete()
     assert Addon.objects.count() == 0
     EmailUserRestriction.objects.create(email_pattern=self.user.email)
     response = self.request(
         'POST',
         url=reverse_ns('signing.version'),
         addon='@create-webextension',
         version='1.0')
     assert response.status_code == 403
     assert json.loads(response.content.decode('utf-8')) == {
         'detail': 'The email address you used for your developer account '
                   'is not allowed for add-on submission.'
     }
     EmailUserRestriction.objects.all().delete()
     IPNetworkUserRestriction.objects.create(network='127.0.0.1/32')
     response = self.request(
         'POST',
         url=reverse_ns('signing.version'),
         addon='@create-webextension',
         version='1.0')
     assert response.status_code == 403
     assert json.loads(response.content.decode('utf-8')) == {
         'detail': 'Multiple add-ons violating our policies have been '
                   'submitted from your location. The IP address has been '
                   'blocked.'
     }
     assert Addon.objects.count() == 0
Ejemplo n.º 2
0
 def test_404(self):
     # Invalid user.
     response = self.client.get(reverse_ns(
         'collection-detail', kwargs={
             'user_pk': self.user.pk + 66, 'slug': self.collection.slug}))
     assert response.status_code == 404
     # Invalid collection.
     response = self.client.get(reverse_ns(
         'collection-detail', kwargs={
             'user_pk': self.user.pk, 'slug': 'hello'}))
     assert response.status_code == 404
Ejemplo n.º 3
0
 def test_no_id_lookup(self):
     collection = collection_factory(author=self.user, slug='999')
     id_url = reverse_ns(
         'collection-detail', kwargs={
             'user_pk': self.user.pk, 'slug': collection.id})
     response = self.client.get(id_url)
     assert response.status_code == 404
     slug_url = reverse_ns(
         'collection-detail', kwargs={
             'user_pk': self.user.pk, 'slug': collection.slug})
     response = self.client.get(slug_url)
     assert response.status_code == 200
     assert response.data['id'] == collection.id
Ejemplo n.º 4
0
    def _check_scenario(self, query, expected, no_match=None):
        # Make sure things are properly flushed and searchable
        url = reverse_ns('addon-search')

        response = self.client.get(url, {'q': query})
        assert response.status_code == 200

        results = json.loads(response.content)['results']

        # We only check for greater or equal since we usually don't care
        # about what else ElasticSearch finds magically for any query.
        # We're mostly concerned about the first few results to check
        # our general ranking. In real-world the rest that follows matches
        # the general scoring idea.
        assert len(results) >= len(expected), (
            'Expected {} results but {} found for query "{}": {}'.format(
                len(expected), len(results), query,
                [x['name']['en-US'] for x in results]
            )
        )

        for idx, name in enumerate(expected):
            assert results[idx]['name']['en-US'] == name, (
                'Expected "{}" to be on position {} but "{}" is for query {}'
                .format(name, idx, results[idx]['name']['en-US'], query)
            )

        if no_match is not None:
            for name in no_match:
                names = [item['name']['en-US'] for item in results]
                assert name not in names, (
                    'Expected "{}" not to exist in results for query {}'
                    .format(name, query)
                )
Ejemplo n.º 5
0
 def test_with_slug(self):
     self.url = reverse_ns(
         'collection-addon-detail', kwargs={
             'user_pk': self.user.pk,
             'collection_slug': self.collection.slug,
             'addon': self.addon.slug})
     self.test_basic()
Ejemplo n.º 6
0
 def test_optional_id_not_allowed_for_regular_addon(self):
     response = self.request(
         'POST',
         url=reverse_ns('signing.version'),
         addon='@create-version-no-id',
         version='1.0')
     assert response.status_code == 400
Ejemplo n.º 7
0
 def test_cors_api_v4(self):
     url = reverse_ns('addon-detail', api_version='v4', args=(3615,))
     assert '/api/v4/' in url
     response = self.get(url)
     assert response.status_code == 200
     assert not response.has_header('Access-Control-Allow-Credentials')
     assert response['Access-Control-Allow-Origin'] == '*'
Ejemplo n.º 8
0
    def setUp(self):
        super(TestDiscoveryRecommendations, self).setUp()

        self.addons = []

        # This one should not appear anywhere, position isn't set.
        DiscoveryItem.objects.create(addon=addon_factory())

        for i in range(1, 8):
            if i % 3:
                type_ = amo.ADDON_PERSONA
            else:
                type_ = amo.ADDON_EXTENSION
            addon = addon_factory(type=type_)
            self.addons.append(addon)
            DiscoveryItem.objects.create(addon=addon, position=i)

        for i in range(1, 8):
            if i % 3:
                type_ = amo.ADDON_PERSONA
            else:
                type_ = amo.ADDON_EXTENSION
            addon = addon_factory(type=type_)
            DiscoveryItem.objects.create(addon=addon, position_china=i)

        patcher = mock.patch(
            'olympia.discovery.views.get_recommendations')
        self.get_recommendations = patcher.start()
        self.addCleanup(patcher.stop)
        # If no recommendations then results should be as before - tests from
        # the parent class check this.
        self.get_recommendations.return_value = []
        self.url = reverse_ns('discovery-list')
Ejemplo n.º 9
0
 def url(self, guid, version, pk=None):
     if guid is None:
         args = [version]
     else:
         args = [guid, version]
     if pk is not None:
         args.append(pk)
     return reverse_ns('signing.version', args=args)
Ejemplo n.º 10
0
 def get_request(self, data):
     datastr = json.dumps(data)
     req = req_factory_factory(reverse_ns('inbound-email-api'), post=True)
     req.META['REMOTE_ADDR'] = '10.10.10.10'
     req.META['CONTENT_LENGTH'] = len(datastr)
     req.META['CONTENT_TYPE'] = 'application/json'
     req._stream = StringIO.StringIO(datastr)
     return req
Ejemplo n.º 11
0
def test_read_only_mode(client):
    with override_settings(READ_ONLY=True):
        response = client.post(reverse_ns('abusereportuser-list'))

    assert response.status_code == 503
    assert 'website maintenance' in response.json()['error']
    assert response['X-AMO-Read-Only'] == 'true'
    assert 'Retry-After' not in response
Ejemplo n.º 12
0
    def test_webextension_reuse_guid_but_only_create(self):
        # Uploading the same version with the same id fails. People
        # have to use the regular `PUT` endpoint for that.
        response = self.request(
            'POST',
            url=reverse_ns('signing.version'),
            addon='@create-webextension-with-guid',
            version='1.0')
        assert response.status_code == 201

        response = self.request(
            'POST',
            url=reverse_ns('signing.version'),
            addon='@create-webextension-with-guid',
            version='1.0')
        assert response.status_code == 400
        assert response.data['error'] == 'Duplicate add-on ID found.'
Ejemplo n.º 13
0
def test_read_only_mode_with_retry_after(client):
    delta = timedelta(minutes=8)
    with override_settings(READ_ONLY=True, READ_ONLY_RETRY_AFTER=delta):
        response = client.post(reverse_ns('abusereportuser-list'))

    assert response.status_code == 503
    assert 'website maintenance' in response.json()['error']
    assert response['X-AMO-Read-Only'] == 'true'
    assert response['Retry-After'] == '480'
Ejemplo n.º 14
0
 def setUp(self):
     super(TestReviewNotesViewSetCreate, self).setUp()
     self.addon = addon_factory(
         guid=generate_addon_guid(), name=u'My Addôn', slug='my-addon')
     self.version = self.addon.find_latest_version(
         channel=amo.RELEASE_CHANNEL_LISTED)
     self.url = reverse_ns('version-reviewnotes-list', kwargs={
         'addon_pk': self.addon.pk,
         'version_pk': self.version.pk})
Ejemplo n.º 15
0
 def setUp(self):
     self.user = user_factory()
     self.collection = collection_factory(author=self.user)
     self.url = reverse_ns(
         'collection-addon-list', api_version='v4dev', kwargs={
             'user_pk': self.user.pk,
             'collection_slug': self.collection.slug})
     self.addon = addon_factory()
     super(TestCollectionAddonViewSetCreate, self).setUp()
Ejemplo n.º 16
0
    def test_different_user(self):
        random_user = user_factory()
        other_url = reverse_ns('collection-list',
                               kwargs={'user_pk': random_user.pk})
        collection_factory(author=random_user)

        self.client.login_api(self.user)
        response = self.client.get(other_url)
        assert response.status_code == 403
Ejemplo n.º 17
0
 def setUp(self):
     super(TestDiscoveryRecommendations, self).setUp()
     # Represents a dummy version of `olympia.discovery.data`
     self.addons = get_dummy_addons()
     patcher = mock.patch('olympia.discovery.views.get_recommendations')
     self.get_recommendations = patcher.start()
     self.addCleanup(patcher.stop)
     # If no recommendations then results should be as before - tests from
     # the parent class check this.
     self.get_recommendations.return_value = []
     self.url = reverse_ns('discovery-list')
Ejemplo n.º 18
0
 def setUp(self):
     self.user = user_factory()
     self.collection = collection_factory(author=self.user)
     self.url = reverse_ns('collection-addon-list',
                           api_version='v5',
                           kwargs={
                               'user_pk': self.user.pk,
                               'collection_slug': self.collection.slug
                           })
     self.addon = addon_factory()
     super(TestCollectionAddonViewSetCreate, self).setUp()
Ejemplo n.º 19
0
 def setUp(self):
     self.user = user_factory()
     self.collection = collection_factory(author=self.user)
     self.addon = addon_factory()
     self.collection.add_addon(self.addon)
     self.url = reverse_ns(
         'collection-addon-detail', kwargs={
             'user_pk': self.user.pk,
             'collection_slug': self.collection.slug,
             'addon': self.addon.id})
     super(TestCollectionAddonViewSetDetail, self).setUp()
Ejemplo n.º 20
0
 def setUp(self):
     DiscoveryItem.objects.create(addon=addon_factory(),
                                  custom_addon_name=u'Fôoooo')
     DiscoveryItem.objects.create(addon=addon_factory(),
                                  custom_heading=u'My Custöm Headîng',
                                  custom_description=u'')
     DiscoveryItem.objects.create(
         addon=addon_factory(),
         custom_heading=u'Änother custom heading',
         custom_description=u'This time with a custom description as well')
     self.url = reverse_ns('discovery-editorial-list')
Ejemplo n.º 21
0
    def test_webextension_reuse_guid(self):
        response = self.request('POST',
                                url=reverse_ns('signing.version'),
                                addon='@create-webextension-with-guid',
                                version='1.0')

        guid = response.data['guid']
        assert guid == '@webextension-with-guid'

        addon = Addon.unfiltered.get(guid=guid)
        assert addon.guid == '@webextension-with-guid'
Ejemplo n.º 22
0
 def setUp(self):
     self.user = user_factory()
     self.collection = collection_factory(author=self.user)
     self.addon = addon_factory()
     self.collection.add_addon(self.addon)
     self.url = reverse_ns(
         'collection-addon-detail', kwargs={
             'user_pk': self.user.pk,
             'collection_slug': self.collection.slug,
             'addon': self.addon.id})
     super(TestCollectionAddonViewSetDetail, self).setUp()
Ejemplo n.º 23
0
 def test_release_android(self):
     self.url = reverse_ns(
         'appversions',
         kwargs={'application': 'android', 'version': '84.0'})
     response = self.put(self.url)
     assert response.status_code == 201
     assert AppVersion.objects.count() == 2
     assert AppVersion.objects.filter(
         application=amo.ANDROID.id, version='84.0').exists()
     assert AppVersion.objects.filter(
         application=amo.ANDROID.id, version='84.*').exists()
Ejemplo n.º 24
0
    def setUp(self):
        self.list_url = reverse('admin:discovery_homepageshelves_changelist')
        self.detail_url_name = 'admin:discovery_homepageshelves_change'

        criteria_sea = '?promoted=recommended&sort=random&type=extension'
        responses.add(
            responses.GET,
            reverse_ns('addon-search') + criteria_sea,
            status=200,
            json={'count': 103},
        )
Ejemplo n.º 25
0
 def get_request(self, data):
     # Request body should be a bytes string, so it needs to be encoded
     # after having built the json representation of it, then fed into
     # BytesIO().
     datastr = json.dumps(data).encode('utf-8')
     req = req_factory_factory(reverse_ns('inbound-email-api'), post=True)
     req.META['REMOTE_ADDR'] = '10.10.10.10'
     req.META['CONTENT_LENGTH'] = len(datastr)
     req.META['CONTENT_TYPE'] = 'application/json'
     req._stream = six.BytesIO(datastr)
     return req
Ejemplo n.º 26
0
    def setUp(self):
        self.url = reverse_ns('hero-primary-list', api_version='v5')
        uploaded_photo_1 = get_uploaded_file('animated.png')
        uploaded_photo_2 = get_uploaded_file('non-animated.png')
        uploaded_photo_3 = get_uploaded_file('preview_4x3.jpg')
        uploaded_photo_4 = get_uploaded_file('transparent.png')

        self.phi_a = PrimaryHeroImage.objects.create(custom_image=uploaded_photo_1)
        self.phi_b = PrimaryHeroImage.objects.create(custom_image=uploaded_photo_2)
        self.phi_c = PrimaryHeroImage.objects.create(custom_image=uploaded_photo_3)
        self.phi_d = PrimaryHeroImage.objects.create(custom_image=uploaded_photo_4)
Ejemplo n.º 27
0
 def get_request(self, data):
     # Request body should be a bytes string, so it needs to be encoded
     # after having built the json representation of it, then fed into
     # BytesIO().
     datastr = json.dumps(data).encode('utf-8')
     req = req_factory_factory(reverse_ns('inbound-email-api'), post=True)
     req.META['REMOTE_ADDR'] = '10.10.10.10'
     req.META['CONTENT_LENGTH'] = len(datastr)
     req.META['CONTENT_TYPE'] = 'application/json'
     req._stream = io.BytesIO(datastr)
     return req
Ejemplo n.º 28
0
    def setUp(self):
        self.url = reverse_ns('shelves-list', api_version='v5')

        shelf_a = Shelf.objects.create(
            title='Recommended extensions',
            endpoint='search',
            criteria='?promoted=recommended&sort=random&type=extension',
            footer_text='See more recommended extensions',
            footer_pathname='/extensions/',
        )
        shelf_b = Shelf.objects.create(
            title='Enhanced privacy extensions',
            endpoint='collections',
            criteria='privacy-matters',
            footer_text='See more enhanced privacy extensions',
        )
        shelf_c = Shelf.objects.create(
            title='Popular themes',
            endpoint='search',
            criteria='?sort=users&type=statictheme',
            footer_text='See more popular themes',
            footer_pathname='http://foo.baa',
        )

        self.hpshelf_a = ShelfManagement.objects.create(shelf=shelf_a,
                                                        position=3)
        self.hpshelf_b = ShelfManagement.objects.create(shelf=shelf_b,
                                                        position=2)
        ShelfManagement.objects.create(shelf=shelf_c, position=1)

        self.search_url = (reverse_ns('addon-search', api_version='v5') +
                           shelf_a.criteria)

        self.collections_url = reverse_ns(
            'collection-addon-list',
            api_version='v5',
            kwargs={
                'user_pk': settings.TASK_USER_ID,
                'collection_slug': shelf_b.criteria,
            },
        )
Ejemplo n.º 29
0
 def test_v4(self):
     # The unique view
     response = self.client.get(
         'api/v4/baa', HTTP_ORIGIN='testserver', follow=True)
     assert response.status_code == 200
     assert response.content == '{"version":"v4"}'
     url_ = reverse_ns('baa', api_version='v4')
     assert '/api/v4/' in url_
     # And the common one
     response = self.client.get(
         'api/v4/yay', HTTP_ORIGIN='testserver', follow=True)
     assert response.status_code == 200
     assert response.content == '{"version":"v4"}'
     url_ = reverse_ns('yay', api_version='v4')
     assert '/api/v4/' in url_
     # But no foo in v4
     response = self.client.get(
         'api/v4/foo', HTTP_ORIGIN='testserver', follow=True)
     assert response.status_code == 404
     with self.assertRaises(NoReverseMatch):
         reverse_ns('foo', api_version='v4')
Ejemplo n.º 30
0
 def test_v4(self):
     # The unique view
     response = self.client.get(
         'api/v4/baa', HTTP_ORIGIN='testserver', follow=True)
     assert response.status_code == 200
     assert response.json() == {'version': 'v4'}
     url_ = reverse_ns('baa', api_version='v4')
     assert '/api/v4/' in url_
     # And the common one
     response = self.client.get(
         'api/v4/yay', HTTP_ORIGIN='testserver', follow=True)
     assert response.status_code == 200
     assert response.json() == {'version': 'v4'}
     url_ = reverse_ns('yay', api_version='v4')
     assert '/api/v4/' in url_
     # But no foo in v4
     response = self.client.get(
         'api/v4/foo', HTTP_ORIGIN='testserver', follow=True)
     assert response.status_code == 404
     with self.assertRaises(NoReverseMatch):
         reverse_ns('foo', api_version='v4')
Ejemplo n.º 31
0
 def test_v3(self):
     # The unique view
     response = self.client.get(
         'api/v3/foo', HTTP_ORIGIN='testserver', follow=True)
     assert response.status_code == 200
     assert response.content == '{"version":"v3"}'
     url_ = reverse_ns('foo', api_version='v3')
     assert '/api/v3/' in url_
     # And the common one
     response = self.client.get(
         'api/v3/yay', HTTP_ORIGIN='testserver', follow=True)
     assert response.status_code == 200
     assert response.content == '{"version":"v3"}'
     url_ = reverse_ns('yay', api_version='v3')
     assert '/api/v3/' in url_
     # But no baa in v3
     response = self.client.get(
         'api/v3/baa', HTTP_ORIGIN='testserver', follow=True)
     assert response.status_code == 404
     with self.assertRaises(NoReverseMatch):
         reverse_ns('baa', api_version='v3')
Ejemplo n.º 32
0
 def test_version_download_url(self):
     version_string = '3.0'
     qs = File.objects.filter(version__addon__guid=self.guid,
                              version__version=version_string)
     assert not qs.exists()
     self.create_version(version_string)
     response = self.get(self.url(self.guid, version_string))
     assert response.status_code == 200
     file_ = qs.get()
     assert response.data['files'][0]['download_url'] == absolutify(
         reverse_ns('signing.file', kwargs={'file_id': file_.id}) +
         '/delicious_bookmarks-3.0-fx.xpi?src=api')
Ejemplo n.º 33
0
 def test_version_download_url(self):
     version_string = '3.0'
     qs = File.objects.filter(version__addon__guid=self.guid,
                              version__version=version_string)
     assert not qs.exists()
     self.create_version(version_string)
     response = self.get(self.url(self.guid, version_string))
     assert response.status_code == 200
     file_ = qs.get()
     assert response.data['files'][0]['download_url'] == absolutify(
         reverse_ns('signing.file', kwargs={'file_id': file_.id}) +
         '/delicious_bookmarks-3.0-fx.xpi?src=api')
Ejemplo n.º 34
0
    def test_webextension_reuse_guid(self):
        response = self.request(
            'POST',
            url=reverse_ns('signing.version'),
            addon='@create-webextension-with-guid',
            version='1.0')

        guid = response.data['guid']
        assert guid == '@webextension-with-guid'

        addon = Addon.unfiltered.get(guid=guid)
        assert addon.guid == '@webextension-with-guid'
Ejemplo n.º 35
0
 def test_webextension_optional_version(self):
     # Uploading the same version with the same id fails. People
     # have to use the regular `PUT` endpoint for that.
     response = self.request(
         'POST',
         url=reverse_ns('signing.version'),
         addon='@create-webextension-with-guid-and-version',
         version='99.0')
     assert response.status_code == 201
     assert (response.data['guid'] ==
             '@create-webextension-with-guid-and-version')
     assert response.data['version'] == '99.0'
Ejemplo n.º 36
0
 def setUp(self):
     super().setUp()
     self.addon = addon_factory(
         guid=generate_addon_guid(), name='My Addôn', slug='my-addon'
     )
     self.version = self.addon.find_latest_version(
         channel=amo.RELEASE_CHANNEL_LISTED
     )
     self.url = reverse_ns(
         'version-reviewnotes-list',
         kwargs={'addon_pk': self.addon.pk, 'version_pk': self.version.pk},
     )
Ejemplo n.º 37
0
 def setUp(self):
     self.items = [
         DiscoveryItem.objects.create(
             addon=addon_factory(summary='This is the addon summary')
         ),
         DiscoveryItem.objects.create(addon=addon_factory(), custom_description=''),
         DiscoveryItem.objects.create(
             addon=addon_factory(),
             custom_description='This time with a custom description',
         ),
     ]
     self.url = reverse_ns('discovery-editorial-list')
Ejemplo n.º 38
0
    def test_404(self):
        # Invalid user.
        url = reverse_ns(
            'collection-list', kwargs={'user_pk': self.user.pk + 66})

        # Not logged in.
        response = self.client.get(url)
        assert response.status_code == 401

        # Logged in
        self.client.login_api(self.user)
        response = self.client.get(url)
        assert response.status_code == 404
Ejemplo n.º 39
0
    def setUp(self):
        super(TestIndexCommand, self).setUp()
        if is_reindexing_amo():
            unflag_reindexing_amo()

        self.url = reverse_ns('addon-search')

        # We store previously existing indices in order to delete the ones
        # created during this test run.
        self.indices = self.es.indices.stats()['indices'].keys()

        self.addons = []
        self.expected = self.addons[:]
Ejemplo n.º 40
0
def test_drf_url():
    fragment = '{{ drf_url("addon-detail", pk="a3615") }}'
    rf = RequestFactory()

    request = rf.get('/hello/')
    rendered = render(fragment, context={'request': request})
    # As no /vX/ in the request, RESTFRAMEWORK['DEFAULT_VERSION'] is used.
    assert rendered == jinja_helpers.absolutify(
        reverse_ns('addon-detail', args=['a3615']))

    with pytest.raises(NoReverseMatch):
        # Without a request it can't resolve the name correctly.
        render(fragment, context={})
Ejemplo n.º 41
0
 def setUp(self):
     DiscoveryItem.objects.create(
         addon=addon_factory(),
         custom_addon_name=u'Fôoooo')
     DiscoveryItem.objects.create(
         addon=addon_factory(),
         custom_heading=u'My Custöm Headîng',
         custom_description=u'')
     DiscoveryItem.objects.create(
         addon=addon_factory(),
         custom_heading=u'Änother custom heading',
         custom_description=u'This time with a custom description as well')
     self.url = reverse_ns('discovery-editorial-list')
Ejemplo n.º 42
0
 def test_alpha_and_star_when_minor_is_not_0(self):
     self.url = reverse_ns(
         'appversions',
         kwargs={'application': 'firefox', 'version': '42.1a2'})
     response = self.put(self.url)
     assert response.status_code == 201
     assert AppVersion.objects.count() == 3
     assert AppVersion.objects.filter(
         application=amo.FIREFOX.id, version='42.1').exists()
     assert AppVersion.objects.filter(
         application=amo.FIREFOX.id, version='42.1a2').exists()
     assert AppVersion.objects.filter(
         application=amo.FIREFOX.id, version='42.*').exists()
Ejemplo n.º 43
0
 def setUp(self):
     self.block = Block.objects.create(
         guid='*****@*****.**',
         min_version='45',
         reason='something happened',
         url='https://goo.gol',
         updated_by=user_factory(),
     )
     self.url = reverse_ns(
         'blocklist-block-detail',
         api_version='v5',
         args=(str(self.block.guid), ),
     )
Ejemplo n.º 44
0
def test_drf_url():
    fragment = '{{ drf_url("addon-detail", pk="a3615") }}'
    rf = RequestFactory()

    request = rf.get('/hello/')
    rendered = render(fragment, context={'request': request})
    # As no /vX/ in the request, RESTFRAMEWORK['DEFAULT_VERSION'] is used.
    assert rendered == jinja_helpers.absolutify(
        reverse_ns('addon-detail', args=['a3615']))

    with pytest.raises(NoReverseMatch):
        # Without a request it can't resolve the name correctly.
        render(fragment, context={})
Ejemplo n.º 45
0
    def test_404(self):
        # Invalid user.
        url = reverse_ns('collection-list',
                         kwargs={'user_pk': self.user.pk + 66})

        # Not logged in.
        response = self.client.get(url)
        assert response.status_code == 401

        # Logged in
        self.client.login_api(self.user)
        response = self.client.get(url)
        assert response.status_code == 404
Ejemplo n.º 46
0
 def test_webextension_optional_version(self):
     # Uploading the same version with the same id fails. People
     # have to use the regular `PUT` endpoint for that.
     response = self.request(
         'POST',
         url=reverse_ns('signing.version'),
         addon='@create-webextension-with-guid-and-version',
         version='99.0')
     assert response.status_code == 201
     assert (
         response.data['guid'] ==
         '@create-webextension-with-guid-and-version')
     assert response.data['version'] == '99.0'
Ejemplo n.º 47
0
 def perform_search(self, *, url=None, data=None, expected_status=200,
                    expected_queries=0, page_size=6, **headers):
     url = url or self.url
     with self.assertNumQueries(expected_queries):
         response = self.client.get(url, data, **headers)
     assert response.status_code == expected_status, response.content
     data = json.loads(force_text(response.content))
     assert data['next'] is None
     assert data['previous'] is None
     assert data['page_size'] == page_size
     assert data['page_count'] == 1
     assert data['impression_url'] == reverse_ns(
         'sponsored-shelf-impression')
     return data
Ejemplo n.º 48
0
 def test_alpha_star_already_exists(self):
     AppVersion.objects.create(application=amo.FIREFOX.id, version='42.*')
     self.url = reverse_ns(
         'appversions',
         kwargs={'application': 'firefox', 'version': '42.0a1'})
     response = self.put(self.url)
     assert response.status_code == 201
     assert AppVersion.objects.count() == 3
     assert AppVersion.objects.filter(
         application=amo.FIREFOX.id, version='42.0').exists()
     assert AppVersion.objects.filter(
         application=amo.FIREFOX.id, version='42.0a1').exists()
     assert AppVersion.objects.filter(
         application=amo.FIREFOX.id, version='42.*').exists()
Ejemplo n.º 49
0
 def test_shelf_serializer_collections(self):
     data = self.serialize(instance=self.collections_shelf)
     collections_url = reverse_ns('collection-addon-list',
                                  kwargs={
                                      'user_pk':
                                      settings.TASK_USER_ID,
                                      'collection_slug':
                                      self.collections_shelf.criteria
                                  })
     assert data == {
         'title': 'Enhanced privacy extensions',
         'url': collections_url,
         'footer_text': 'See more enhanced privacy extensions',
         'footer_pathname': ''
     }
Ejemplo n.º 50
0
    def test_invalid_guid_in_package_post(self):
        Addon.objects.all().delete()

        response = self.request(
            'POST',
            url=reverse_ns('signing.version'),
            version='1.0',
            filename='src/olympia/files/fixtures/files/invalid_guid.xpi')
        assert response.status_code == 400
        assert response.data == {
            'error': 'Invalid Add-on ID in URL or package'
        }
        assert not Addon.unfiltered.filter(
            guid='this_guid_is_invalid').exists()
        assert not Addon.objects.exists()
Ejemplo n.º 51
0
 def test_v3(self):
     # The unique view
     response = self.client.get('api/v3/foo',
                                HTTP_ORIGIN='testserver',
                                follow=True)
     assert response.status_code == 200
     assert response.json() == {'version': 'v3'}
     url_ = reverse_ns('foo', api_version='v3')
     assert '/api/v3/' in url_
     # And the common one
     response = self.client.get('api/v3/yay',
                                HTTP_ORIGIN='testserver',
                                follow=True)
     assert response.status_code == 200
     assert response.json() == {'version': 'v3'}
     url_ = reverse_ns('yay', api_version='v3')
     assert '/api/v3/' in url_
     # But no baa in v3
     response = self.client.get('api/v3/baa',
                                HTTP_ORIGIN='testserver',
                                follow=True)
     assert response.status_code == 404
     with self.assertRaises(NoReverseMatch):
         reverse_ns('baa', api_version='v3')
Ejemplo n.º 52
0
    def _check_scenario(self, query, expected, no_match=None):
        # Make sure things are properly flushed and searchable
        url = reverse_ns('addon-search')

        response = self.client.get(url, {'q': query})
        assert response.status_code == 200

        results = json.loads(response.content)['results']

        # We only check for greater or equal since we usually don't care
        # about what else ElasticSearch finds magically for any query.
        # We're mostly concerned about the first few results to check
        # our general ranking. In real-world the rest that follows matches
        # the general scoring idea.
        assert len(results) >= len(expected), (
            'Expected {} results but {} found for query "{}": {}'.format(
                len(expected), len(results), query,
                [x['name']['en-US'] for x in results]
            )
        )

        for idx, addon in enumerate(expected):
            expected_name = addon[0]
            expected_score = addon[1]
            found_name = results[idx]['name']['en-US']
            found_score = results[idx]['_score']

            assert found_name == expected_name, (
                'Expected "{}" to be on position {} with score {} but '
                '"{}" was found instead with score {} for query {}'
                .format(expected_name, idx, expected_score,
                        found_name, found_score, query)
            )

            assert found_score == expected_score, (
                'Expected "{}" to be on position {} with score {} but '
                '"{}" was found instead with score {} for query {}'
                .format(expected_name, idx, expected_score,
                        found_name, found_score, query)
            )

        if no_match is not None:
            for name in no_match:
                names = [item['name']['en-US'] for item in results]
                assert name not in names, (
                    'Expected "{}" not to exist in results for query {}'
                    .format(name, query)
                )
Ejemplo n.º 53
0
    def test_basic(self):
        url = reverse_ns('shelves-editorial-list', api_version='v5')

        shelf_a = Shelf.objects.create(
            title='Recommended extensions',
            endpoint='search',
            criteria='?promoted=recommended&sort=random&type=extension',
            footer_text='See more!',
        )
        shelf_b = Shelf.objects.create(
            title='Enhanced privacy extensions',
            endpoint='collections',
            criteria='privacy-matters',
            footer_text='',
        )
        shelf_c = Shelf.objects.create(
            title='Popular themes',
            endpoint='search',
            criteria='?sort=users&type=statictheme',
            footer_text='See more popular themes',
        )

        # we set position but it's not used for this endpoint
        ShelfManagement.objects.create(shelf=shelf_a, position=3)
        ShelfManagement.objects.create(shelf=shelf_b, position=6)
        ShelfManagement.objects.create(shelf=shelf_c,
                                       position=1,
                                       enabled=False)

        response = self.client.get(url)
        assert response.status_code == 200

        assert response.json() == {
            'results': [
                {
                    'title': 'Recommended extensions',
                    'footer_text': 'See more!'
                },
                {
                    'title': 'Enhanced privacy extensions',
                    'footer_text': ''
                },
                {
                    'title': 'Popular themes',
                    'footer_text': 'See more popular themes'
                },
            ]
        }
Ejemplo n.º 54
0
 def test_cors_preflight(self):
     url = reverse_ns('addon-detail', args=(3615, ))
     response = self.options(url)
     assert response.status_code == 200
     assert response['Access-Control-Allow-Origin'] == '*'
     assert sorted(
         response['Access-Control-Allow-Headers'].lower().split(', ')) == [
             'accept',
             'accept-encoding',
             'authorization',
             'content-type',
             'dnt',
             'origin',
             'user-agent',
             'x-country-code',
             'x-csrftoken',
             'x-requested-with',
         ]
Ejemplo n.º 55
0
    def setUp(self):
        super(TestIndexCommand, self).setUp()
        if is_reindexing_amo():
            unflag_reindexing_amo()

        self.url = reverse_ns('addon-search')

        # We store previously existing indices in order to delete the ones
        # created during this test run.
        self.indices = self.es.indices.stats()['indices'].keys()

        self.addons = []
        self.expected = self.addons[:]
        # Monkeypatch Celerys ".get()" inside async task error
        # until https://github.com/celery/celery/issues/4661 (which isn't just
        # about retries but a general regression that manifests only in
        # eager-mode) fixed.
        self.patch('celery.app.task.denied_join_result')
Ejemplo n.º 56
0
    def test_admin(self):
        random_user = user_factory()
        other_url = reverse_ns('collection-list',
                               kwargs={'user_pk': random_user.pk})
        collection_factory(author=random_user)

        self.grant_permission(self.user, 'Collections:Edit')
        self.client.login_api(self.user)
        response = self.client.get(other_url)
        assert response.status_code == 403

        self.grant_permission(self.user, 'Collections:Contribute')
        self.client.login_api(self.user)
        response = self.client.get(other_url)
        assert response.status_code == 403

        self.grant_permission(self.user, 'Admin:Curation')
        response = self.client.get(other_url)
        assert response.status_code == 403
Ejemplo n.º 57
0
    def test_admin(self):
        random_user = user_factory()
        other_url = reverse_ns('collection-list',
                               kwargs={'user_pk': random_user.pk})
        collection_factory(author=random_user)

        self.grant_permission(self.user, 'Collections:Edit')
        self.client.login_api(self.user)
        response = self.client.get(other_url)
        assert response.status_code == 403

        self.grant_permission(self.user, 'Collections:Contribute')
        self.client.login_api(self.user)
        response = self.client.get(other_url)
        assert response.status_code == 403

        self.grant_permission(self.user, 'Admin:Curation')
        response = self.client.get(other_url)
        assert response.status_code == 403
Ejemplo n.º 58
0
    def test_version_history(self):
        self.client.cookies[API_TOKEN_COOKIE] = 'magicbeans'
        v1 = self.version
        v2, _ = self._extra_version_and_file(amo.STATUS_AWAITING_REVIEW)

        response = self.client.get(self.url)
        assert response.status_code == 200
        doc = pq(response.content)

        show_links = doc('.review-history-show')
        assert show_links.length == 3
        assert show_links[0].attrib['data-div'] == '#%s-review-history' % v1.id
        assert not show_links[1].attrib.get('data-div')
        assert show_links[2].attrib['data-div'] == '#%s-review-history' % v2.id

        # All 3 links will have a 'data-version' attribute.
        assert show_links[0].attrib['data-version'] == str(v1.id)
        # But the 2nd link will point to the latest version in the channel.
        assert show_links[1].attrib['data-version'] == str(v2.id)
        assert show_links[2].attrib['data-version'] == str(v2.id)

        # Test review history
        review_history_td = doc('#%s-review-history' % v1.id)[0]
        assert review_history_td.attrib['data-token'] == 'magicbeans'
        api_url = absolutify(reverse_ns(
            'version-reviewnotes-list',
            args=[self.addon.id, self.version.id]))
        assert review_history_td.attrib['data-api-url'] == api_url
        assert doc('.review-history-hide').length == 2

        pending_activity_count = doc('.review-history-pending-count')
        # No counter, because we don't have any pending activity to show.
        assert pending_activity_count.length == 0

        # Reply box div is there (only one)
        assert doc('.dev-review-reply-form').length == 1
        review_form = doc('.dev-review-reply-form')[0]
        review_form.attrib['action'] == api_url
        review_form.attrib['data-token'] == 'magicbeans'
        review_form.attrib['data-history'] == '#%s-review-history' % v2.id
Ejemplo n.º 59
0
    def setUp(self):
        self.user = user_factory()
        self.collection = collection_factory(author=self.user)
        self.addon_a = addon_factory(name=u'anteater')
        self.addon_b = addon_factory(name=u'baboon')
        self.addon_c = addon_factory(name=u'cheetah')
        self.addon_disabled = addon_factory(name=u'antelope_disabled')
        self.addon_deleted = addon_factory(name=u'buffalo_deleted')
        self.addon_pending = addon_factory(name=u'pelican_pending')

        # Set a few more languages on our add-ons to test sorting
        # a bit better. https://github.com/mozilla/addons-server/issues/8354
        self.addon_a.name = {'de': u'Ameisenbär'}
        self.addon_a.save()

        self.addon_b.name = {'de': u'Pavian'}
        self.addon_b.save()

        self.addon_c.name = {'de': u'Gepard'}
        self.addon_c.save()

        self.collection.add_addon(self.addon_a)
        self.collection.add_addon(self.addon_disabled)
        self.collection.add_addon(self.addon_b)
        self.collection.add_addon(self.addon_deleted)
        self.collection.add_addon(self.addon_c)
        self.collection.add_addon(self.addon_pending)

        # Set up our filtered-out-by-default addons
        self.addon_disabled.update(disabled_by_user=True)
        self.addon_deleted.delete()
        self.addon_pending.current_version.all_files[0].update(
            status=amo.STATUS_AWAITING_REVIEW)

        self.url = reverse_ns(
            'collection-addon-list', kwargs={
                'user_pk': self.user.pk,
                'collection_slug': self.collection.slug})
        super(TestCollectionAddonViewSetList, self).setUp()