def test_not_enough_files_error(self, create_summary_for_version_mock): create_summary_for_version_mock.side_effect = ( AutoApprovalNotEnoughFilesError) call_command('auto_approve') assert get_reviewing_cache(self.addon.pk) is None assert create_summary_for_version_mock.call_count == 1 self._check_stats({'total': 1, 'error': 1})
def test_no_validation_result(self, create_summary_for_version_mock): create_summary_for_version_mock.side_effect = ( AutoApprovalNoValidationResultError) call_command('auto_approve') assert get_reviewing_cache(self.addon.pk) is None assert create_summary_for_version_mock.call_count == 1 self._check_stats({'total': 1, 'error': 1})
def test_failed_verdict(self, create_summary_for_version_mock, approve_mock): fake_verdict_info = { 'uses_custom_csp': True, 'uses_native_messaging': True, 'uses_content_script_for_all_urls': True, 'too_many_average_daily_users': True, 'too_few_approved_updates': True, } create_summary_for_version_mock.return_value = (AutoApprovalSummary( verdict=amo.NOT_AUTO_APPROVED), fake_verdict_info) call_command('auto_approve') assert approve_mock.call_count == 0 assert create_summary_for_version_mock.call_args == (( self.version, ), { 'max_average_daily_users': 10000, 'min_approved_updates': 1, 'dry_run': False, 'post_review': False }) assert get_reviewing_cache(self.addon.pk) is None self._check_stats({ 'total': 1, 'uses_custom_csp': 1, 'uses_native_messaging': 1, 'uses_content_script_for_all_urls': 1, 'too_many_average_daily_users': 1, 'too_few_approved_updates': 1, })
def test_full(self, sign_file_mock): # Simple integration test with as few mocks as possible. assert not AutoApprovalSummary.objects.exists() assert not self.file.reviewed ActivityLog.objects.all().delete() self.author = user_factory() self.addon.addonuser_set.create(user=self.author) call_command('auto_approve', '--dry-run') call_command('auto_approve') self.addon.reload() self.file.reload() assert AutoApprovalSummary.objects.count() == 1 assert AutoApprovalSummary.objects.get(version=self.version) assert get_reviewing_cache(self.addon.pk) is None assert self.addon.status == amo.STATUS_PUBLIC assert self.file.status == amo.STATUS_PUBLIC assert self.file.reviewed assert ActivityLog.objects.count() activity_log = ActivityLog.objects.latest('pk') assert activity_log.action == amo.LOG.APPROVE_VERSION.id assert sign_file_mock.call_count == 1 assert sign_file_mock.call_args[0][0] == self.file assert len(mail.outbox) == 1 msg = mail.outbox[0] assert msg.to == [self.author.email] assert msg.from_email == settings.EDITORS_EMAIL assert msg.subject == 'Mozilla Add-ons: %s %s Approved' % (unicode( self.addon.name), self.version.version)
def test_successful_verdict_dry_run( self, create_summary_for_version_mock, approve_mock): create_summary_for_version_mock.return_value = ( AutoApprovalSummary(verdict=amo.WOULD_HAVE_BEEN_AUTO_APPROVED), {}) call_command('auto_approve', '--dry-run') assert approve_mock.call_count == 0 assert create_summary_for_version_mock.call_args == ( (self.version, ), {'max_average_daily_users': 10000, 'min_approved_updates': 1, 'dry_run': True}) assert get_reviewing_cache(self.addon.pk) is None self._check_stats({'total': 1, 'auto_approved': 1})
def test_successful_verdict(self, create_summary_for_version_mock, approve_mock): create_summary_for_version_mock.return_value = (AutoApprovalSummary( verdict=amo.AUTO_APPROVED), {}) call_command('auto_approve') assert create_summary_for_version_mock.call_count == 1 assert create_summary_for_version_mock.call_args == ((self.version, ), { 'dry_run': False }) assert get_reviewing_cache(self.addon.pk) is None assert approve_mock.call_count == 1 assert approve_mock.call_args == ((self.version, ), {}) self._check_stats({'total': 1, 'auto_approved': 1})
def test_failed_verdict(self, create_summary_for_version_mock, approve_mock): fake_verdict_info = {'is_locked': True} create_summary_for_version_mock.return_value = (AutoApprovalSummary( verdict=amo.NOT_AUTO_APPROVED), fake_verdict_info) call_command('auto_approve') assert approve_mock.call_count == 0 assert create_summary_for_version_mock.call_args == ((self.version, ), { 'dry_run': False }) assert get_reviewing_cache(self.addon.pk) is None self._check_stats({ 'total': 1, 'is_locked': 1, })
def review_viewing(request): if 'addon_id' not in request.POST: return {} addon_id = request.POST['addon_id'] user_id = request.user.id current_name = '' is_user = 0 key = get_reviewing_cache_key(addon_id) user_key = '%s:review_viewing_user:%s' % (settings.CACHE_PREFIX, user_id) interval = amo.EDITOR_VIEWING_INTERVAL # Check who is viewing. currently_viewing = get_reviewing_cache(addon_id) # If nobody is viewing or current user is, set current user as viewing if not currently_viewing or currently_viewing == user_id: # Get a list of all the reviews this user is locked on. review_locks = cache.get_many(cache.get(user_key, {})) can_lock_more_reviews = ( len(review_locks) < amo.EDITOR_REVIEW_LOCK_LIMIT or acl.action_allowed(request, amo.permissions.REVIEWER_ADMIN_TOOLS_VIEW)) if can_lock_more_reviews or currently_viewing == user_id: set_reviewing_cache(addon_id, user_id) # Give it double expiry just to be safe. cache.set(user_key, set(review_locks) | {key}, interval * 4) currently_viewing = user_id current_name = request.user.name is_user = 1 else: currently_viewing = settings.TASK_USER_ID current_name = _('Review lock limit reached') is_user = 2 else: current_name = UserProfile.objects.get(pk=currently_viewing).name return { 'current': currently_viewing, 'current_name': current_name, 'is_user': is_user, 'interval_seconds': interval }
def review_viewing(request): if 'addon_id' not in request.POST: return {} addon_id = request.POST['addon_id'] user_id = request.user.id current_name = '' is_user = 0 key = get_reviewing_cache_key(addon_id) user_key = '%s:review_viewing_user:%s' % (settings.CACHE_PREFIX, user_id) interval = amo.EDITOR_VIEWING_INTERVAL # Check who is viewing. currently_viewing = get_reviewing_cache(addon_id) # If nobody is viewing or current user is, set current user as viewing if not currently_viewing or currently_viewing == user_id: # Get a list of all the reviews this user is locked on. review_locks = cache.get_many(cache.get(user_key, {})) can_lock_more_reviews = ( len(review_locks) < amo.EDITOR_REVIEW_LOCK_LIMIT or acl.action_allowed(request, amo.permissions.REVIEWER_ADMIN_TOOLS_VIEW)) if can_lock_more_reviews or currently_viewing == user_id: set_reviewing_cache(addon_id, user_id) # Give it double expiry just to be safe. cache.set(user_key, set(review_locks) | {key}, interval * 4) currently_viewing = user_id current_name = request.user.name is_user = 1 else: currently_viewing = settings.TASK_USER_ID current_name = ugettext('Review lock limit reached') is_user = 2 else: current_name = UserProfile.objects.get(pk=currently_viewing).name return {'current': currently_viewing, 'current_name': current_name, 'is_user': is_user, 'interval_seconds': interval}
def test_full_post_review(self, sign_file_mock): # Simple integration test with as few mocks as possible, and # post-review waffle enabled. assert not AutoApprovalSummary.objects.exists() assert not self.file.reviewed ActivityLog.objects.all().delete() self.author = user_factory() self.addon.addonuser_set.create(user=self.author) # Delete the add-on current version and approval info, leaving it # nominated. Because we're in post-review we should pick it up and # approve it anyway. AddonApprovalsCounter.objects.filter(addon=self.addon).get().delete() self.addon.current_version.delete() self.addon.update_status() call_command('auto_approve', '--dry-run') call_command('auto_approve') self.addon.reload() self.file.reload() assert AutoApprovalSummary.objects.count() == 1 assert AutoApprovalSummary.objects.get(version=self.version) assert get_reviewing_cache(self.addon.pk) is None assert self.addon.status == amo.STATUS_PUBLIC assert self.file.status == amo.STATUS_PUBLIC assert self.file.reviewed assert ActivityLog.objects.count() activity_log = ActivityLog.objects.latest('pk') assert activity_log.action == amo.LOG.APPROVE_VERSION.id assert sign_file_mock.call_count == 1 assert sign_file_mock.call_args[0][0] == self.file assert len(mail.outbox) == 1 msg = mail.outbox[0] assert msg.to == [self.author.email] assert msg.from_email == settings.EDITORS_EMAIL assert msg.subject == 'Mozilla Add-ons: %s %s Approved' % (unicode( self.addon.name), self.version.version)