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))
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())
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())
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()))
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())
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, )
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)
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()))
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)
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))
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())
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], )
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())