예제 #1
0
    def test_no_branch(self):
        """Assert if there's no branch no emails are created."""
        gitlab = gitlab_module.Gitlab("https://gitlab",
                                      private_token="iaxMadvFyRCFRFH1CkW6",
                                      ssl_verify=False)
        project = gitlab.projects.get(1)
        merge_request = project.mergerequests.get(1)

        emails = gitlab2email._prepare_emails(gitlab, self.forge, project,
                                              merge_request)

        self.assertEqual(0, len(emails))
예제 #2
0
    def test_huge_mr(self, mock_make_msgid, mock_formatdate):
        """Assert when the merge request has MAX_EMAILS commits we don't send them."""
        mock_formatdate.return_value = "Thu, 24 Oct 2019 19:15:26 -0000"
        mock_make_msgid.return_value = "<*****@*****.**>"
        gitlab = gitlab_module.Gitlab("https://gitlab",
                                      private_token="iaxMadvFyRCFRFH1CkW6",
                                      ssl_verify=False)
        project = gitlab.projects.get(1)
        merge_request = project.mergerequests.get(2)

        emails = gitlab2email._prepare_emails(gitlab, self.forge, project,
                                              merge_request)

        self.assertEqual(1, len(emails))
        self.assertEqual(BIG_EMAIL, emails[0].message().as_string())
예제 #3
0
    def test_single_patch_series(self):
        project = self.gitlab.projects.get(1)
        merge_request = project.mergerequests.get(1)
        emails = gitlab2email._prepare_emails(self.gitlab, self.forge,
                                              self.project, merge_request)
        initial_patch_count = pw_models.Patch.objects.count()
        initial_cover_letter_count = pw_models.CoverLetter.objects.count()

        for email in emails:
            gitlab2email._record_bridging(self.forge.project.listid, 1, email)

        self.assertEqual(1, models.BridgedSubmission.objects.count())
        self.assertEqual(1,
                         pw_models.Patch.objects.count() - initial_patch_count)
        self.assertEqual(initial_cover_letter_count,
                         pw_models.CoverLetter.objects.count())
예제 #4
0
    def test_multiline_patch_subject(self):
        """
        Assert patches with multi-line subjects are sanitized to have single-line
        subjects. Multi-line subjects allow malicious patches to inject arbitrary
        headers into the email.
        """
        gitlab = gitlab_module.Gitlab("https://gitlab",
                                      private_token="iaxMadvFyRCFRFH1CkW6",
                                      ssl_verify=False)
        project = gitlab.projects.get(1)
        merge_request = project.mergerequests.get(1)

        emails = gitlab2email._prepare_emails(gitlab, self.forge, project,
                                              merge_request)

        self.assertEqual(1, len(emails[0].message()["Subject"].splitlines()))
예제 #5
0
    def test_single_commit_mr(self, mock_make_msgid):
        """
        Assert a merge request with a single commit results in a single email.
        """
        mock_make_msgid.return_value = "<*****@*****.**>"
        gitlab = gitlab_module.Gitlab("https://gitlab",
                                      private_token="iaxMadvFyRCFRFH1CkW6",
                                      ssl_verify=False)
        project = gitlab.projects.get(1)
        merge_request = project.mergerequests.get(1)

        emails = gitlab2email._prepare_emails(gitlab, self.forge, project,
                                              merge_request)

        self.assertEqual(1, len(emails))
        self.assertEqual(SINGLE_COMMIT_MR, emails[0].message().as_string())
예제 #6
0
    def test_duplicate_patches(self):
        """Assert if the same emails are provided to _record_bridging it raises an exception."""
        project = self.gitlab.projects.get(1)
        merge_request = project.mergerequests.get(1)
        emails = gitlab2email._prepare_emails(self.gitlab, self.forge,
                                              self.project, merge_request)

        for email in emails:
            gitlab2email._record_bridging(self.forge.project.listid, 1, email)

            self.assertRaises(
                ValueError,
                gitlab2email._record_bridging,
                self.forge.project.listid,
                1,
                email,
            )
예제 #7
0
    def test_wrapped_cover_letter_body(self):
        """
        Assert cover letters that are not line-wrapped in GitLab are wrapped to
        72 characters in their email representation.
        """
        gitlab = gitlab_module.Gitlab("https://gitlab",
                                      private_token="iaxMadvFyRCFRFH1CkW6",
                                      ssl_verify=False)
        project = gitlab.projects.get(1)
        merge_request = project.mergerequests.get(2)

        emails = gitlab2email._prepare_emails(gitlab, self.forge, project,
                                              merge_request)

        self.assertTrue(len(merge_request.description.splitlines()[0]) > 72)
        for line in emails[0].message().get_payload().splitlines():
            self.assertTrue(len(line) < 73)
예제 #8
0
    def test_multiline_cover_letter_subject(self):
        """
        Assert patches with multi-line subjects are sanitized to have single-line
        subjects in the cover letter.
        """
        gitlab = gitlab_module.Gitlab("https://gitlab",
                                      private_token="iaxMadvFyRCFRFH1CkW6",
                                      ssl_verify=False)
        project = gitlab.projects.get(1)
        merge_request = project.mergerequests.get(2)

        emails = gitlab2email._prepare_emails(gitlab, self.forge, project,
                                              merge_request)

        self.assertEqual(3, len(emails))
        for email in emails:
            self.assertEqual(1, len(email.message()["Subject"].splitlines()))
예제 #9
0
    def test_ccs_not_filtered(self, mock_make_msgid):
        """
        Assert a merge request with "Cc:" tags that don't match the filter
        are ignored.
        """
        mock_make_msgid.return_value = "<*****@*****.**>"
        gitlab = gitlab_module.Gitlab("https://gitlab",
                                      private_token="iaxMadvFyRCFRFH1CkW6",
                                      ssl_verify=False)
        project = gitlab.projects.get(1)
        merge_request = project.mergerequests.get(1)

        emails = gitlab2email._prepare_emails(gitlab, self.forge, project,
                                              merge_request)

        self.assertEqual(1, len(emails))
        self.assertEqual([], emails[0].cc)
예제 #10
0
    def test_ccs(self, mock_make_msgid):
        """
        Assert a merge request with "Cc:" tags result in Ccing those users and
        the author.
        """
        mock_make_msgid.return_value = "<*****@*****.**>"
        gitlab = gitlab_module.Gitlab("https://gitlab",
                                      private_token="iaxMadvFyRCFRFH1CkW6",
                                      ssl_verify=False)
        project = gitlab.projects.get(1)
        merge_request = project.mergerequests.get(1)

        emails = gitlab2email._prepare_emails(gitlab, self.forge, project,
                                              merge_request)

        self.assertEqual(1, len(emails))
        self.assertEqual(sorted(["*****@*****.**", "*****@*****.**"]),
                         sorted(emails[0].cc))
예제 #11
0
    def test_no_patch_prefix(self, mock_make_msgid):
        """
        Assert if gitlab starts generating patches without [PATCH] we don't
        mangle the subject. The recorded web response has been edited to remove
        the subject prefix.
        """

        mock_make_msgid.return_value = "<*****@*****.**>"
        gitlab = gitlab_module.Gitlab("https://gitlab",
                                      private_token="iaxMadvFyRCFRFH1CkW6",
                                      ssl_verify=False)
        project = gitlab.projects.get(1)
        merge_request = project.mergerequests.get(1)

        emails = gitlab2email._prepare_emails(gitlab, self.forge, project,
                                              merge_request)

        self.assertEqual(1, len(emails))
        self.assertEqual(SINGLE_COMMIT_MR, emails[0].message().as_string())
예제 #12
0
    def test_patches_filtered_subject(self):
        """
        Assert if a patch gets filtered due to the project's subject
        filtering, we log an error so the admin knows what to do and raise an
        exception
        """
        self.project.subject_match = r"\[THIS FILTERS OUR PATCHES\]"
        self.project.save()
        project = self.gitlab.projects.get(1)
        merge_request = project.mergerequests.get(1)
        emails = gitlab2email._prepare_emails(self.gitlab, self.forge,
                                              self.project, merge_request)

        self.assertRaises(
            pw_models.Submission.DoesNotExist,
            gitlab2email._record_bridging,
            self.forge.project.listid,
            1,
            emails[0],
        )
예제 #13
0
    def test_multi_commit_mr(self, mock_make_msgid, mock_formatdate):
        """
        Assert a merge request with multiple commits results in an email series
        with a cover letter.
        """
        mock_formatdate.return_value = "Thu, 24 Oct 2019 19:15:26 -0000"
        mock_make_msgid.side_effect = (
            "<*****@*****.**>",
            "<*****@*****.**>",
            "<*****@*****.**>",
        )
        gitlab = gitlab_module.Gitlab("https://gitlab",
                                      private_token="iaxMadvFyRCFRFH1CkW6",
                                      ssl_verify=False)
        project = gitlab.projects.get(1)
        merge_request = project.mergerequests.get(2)

        emails = gitlab2email._prepare_emails(gitlab, self.forge, project,
                                              merge_request)

        self.assertEqual(3, len(emails))
        for email, expected_email in zip(emails, MULTI_COMMIT_MR):
            self.assertEqual(expected_email, email.message().as_string())