def test_UpdatePreviewDiffJob(self): """UpdatePreviewDiffJob runs under Celery.""" self.useBzrBranches(direct_database=True) bmp = create_example_merge(self)[0] self.factory.makeRevisionsForBranch(bmp.source_branch, count=1) self.useFixture(FeatureFixture( {'jobs.celery.enabled_classes': 'UpdatePreviewDiffJob'})) with block_on_job(): UpdatePreviewDiffJob.create(bmp) transaction.commit() self.assertIsNot(None, bmp.preview_diff)
def test_run_branches_empty(self): """If the branches are empty, we tell the user.""" # If the job has been waiting for a significant period of time (15 # minutes for now), we run the job anyway. The checkReady method # then raises and this is caught as a user error by the job system, # and as such sends an email to the error recipients, which for this # job is the merge proposal registrant. eric = self.factory.makePerson(name='eric', email='*****@*****.**') bmp = self.factory.makeBranchMergeProposal(registrant=eric) job = UpdatePreviewDiffJob.create(bmp) pop_notifications() JobRunner([job]).runAll() [email] = pop_notifications() self.assertEqual('Eric <*****@*****.**>', email['to']) self.assertEqual( 'Launchpad error while generating the diff for a merge proposal', email['subject']) branch = bmp.source_branch self.assertEqual( 'Launchpad encountered an error during the following operation: ' 'generating the diff for a merge proposal. ' 'The source branch of http://code.launchpad.dev/~%s/%s/%s/' '+merge/%d has no revisions.' % (branch.owner.name, branch.target.name, branch.name, bmp.id), email.get_payload(decode=True))
def test_10_minute_lease(self): self.useBzrBranches(direct_database=True) bmp = create_example_merge(self)[0] job = UpdatePreviewDiffJob.create(bmp) job.acquireLease() expiry_delta = job.lease_expires - datetime.now(pytz.UTC) self.assertTrue(500 <= expiry_delta.seconds, expiry_delta)
def test_run(self): bmp = self.createExampleBzrMerge()[0] job = UpdatePreviewDiffJob.create(bmp) self.factory.makeRevisionsForBranch(bmp.source_branch, count=1) bmp.source_branch.next_mirror_time = None with dbuser("merge-proposal-jobs"): JobRunner([job]).runAll() self.checkExampleBzrMerge(bmp.preview_diff.text)
def test_run(self): self.useBzrBranches(direct_database=True) bmp = create_example_merge(self)[0] job = UpdatePreviewDiffJob.create(bmp) self.factory.makeRevisionsForBranch(bmp.source_branch, count=1) bmp.source_branch.next_mirror_time = None with dbuser("merge-proposal-jobs"): JobRunner([job]).runAll() self.checkExampleMerge(bmp.preview_diff.text)
def test_triggers_webhooks_git(self): self.useFixture( FeatureFixture({BRANCH_MERGE_PROPOSAL_WEBHOOKS_FEATURE_FLAG: "on"})) bmp = self.createExampleGitMerge()[0] hook = self.factory.makeWebhook(target=bmp.target_git_repository, event_types=["merge-proposal:0.1"]) job = UpdatePreviewDiffJob.create(bmp) with dbuser("merge-proposal-jobs"): JobRunner([job]).runAll() self.assertCorrectPreviewDiffDelivery(bmp, hook.deliveries.one())
def test_triggers_webhooks_bzr(self): self.useFixture( FeatureFixture({BRANCH_MERGE_PROPOSAL_WEBHOOKS_FEATURE_FLAG: "on"})) bmp = self.createExampleBzrMerge()[0] hook = self.factory.makeWebhook(target=bmp.target_branch, event_types=["merge-proposal:0.1"]) job = UpdatePreviewDiffJob.create(bmp) self.factory.makeRevisionsForBranch(bmp.source_branch, count=1) bmp.source_branch.next_mirror_time = None with dbuser("merge-proposal-jobs"): JobRunner([job]).runAll() self.assertCorrectPreviewDiffDelivery(bmp, hook.deliveries.one())
def test_run_git_updates_related_bugs(self): # The merge proposal has its related bugs updated. projectgroup = self.factory.makeProject() project = self.factory.makeProduct(projectgroup=projectgroup) bug = self.factory.makeBug(target=project) # Create a structural subscription to ensure we don't short-circuit # in _get_structural_subscription_filter_id_query. subscriber = self.factory.makePerson() bug.default_bugtask.target.addSubscription(subscriber, subscriber) bmp, _, _, patch = self.createExampleGitMerge() committer = self.factory.makePerson() self.hosting_fixture.getLog.result = [ { "sha1": unicode(hashlib.sha1("tip").hexdigest()), "message": "Fix upside-down messages\n\nLP: #%d" % bug.id, "committer": { "name": committer.display_name, "email": committer.preferredemail.email, }, }, ] job = UpdatePreviewDiffJob.create(bmp) with dbuser("merge-proposal-jobs"): JobRunner([job]).runAll() self.assertEqual([bug], bmp.bugs) self.assertEqual([bmp], bug.linked_merge_proposals) self.assertEqual(patch, bmp.preview_diff.text) # If somebody rewrites history to remove the bug reference, then the # bug link is removed from the merge proposal. self.hosting_fixture.getLog.result = [] self.hosting_fixture.memcache_fixture.clear() job = UpdatePreviewDiffJob.create(bmp) with dbuser("merge-proposal-jobs"): JobRunner([job]).runAll() self.assertEqual([], bmp.bugs) self.assertEqual([], bug.linked_merge_proposals)
def test_run_object_events(self): # While the job runs a single IObjectModifiedEvent is issued when the # preview diff has been calculated. bmp = self.createExampleBzrMerge()[0] job = UpdatePreviewDiffJob.create(bmp) self.factory.makeRevisionsForBranch(bmp.source_branch, count=1) bmp.source_branch.next_mirror_time = None with dbuser("merge-proposal-jobs"): with EventRecorder() as event_recorder: JobRunner([job]).runAll() bmp_object_events = [ event for event in event_recorder.events if (IObjectModifiedEvent.providedBy(event) and event.object == bmp) ] self.assertEqual(1, len(bmp_object_events), "Expected one event, got: %r" % bmp_object_events) self.assertEqual(["preview_diff"], bmp_object_events[0].edited_fields)
def test_run_branches_pending_writes(self): """If the branches are being written, we retry but don't complain.""" eric = self.factory.makePerson(name='eric', email='*****@*****.**') bmp = self.factory.makeBranchMergeProposal(registrant=eric) self.factory.makeRevisionsForBranch(bmp.source_branch, count=1) self.factory.makeRevisionsForBranch(bmp.target_branch, count=1) # Kludge a branch being a bit out of date in a way that will make # pending_writes true, without anything else failing. removeSecurityProxy(bmp.source_branch).last_mirrored_id = \ self.factory.getUniqueString() job = UpdatePreviewDiffJob.create(bmp) # pop_notifications() JobRunner([job]).runAll() emails = pop_notifications() self.assertThat(emails, Equals([])) self.assertThat(job.status, Equals(JobStatus.WAITING)) self.assertThat(job.attempt_count, Equals(1)) self.assertThat(job.max_retries, Equals(20))
def test_run_object_events(self): # While the job runs a single IObjectModifiedEvent is issued when the # preview diff has been calculated. self.useBzrBranches(direct_database=True) bmp = create_example_merge(self)[0] job = UpdatePreviewDiffJob.create(bmp) self.factory.makeRevisionsForBranch(bmp.source_branch, count=1) bmp.source_branch.next_mirror_time = None with dbuser("merge-proposal-jobs"): with EventRecorder() as event_recorder: JobRunner([job]).runAll() bmp_object_events = [ event for event in event_recorder.events if (IObjectModifiedEvent.providedBy(event) and event.object == bmp)] self.assertEqual( 1, len(bmp_object_events), "Expected one event, got: %r" % bmp_object_events) self.assertEqual( ["preview_diff"], bmp_object_events[0].edited_fields)
def test_run_branches_empty(self): """If the branches are empty, we tell the user.""" # If the job has been waiting for a significant period of time (15 # minutes for now), we run the job anyway. The checkReady method # then raises and this is caught as a user error by the job system, # and as such sends an email to the error recipients, which for this # job is the merge proposal registrant. eric = self.factory.makePerson(name='eric', email='*****@*****.**') bmp = self.factory.makeBranchMergeProposal(registrant=eric) job = UpdatePreviewDiffJob.create(bmp) pop_notifications() JobRunner([job]).runAll() [email] = pop_notifications() self.assertEqual('Eric <*****@*****.**>', email['to']) self.assertEqual( 'Launchpad error while generating the diff for a merge proposal', email['subject']) self.assertEqual( 'Launchpad encountered an error during the following operation: ' 'generating the diff for a merge proposal. ' 'The source branch has no revisions.', email.get_payload(decode=True))
def test_getOperationDescription(self): bmp = self.factory.makeBranchMergeProposal() job = UpdatePreviewDiffJob.create(bmp) self.assertEqual( 'generating the diff for a merge proposal', job.getOperationDescription())
def test_providesInterface(self): """MergeProposalNeedsReviewEmailJob provides expected interfaces.""" bmp = self.factory.makeBranchMergeProposal() job = UpdatePreviewDiffJob.create(bmp) verifyObject(IUpdatePreviewDiffJob, job) verifyObject(IBranchMergeProposalJob, job)
def test_10_minute_lease(self): bmp = self.createExampleBzrMerge()[0] job = UpdatePreviewDiffJob.create(bmp) job.acquireLease() expiry_delta = job.lease_expires - datetime.now(pytz.UTC) self.assertTrue(500 <= expiry_delta.seconds, expiry_delta)
def test_run_git(self): bmp, _, _, patch = self.createExampleGitMerge() job = UpdatePreviewDiffJob.create(bmp) with dbuser("merge-proposal-jobs"): JobRunner([job]).runAll() self.assertEqual(patch, bmp.preview_diff.text)