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
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
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
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) )
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()
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
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'] == '*'
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')
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)
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
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
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.'
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'
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})
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()
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
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')
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()
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()
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')
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'
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()
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()
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}, )
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
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)
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
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, }, )
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')
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')
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')
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')
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')
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'
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'
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}, )
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')
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
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[:]
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={})
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')
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()
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), ), )
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={})
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
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'
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
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()
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': '' }
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()
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')
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) )
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' }, ] }
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', ]
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')
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
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
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
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()