def setUp(self): super(TestRunAddonsLinter, self).setUp() valid_path = get_addon_file('valid_webextension.xpi') invalid_path = get_addon_file('invalid_webextension_invalid_id.xpi') self.valid_upload = FileUpload.objects.create(path=valid_path) self.invalid_upload = FileUpload.objects.create(path=invalid_path)
def test_amo_validator_fail_error(self): result = tasks.validate_file_path( get_addon_file('invalid_firefox_addon_error.xpi'), hash_=None, listed=True) assert not result['success'] assert result['errors'] assert not result['warnings']
def test_amo_validator_addons_linter_success(self): result = tasks.validate_file_path( get_addon_file('valid_webextension.xpi'), hash_=None, listed=True, is_webextension=True) assert result['success'] assert not result['errors'] assert not result['warnings']
def test_amo_validator_addons_linter_error(self): # This test assumes that `amo-validator` doesn't correctly # validate a invalid id in manifest.json result = tasks.validate_file_path( get_addon_file('invalid_webextension_invalid_id.xpi'), hash_=None, listed=True, is_webextension=True) assert not result['success'] assert result['errors'] assert not result['warnings']
def test_apps_disallow_thunderbird_and_seamonkey(self): zip_file = utils.SafeZip(get_addon_file( 'valid_firefox_and_thunderbird_addon.xpi')) extracted = utils.RDFExtractor(zip_file).parse() apps = extracted['apps'] assert len(apps) == 1 assert apps[0].appdata == amo.FIREFOX assert apps[0].min.version == '38.0a1' assert apps[0].max.version == '43.0'
def test_submit_legacy_extension_targets_older_firefox_stricly(self): file_ = get_addon_file('valid_firefox_addon_strict_compatibility.xpi') upload = FileUpload.objects.create(path=file_) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 0 assert upload.processed_validation['messages'] == [] assert upload.valid
def test_submit_non_extension(self): file_ = get_addon_file('searchgeek-20090701.xml') upload = FileUpload.objects.create(path=file_) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 0 assert upload.processed_validation['messages'] == [] assert upload.valid
def test_validation_finishes_if_containing_binary_content(self): file_ = get_addon_file('webextension_containing_binary_files.xpi') upload = FileUpload.objects.create(path=file_, user=self.user) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 0 assert upload.processed_validation['messages'] == [] assert upload.valid
def test_does_not_revoke_safe_webextension(self): file_ = get_addon_file('valid_webextension.xpi') upload = FileUpload.objects.create(path=file_, user=self.user) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 0 assert upload.processed_validation['messages'] == [] assert upload.valid
def test_submit_thunderbird_extension(self): file_ = get_addon_file('valid_firefox_and_thunderbird_addon.xpi') upload = FileUpload.objects.create(path=file_) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 0 assert upload.processed_validation['messages'] == [] assert upload.valid
def test_submit_legacy_addon_restricted(self): file_ = get_addon_file('valid_firefox_addon.xpi') upload = FileUpload.objects.create(path=file_) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 1 expected = ['validation', 'messages', 'legacy_extensions_restricted'] assert upload.processed_validation['messages'][0]['id'] == expected assert not upload.valid
def test_submit_legacy_extension_not_a_new_addon(self): file_ = get_addon_file('valid_firefox_addon.xpi') addon = addon_factory(version_kw={'version': '0.1'}) upload = FileUpload.objects.create(path=file_, addon=addon) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 0 assert upload.processed_validation['messages'] == [] assert upload.valid
def test_submit_legacy_upgrade(self): # Works because it's not targeting >= 57. file_ = get_addon_file('valid_firefox_addon.xpi') addon = addon_factory(version_kw={'version': '0.1'}) upload = FileUpload.objects.create(path=file_, addon=addon) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 0 assert upload.processed_validation['messages'] == [] assert upload.valid
def test_apps(self): zip_file = utils.SafeZip(get_addon_file( 'valid_firefox_and_thunderbird_addon.xpi')) extracted = utils.RDFExtractor(zip_file).parse() apps = sorted(extracted['apps'], key=attrgetter('id')) assert len(apps) == 2 assert apps[0].appdata == amo.FIREFOX assert apps[0].min.version == '38.0a1' assert apps[0].max.version == '43.0' assert apps[1].appdata == amo.THUNDERBIRD assert apps[1].min.version == '42.0' assert apps[1].max.version == '45.0'
def setUp(self): self.user = user_factory() s = '656b16a8ab71686fcfcd04d574bc28be9a1d8252141f54cfb5041709262b84f4' self.key = APIKey.objects.create( user=self.user, type=SYMMETRIC_JWT_TYPE, key='user:12345:678', secret=s) self.addon = addon_factory(users=[self.user], version_kw={'version': '0.1'}, file_kw={'is_webextension': True}) self.file = get_addon_file('webextension_containing_api_key.xpi')
def test_submit_legacy_upgrade_targeting_star(self): # Should not error: extensions with a maxversion of '*' don't get the # error, the manifest parsing code will rewrite it as '56.*' instead. file_ = get_addon_file('valid_firefox_addon_targeting_star.xpi') addon = addon_factory(version_kw={'version': '0.1'}) upload = FileUpload.objects.create(path=file_, addon=addon) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 0 assert upload.processed_validation['messages'] == [] assert upload.valid
def test_validation_finishes_if_containing_invalid_filename(self): file_ = get_addon_file('invalid_webextension.xpi') upload = FileUpload.objects.create(path=file_, user=self.user) tasks.validate(upload, listed=True) upload.refresh_from_db() # https://github.com/mozilla/addons-server/issues/8208 # causes this to be 2 (and invalid) instead of 0 (and valid). # The invalid filename error is caught and raised outside of this # validation task. assert upload.processed_validation['errors'] == 2 assert not upload.valid
def test_submit_dictionary_upgrade_targeting_firefox_57(self): # Should not error: non-extensions types are not affected by the # restriction, even if they target 57. file_ = get_addon_file('dictionary_targeting_57.xpi') addon = addon_factory(version_kw={'version': '0.1'}, type=amo.ADDON_DICT) upload = FileUpload.objects.create(path=file_, addon=addon) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 0 assert upload.processed_validation['messages'] == [] assert upload.valid
def test_submit_legacy_extension_waffle_is_off(self): switch = Switch.objects.get(name='restrict-new-legacy-submissions') switch.active = False switch.save() file_ = get_addon_file('valid_firefox_addon.xpi') upload = FileUpload.objects.create(path=file_) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 0 assert upload.processed_validation['messages'] == [] assert upload.valid
def test_submit_legacy_extension_1st_version_in_that_channel_reverse(self): file_ = get_addon_file('valid_firefox_addon.xpi') addon = addon_factory( version_kw={'version': '0.1', 'channel': amo.RELEASE_CHANNEL_LISTED}) upload = FileUpload.objects.create(path=file_, addon=addon) tasks.validate(upload, listed=False) upload.refresh_from_db() assert upload.processed_validation['errors'] == 1 expected = ['validation', 'messages', 'legacy_addons_restricted'] assert upload.processed_validation['messages'][0]['id'] == expected assert not upload.valid
def test_validation_error_webextension(self, _mock): _mock.side_effect = Exception self.upload.update(path=get_addon_file('valid_webextension.xpi')) assert self.upload.validation is None tasks.validate(self.upload, listed=True) self.upload.reload() validation = self.upload.processed_validation assert validation assert validation['errors'] == 1 assert validation['messages'][0]['id'] == [ 'validator', 'unexpected_exception'] assert 'WebExtension' in validation['messages'][0]['message'] assert not self.upload.valid
def test_submit_legacy_upgrade_targeting_firefox_57(self): # Should error since it's a legacy extension targeting 57. file_ = get_addon_file('valid_firefox_addon_targeting_57.xpi') addon = addon_factory(version_kw={'version': '0.1'}) upload = FileUpload.objects.create(path=file_, addon=addon) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 1 assert len(upload.processed_validation['messages']) == 1 assert upload.processed_validation['messages'][0]['type'] == 'error' assert upload.processed_validation['messages'][0]['id'] == [ 'validation', 'messages', 'legacy_addons_max_version'] assert not upload.valid
def test_validation_error(self, _mock): _mock.side_effect = Exception self.upload.update(path=get_addon_file('desktop.xpi')) assert self.upload.validation is None tasks.validate(self.upload) self.upload.reload() validation = self.upload.processed_validation assert validation assert validation['errors'] == 1 assert validation['messages'][0]['id'] == ['validator', 'unexpected_exception'] assert not self.upload.valid
def test_submit_webextension_upgrade_targeting_firefox_57(self): # Should not error: it's targeting 57 but it's a webextension. file_ = get_addon_file('valid_webextension_targeting_57.xpi') addon = addon_factory(version_kw={'version': '0.1'}, file_kw={'is_webextension': True}) upload = FileUpload.objects.create(path=file_, addon=addon) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 0 messages = upload.processed_validation['messages'] assert len(messages) == 1 assert messages[0]['message'] == ('"strict_max_version" ' 'not required.') assert upload.valid
def test_run_linter_use_temporary_file(self): TemporaryFile = tempfile.TemporaryFile with mock.patch('olympia.devhub.tasks.tempfile.TemporaryFile') as tmpf: tmpf.side_effect = lambda *a, **kw: TemporaryFile(*a, **kw) # This is a relatively small add-on (1.2M) but we are using # a temporary file for all our linter output. result = json.loads(tasks.run_addons_linter( get_addon_file('typo-gecko.xpi') )) assert tmpf.call_count == 2 assert result['success'] assert result['warnings'] == 11 assert not result['errors']
def test_webextension_upgrade_is_annotated(self): assert all(f.is_webextension is False for f in self.addon.current_version.all_files) file_ = get_addon_file('valid_webextension.xpi') upload = FileUpload.objects.create(path=file_, addon=self.addon) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['is_upgrade_to_webextension'] expected = ['validation', 'messages', 'webext_upgrade'] assert upload.processed_validation['messages'][0]['id'] == expected assert upload.processed_validation['warnings'] == 1 assert upload.valid
def test_submit_legacy_upgrade_targeting_57_strict_compatibility(self): # Should error just like if it didn't have strict compatibility, that # does not matter: it's a legacy extension, it should not target 57. file_ = get_addon_file( 'valid_firefox_addon_targeting_57_strict_compatibility.xpi') addon = addon_factory(version_kw={'version': '0.1'}) upload = FileUpload.objects.create(path=file_, addon=addon) tasks.validate(upload, listed=True) upload.refresh_from_db() assert upload.processed_validation['errors'] == 1 assert len(upload.processed_validation['messages']) == 1 assert upload.processed_validation['messages'][0]['type'] == 'error' assert upload.processed_validation['messages'][0]['id'] == [ 'validation', 'messages', 'legacy_addons_max_version'] assert not upload.valid
def test_webextension_webext_to_webext_not_annotated(self): previous_file = self.addon.current_version.all_files[-1] previous_file.is_webextension = True previous_file.save() file_ = get_addon_file('valid_webextension.xpi') upload = FileUpload.objects.create(path=file_, addon=self.addon) tasks.validate(upload, listed=True) upload.refresh_from_db() validation = upload.processed_validation assert 'is_upgrade_to_webextension' not in validation expected = ['validation', 'messages', 'webext_upgrade'] assert not any(msg['id'] == expected for msg in validation['messages']) assert validation['warnings'] == 0 assert upload.valid
def test_new_webextension_is_not_annotated(self): """https://github.com/mozilla/addons-server/issues/3679""" previous_file = self.addon.current_version.all_files[-1] previous_file.is_webextension = True previous_file.status = amo.STATUS_AWAITING_REVIEW previous_file.save() file_ = get_addon_file('valid_webextension.xpi') upload = FileUpload.objects.create(path=file_, addon=self.addon) tasks.validate(upload, listed=True) upload.refresh_from_db() validation = upload.processed_validation assert 'is_upgrade_to_webextension' not in validation expected = ['validation', 'messages', 'webext_upgrade'] assert not any(msg['id'] == expected for msg in validation['messages']) assert validation['warnings'] == 0 assert upload.valid
def test_raises_error_for_invalid_webextension_xpi(self): with pytest.raises(zipfile.BadZipFile): utils.SafeZip(get_addon_file('invalid_webextension.xpi'))
def setUp(self): super(TestValidator, self).setUp() self.upload = FileUpload.objects.create( path=get_addon_file('desktop.xpi')) assert not self.upload.valid
def test_amo_validator_success(self): result = tasks.validate_file_path( get_addon_file('valid_firefox_addon.xpi'), hash_=None, listed=True) assert result['success'] assert not result['errors'] assert not result['warnings']
def setUp(self): super(TestRunAddonsLinter, self).setUp() self.valid_path = get_addon_file('valid_webextension.xpi') self.invalid_path = get_addon_file( 'invalid_webextension_invalid_id.xpi')
def setUp(self): super().setUp() self.valid_path = get_addon_file('valid_webextension.xpi') self.invalid_path = get_addon_file( 'invalid_webextension_invalid_id.xpi')
def test_raises_error_for_invalid_webextension_xpi(self): with pytest.raises(forms.ValidationError): utils.SafeZip(get_addon_file('invalid_webextension.xpi'))
def test_file_not_passed_all_validations(self): file_ = get_addon_file('valid_webextension.xpi') upload = self.get_upload( abspath=file_, addon=self.addon, version='1.0') tasks.submit_file(self.addon.pk, upload.pk, amo.RELEASE_CHANNEL_LISTED) assert not self.create_version_for_upload.called
def test_raises_validation_error_when_uncompressed_size_is_too_large(self): with override_settings(MAX_ZIP_UNCOMPRESSED_SIZE=1000): with pytest.raises(utils.InvalidZipFile): # total uncompressed size of this xpi is 126kb utils.SafeZip(get_addon_file('mozilla_static_theme.zip'))
def test_raises_validation_error_when_uncompressed_size_is_too_large(self): with override_settings(MAX_ZIP_UNCOMPRESSED_SIZE=1000): with pytest.raises(forms.ValidationError): # total uncompressed size of this xpi is: 2269 bytes utils.SafeZip( get_addon_file('valid_firefox_and_thunderbird_addon.xpi'))