~asbalderson/jenkins-launchpad-plugin/trigger-fix

« back to all changes in this revision

Viewing changes to tests/test_launchpadutils.py

  • Committer: Francis Ginther
  • Date: 2017-02-24 16:41:40 UTC
  • mfrom: (131.1.4 trigger)
  • Revision ID: francis.ginther@canonical.com-20170224164140-8yf1t0qrpeb0wg1f
Support triggering and voting on git merge proposals. [a=albaguirre,powersj] [r=fginther]

Show diffs side-by-side

added added

removed removed

Lines of Context:
411
411
                               "URL:..."
412
412
        mp.all_comments = [comment]
413
413
        self.assertEqual(
414
 
            launchpadutils.get_latest_review(self.launchpad_user, mp), 47)
 
414
            launchpadutils.get_latest_review(self.launchpad_user, mp), '47')
415
415
 
416
416
    def test_get_latest_review_which_failed(self):
417
417
        mp = MagicMock()
422
422
                               "URL:..."
423
423
        mp.all_comments = [comment]
424
424
        self.assertEqual(
425
 
            launchpadutils.get_latest_review(self.launchpad_user, mp), 47)
 
425
            launchpadutils.get_latest_review(self.launchpad_user, mp), '47')
426
426
 
427
427
    @patch('jlp.launchpadutils.get_latest_review', new=lambda x, y: 60)
428
428
    def test_new_mp_candidate_revision_in_queue(self):
448
448
                self.launchpad_user, mp)
449
449
            self.assertTrue(ret)
450
450
 
 
451
class TestLatestReviewForGitMPs(unittest.TestCase):
 
452
    def setUp(self):
 
453
        self.launchpad_user = MagicMock()
 
454
        self.jenkinsUserName = 'name'
 
455
        self.launchpad_user.name = self.jenkinsUserName
 
456
 
 
457
    def create_mp(self):
 
458
        mp = MagicMock()
 
459
        mp.web_link = 'https://code.launchpad.net/~user/project/+git/project/+merge/777'
 
460
        return mp
 
461
 
 
462
    def create_mp_with_revision(self, revision):
 
463
        mp = self.create_mp()
 
464
        path = "refs/heads/nice"
 
465
        ref = MagicMock()
 
466
        ref.path = path
 
467
        ref.commit_sha1 = revision
 
468
        mp.source_git_path = path
 
469
        mp.source_git_repository.refs_collection = [ref]
 
470
        return mp
 
471
 
 
472
    def test_get_latest_review_no_comments(self):
 
473
        mp = self.create_mp()
 
474
        mp.all_comments = []
 
475
        self.assertEqual(
 
476
            launchpadutils.get_latest_review(self.launchpad_user, mp), 0)
 
477
 
 
478
    def test_get_latest_review_unrelated_comment(self):
 
479
        mp = self.create_mp()
 
480
        comment = MagicMock()
 
481
        comment.vote_tag = get_config_option('launchpad_review_type')
 
482
        comment.message_body = 'unrelated comment'
 
483
        mp.all_comments = [comment]
 
484
        self.assertEqual(
 
485
            launchpadutils.get_latest_review(self.launchpad_user, mp), 0)
 
486
 
 
487
    def test_get_latest_review_which_passed(self):
 
488
        mp = self.create_mp()
 
489
        comment = MagicMock()
 
490
        comment.author.name = self.jenkinsUserName
 
491
        comment.vote_tag = get_config_option('launchpad_review_type')
 
492
        comment.message_body = "PASSED: Continuous integration, rev:2fd4e1c67a2d28fced849ee1bb76e7391b93eb12\n" + \
 
493
                               "URL:..."
 
494
        mp.all_comments = [comment]
 
495
        self.assertEqual(
 
496
            launchpadutils.get_latest_review(self.launchpad_user, mp), '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12')
 
497
 
 
498
    def test_get_latest_review_which_failed(self):
 
499
        mp = self.create_mp()
 
500
        comment = MagicMock()
 
501
        comment.author.name = self.jenkinsUserName
 
502
        comment.vote_tag = get_config_option('launchpad_review_type')
 
503
        comment.message_body = "FAILED: Continuous integration, rev:2fd4e1c67a2d28fced849ee1bb76e7391b93eb12\n" + \
 
504
                               "URL:..."
 
505
        mp.all_comments = [comment]
 
506
        self.assertEqual(
 
507
            launchpadutils.get_latest_review(self.launchpad_user, mp), '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12')
 
508
 
 
509
    @patch('jlp.launchpadutils.get_latest_review', new=lambda x, y: '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12')
 
510
    def test_new_mp_candidate_revision_in_queue(self):
 
511
        mp = self.create_mp_with_revision('de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3')
 
512
        ret = launchpadutils.latest_candidate_validated(
 
513
            self.launchpad_user, mp)
 
514
        self.assertFalse(ret)
 
515
 
 
516
    @patch('jlp.launchpadutils.get_latest_review', new=lambda x, y: '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12')
 
517
    def test_mp_already_validated(self):
 
518
        mp = self.create_mp_with_revision('2fd4e1c67a2d28fced849ee1bb76e7391b93eb12')
 
519
        ret = launchpadutils.latest_candidate_validated(
 
520
            self.launchpad_user, mp)
 
521
        self.assertTrue(ret)
451
522
 
452
523
class TestApproveAndDisapprove(unittest.TestCase):
453
524
    jenkinsUserName = 'jenkins-user'
459
530
        mp.source_branch.display_name = 'lp:~ps-jenkins/unity/fix'
460
531
        return mp
461
532
 
 
533
    def _get_git_mp(self):
 
534
        mp = MagicMock()
 
535
        mp.web_link = 'https://code.launchpad.net/~dummy/agitproject/+git/gitproject/+merge/778899'
 
536
        mp.target_git_repository.display_name = 'lp:agitproject'
 
537
        mp.source_git_repository.display_name = 'lp:~auser/gitrepo'
 
538
        mp.source_git_path = 'refs/heads/abranch'
 
539
        mp.target_git_path = 'refs/heads/master'
 
540
        return mp
 
541
 
462
542
    def _get_subject(self, mp):
463
543
        return 'Re: [Merge] {} into {}'.format(
464
544
            mp.source_branch.display_name, mp.target_branch.display_name)
465
545
 
 
546
    def _expected_git_mp_subject(self, mp):
 
547
        source = mp.source_git_repository.display_name.replace('lp:', '') + \
 
548
                 ':' + \
 
549
                 mp.source_git_path.replace('refs/heads/', '')
 
550
        target = mp.target_git_repository.display_name.replace('lp:', '') + \
 
551
                 ':' + \
 
552
                 mp.target_git_path.replace('refs/heads/', '')
 
553
 
 
554
        return 'Re: [Merge] {} into {}'.format(source, target)
 
555
 
466
556
    def setUp(self):
467
557
        user = MagicMock()
468
558
        user.name = self.jenkinsUserName
531
621
            subject=subject,
532
622
            content=content)
533
623
 
 
624
    def test_approve_git_mp(self):
 
625
        mp = self._get_git_mp()
 
626
        subject = self._expected_git_mp_subject(mp)
 
627
        launchpadutils.approve_mp(mp, '1', 'http://url')
 
628
        content = dedent('''\
 
629
                            PASSED: Continuous integration, rev:1
 
630
                            http://url
 
631
 
 
632
                            Click here to trigger a rebuild:
 
633
                            http://url/rebuild
 
634
                            ''')
 
635
        mp.createComment.assert_called_once_with(
 
636
            review_type=get_config_option('launchpad_review_type'),
 
637
            vote=launchpadutils.LaunchpadVote.APPROVE,
 
638
            subject=subject,
 
639
            content=content)
 
640
 
 
641
    def test_dissaprove_git_mp(self):
 
642
        mp = self._get_git_mp()
 
643
        subject = self._expected_git_mp_subject(mp)
 
644
        launchpadutils.disapprove_mp(mp, '1', 'http://url')
 
645
        content = dedent('''\
 
646
                            FAILED: Continuous integration, rev:1
 
647
                            http://url
 
648
 
 
649
                            Click here to trigger a rebuild:
 
650
                            http://url/rebuild
 
651
                            ''')
 
652
        mp.createComment.assert_called_once_with(
 
653
            review_type=get_config_option('launchpad_review_type'),
 
654
            vote=launchpadutils.LaunchpadVote.NEEDS_FIXING,
 
655
            subject=subject,
 
656
            content=content)
 
657
 
534
658
 
535
659
class TestGetMergeProposalsWithInvalidBranch(unittest.TestCase):
536
660
    branch_with_mps = None
649
773
        ret = launchpadutils.get_mp_handle_from_url(launchpad, mp_url)
650
774
        self.assertEquals(ret, mp)
651
775
 
 
776
    def test_call_git_api_for_git_url(self):
 
777
        """If there is a merge proposal for the given merge proposal URL then
 
778
        get_mp_handle_from_url must return the respective merge proposal
 
779
        handle"""
 
780
 
 
781
        mp_url = 'https://code.launchpad.net/~dummy/agitproject/+git/gitproject/+merge/778899'
 
782
        launchpad = MagicMock()
 
783
        git_repo = MagicMock
 
784
        mp = MagicMock()
 
785
        mp.web_link = mp_url
 
786
        git_repo.landing_targets = [mp]
 
787
        launchpad.git_repositories.getByPath = lambda path: git_repo
 
788
        ret = launchpadutils.get_mp_handle_from_url(launchpad, mp_url)
 
789
        self.assertEquals(ret, mp)
 
790
 
652
791
class TestGetBranchHandle(unittest.TestCase):
653
792
    def setUp(self):
654
793
        '''Setup an empty launchpad.'''
775
914
        with self.assertRaises(RuntimeError):
776
915
            launchpadutils.get_branch_handle_for(self.launchpad, name,
777
916
                                                 'auto');
778