Example #1
0
 def test_html_body_assigns_to_first(self):
     pull_request = build(builder.pull_request().author(
         builder.user("github_test_user_login")).url(
             "https://foo.bar/baz").body("BODY").assignees([
                 builder.user("github_assignee_login_billy"),
                 builder.user("github_assignee_login_annie"),
             ]))
     task_fields = src.asana.helpers.extract_task_fields_from_pull_request(
         pull_request)
     actual = task_fields["html_notes"]
     expected_strings = [
         "<body>",
         "<em>",
         "This is a one-way sync from GitHub to Asana. Do not edit this task or comment on it!",
         "</em>",
         "\uD83D\uDD17",
         '<A href="https://foo.bar/baz">https://foo.bar/baz</A>',
         "✍",
         "TEST_USER_ASANA_DOMAIN_USER_ID",
         "first assignee alphabetically",
         "<strong>",
         "Description:",
         "</strong>",
         "BODY",
         "</body>",
     ]
     self.assertContainsStrings(actual, expected_strings)
Example #2
0
 def test_assignee_returns_first_assignee_by_login_if_many(self):
     pull_request = build(builder.pull_request().assignees([
         builder.user("github_assignee_login_billy"),
         builder.user("github_assignee_login_annie"),
     ]))
     task_fields = src.asana.helpers.extract_task_fields_from_pull_request(
         pull_request)
     self.assertEqual("ANNIE_ASANA_DOMAIN_USER_ID", task_fields["assignee"])
 def test_pull_request_commenters(self):
     pull_request = build(builder.pull_request().comments([
         builder.comment().author(builder.user().login("foo")),
         builder.comment().author(builder.user().login("bar")),
     ]))
     self.assertEqual(
         github_logic._pull_request_commenters(pull_request),
         ["bar", "foo"],  # sorted
     )
 def test_is_pull_request_ready_for_automerge_after_approval_approved_and_requested_changes(
     self, ):
     author_1 = builder.user().login("author_1")
     author_2 = builder.user().login("author_2")
     pull_request = build(builder.pull_request().commit(
         builder.commit().status(Commit.BUILD_SUCCESSFUL)).reviews([
             builder.review().submitted_at("2020-01-11T14:59:58Z").state(
                 ReviewState.CHANGES_REQUESTED).author(author_1),
             builder.review().submitted_at("2020-01-12T14:59:58Z").state(
                 ReviewState.APPROVED).author(author_2),
         ]).mergeable(MergeableState.MERGEABLE).merged(False).label(
             builder.label().name(github_logic.AutomergeLabel.
                                  AFTER_TESTS_AND_APPROVAL.value)))
     self.assertFalse(
         github_logic._is_pull_request_ready_for_automerge(pull_request))
 def test_includes_asana_comment_author(self):
     github_comment = build(builder.comment().author(
         builder.user("github_test_user_login")))
     asana_comment = src.asana.helpers.asana_comment_from_github_comment(
         github_comment)
     self.assertContainsStrings(asana_comment,
                                ["TEST_USER_ASANA_DOMAIN_USER_ID"])
Example #6
0
 def test_includes_asana_review_comment_author(self):
     github_review = build(builder.review().author(
         builder.user("github_test_user_login")).state(ReviewState.DEFAULT))
     asana_review_comment = src.asana.helpers.asana_comment_from_github_review(
         github_review)
     self.assertContainsStrings(asana_review_comment,
                                ["TEST_USER_ASANA_DOMAIN_USER_ID"])
 def test_handles_at_sign_in_comment_gracefully(self):
     github_comment = build(builder.comment().author(
         builder.user("github_unknown_user_login")).body(
             "*****@*****.**"))
     asana_comment = src.asana.helpers.asana_comment_from_github_comment(
         github_comment)
     self.assertContainsStrings(asana_comment, ["*****@*****.**"])
Example #8
0
 def test_assignee_returns_author_when_assignees_are_empty(self):
     pull_request = build(builder.pull_request().author(
         builder.user("github_test_user_login")))
     task_fields = src.asana.helpers.extract_task_fields_from_pull_request(
         pull_request)
     self.assertEqual("TEST_USER_ASANA_DOMAIN_USER_ID",
                      task_fields["assignee"])
Example #9
0
 def test_author_is_a_follower(self):
     pull_request = build(builder.pull_request().author(
         builder.user("github_test_user_login")))
     task_fields = src.asana.helpers.extract_task_fields_from_pull_request(
         pull_request)
     self.assertIn("TEST_USER_ASANA_DOMAIN_USER_ID",
                   task_fields["followers"])
 def test_includes_comment_text(self):
     github_comment = build(builder.comment().author(
         builder.user("github_unknown_user_login")).body(
             "GITHUB_COMMENT_TEXT"))
     asana_comment = src.asana.helpers.asana_comment_from_github_comment(
         github_comment)
     self.assertContainsStrings(asana_comment, ["GITHUB_COMMENT_TEXT"])
 def test_handles_non_asana_comment_author_that_has_no_name_gracefully(
         self):
     github_comment = build(builder.comment().author(
         builder.user("github_unknown_user_login")))
     asana_comment = src.asana.helpers.asana_comment_from_github_comment(
         github_comment)
     self.assertContainsStrings(asana_comment,
                                ["github_unknown_user_login"])
Example #12
0
 def test_handles_at_sign_in_review_gracefully(self):
     github_review = build(builder.review().author(
         builder.user("github_unknown_user_login")).state(
             ReviewState.DEFAULT).body("*****@*****.**"))
     asana_review_comment = src.asana.helpers.asana_comment_from_github_review(
         github_review)
     self.assertContainsStrings(asana_review_comment,
                                ["*****@*****.**"])
Example #13
0
 def test_transforms_github_at_mentions_to_asana_at_mentions(self):
     github_review = build(builder.review().author(
         builder.user("github_unknown_user_login")).state(
             ReviewState.DEFAULT).body("@github_test_user_login"))
     asana_review_comment = src.asana.helpers.asana_comment_from_github_review(
         github_review)
     self.assertContainsStrings(asana_review_comment,
                                ["TEST_USER_ASANA_DOMAIN_USER_ID"])
Example #14
0
 def test_handles_non_asana_review_comment_author_that_has_no_name_gracefully(
         self):
     github_review = build(builder.review().author(
         builder.user("github_unknown_user_login")).state(
             ReviewState.DEFAULT))
     asana_review_comment_comment = src.asana.helpers.asana_comment_from_github_review(
         github_review)
     self.assertContainsStrings(asana_review_comment_comment,
                                ["github_unknown_user_login"])
Example #15
0
 def test_requested_reviewer_is_a_follower(self):
     pull_request = build(builder.pull_request().comments([
         builder.comment().published_at("2020-01-13T14:59:58Z").body(
             "LGTM!"),
     ]).requested_reviewers([builder.user("github_test_user_login")]))
     task_fields = src.asana.helpers.extract_task_fields_from_pull_request(
         pull_request)
     self.assertIn("TEST_USER_ASANA_DOMAIN_USER_ID",
                   task_fields["followers"])
 def test_transforms_urls_from_comment_tect(self):
     url = "https://www.foo.bar/?a=1&b=2"
     github_comment = build(builder.comment().author(
         builder.user("github_unknown_user_login")).body(
             "Can you refer to the documentation at {}".format(url)))
     asana_comment = src.asana.helpers.asana_comment_from_github_comment(
         github_comment)
     self.assertContainsStrings(
         asana_comment, ['<a href="{}">{}</a>'.format(escape(url), url)])
 def test_handles_non_asana_comment_author_gracefully(self):
     github_comment = build(builder.comment().author(
         builder.user("github_unknown_user_login",
                      "GITHUB_UNKNOWN_USER_NAME")))
     asana_comment = src.asana.helpers.asana_comment_from_github_comment(
         github_comment)
     self.assertContainsStrings(
         asana_comment,
         ["github_unknown_user_login", "GITHUB_UNKNOWN_USER_NAME"])
Example #18
0
 def test_reviewer_is_a_follower(self):
     pull_request = build(builder.pull_request().reviews([
         builder.review().submitted_at("2020-02-13T14:59:57Z").state(
             ReviewState.CHANGES_REQUESTED).body("LGTM!").author(
                 builder.user("github_test_user_login"))
     ]))
     task_fields = src.asana.helpers.extract_task_fields_from_pull_request(
         pull_request)
     self.assertIn("TEST_USER_ASANA_DOMAIN_USER_ID",
                   task_fields["followers"])
Example #19
0
 def test_includes_review_text(self):
     github_review = build(builder.review().author(
         builder.user("github_unknown_user_login")).state(
             ReviewState.DEFAULT).body("GITHUB_REVIEW_TEXT").comment(
                 builder.comment().body("GITHUB_REVIEW_COMMENT_TEXT")))
     asana_review_comment = src.asana.helpers.asana_comment_from_github_review(
         github_review)
     self.assertContainsStrings(
         asana_review_comment,
         ["GITHUB_REVIEW_TEXT", "GITHUB_REVIEW_COMMENT_TEXT"])
Example #20
0
 def test_handles_non_asana_review_comment_author_gracefully(self):
     github_review = build(builder.review().author(
         builder.user("github_unknown_user_login",
                      "GITHUB_UNKNOWN_USER_NAME")).state(
                          ReviewState.DEFAULT))
     asana_review_comment = src.asana.helpers.asana_comment_from_github_review(
         github_review)
     self.assertContainsStrings(
         asana_review_comment,
         ["github_unknown_user_login", "GITHUB_UNKNOWN_USER_NAME"],
     )
 def test_does_not_inject_unsafe_html(self):
     placeholder = "💣"
     github_placeholder_comment = build(builder.comment().author(
         builder.user("github_unknown_user_login")).body(placeholder))
     asana_placeholder_comment = src.asana.helpers.asana_comment_from_github_comment(
         github_placeholder_comment)
     unsafe_characters = ["&", "<", ">"]
     for unsafe_character in unsafe_characters:
         github_comment = build(builder.comment().author(
             builder.user("github_unknown_user_login")).body(
                 unsafe_character))
         asana_comment = src.asana.helpers.asana_comment_from_github_comment(
             github_comment)
         unexpected = asana_placeholder_comment.replace(
             placeholder, unsafe_character)
         self.assertNotEqual(
             asana_comment,
             unexpected,
             f"Expected the {unsafe_character} character to be escaped",
         )
Example #22
0
    def test_does_not_add_warning_if_has_label_and_already_has_warning_in_comments(
            self, add_pr_comment_mock, edit_pr_title_mock):
        pull_request = build(builder.pull_request().comments([
            builder.comment().author(
                builder.user("github_unknown_user_login")).body(
                    github_logic.AUTOMERGE_COMMENT_WARNING)
        ]).label(builder.label().name(
            github_logic.AutomergeLabel.AFTER_TESTS_AND_APPROVAL.value)))

        github_logic.maybe_add_automerge_warning_comment(pull_request)

        edit_pr_title_mock.assert_not_called()
        add_pr_comment_mock.assert_not_called()
Example #23
0
 def test_converts_urls_to_links(self):
     github_review = build(builder.review().author(
         builder.user("github_unknown_user_login")).state(
             ReviewState.DEFAULT).body("https://www.asana.com").comment(
                 builder.comment().body("http://www.foo.com")))
     asana_review_comment = src.asana.helpers.asana_comment_from_github_review(
         github_review)
     self.assertContainsStrings(
         asana_review_comment,
         [
             '<a href="{}">{}</a>'.format(url, url)
             for url in ["https://www.asana.com", "http://www.foo.com"]
         ],
     )
Example #24
0
 def test_considers_double_quotes_safe_in_review_text(self):
     placeholder = "💣"
     github_placeholder_review = build(builder.review().author(
         builder.user("github_unknown_user_login")).state(
             ReviewState.DEFAULT).body(placeholder).comment(
                 builder.comment().body(placeholder)))
     asana_placeholder_review = src.asana.helpers.asana_comment_from_github_review(
         github_placeholder_review)
     safe_characters = ['"', "'"]
     for safe_character in safe_characters:
         github_review = build(builder.review().author(
             builder.user("github_unknown_user_login")).state(
                 ReviewState.DEFAULT).body(safe_character).comment(
                     builder.comment().body(safe_character)))
         asana_review_comment = src.asana.helpers.asana_comment_from_github_review(
             github_review)
         expected = asana_placeholder_review.replace(
             placeholder, safe_character)
         self.assertEqual(
             asana_review_comment,
             expected,
             f"Did not expected the {safe_character} character to be escaped",
         )
Example #25
0
    def test_assign_pull_request_to_author(self, set_pr_assignee_mock):
        user = builder.user().login("the_author").name("dont-care")
        pull_request = builder.pull_request().author(user).build()
        with patch.object(pull_request, "set_assignees") as set_assignees_mock:
            github_controller.assign_pull_request_to_author(pull_request)
            set_assignees_mock.assert_called_with(
                [pull_request.author_handle()])

        set_pr_assignee_mock.assert_called_with(
            pull_request.repository_owner_handle(),
            pull_request.repository_name(),
            pull_request.number(),
            pull_request.author_handle(),
        )
Example #26
0
 def test_non_asana_user_is_not_a_follower(self):
     unknown_github_user = build(
         builder.user("github_unknown_user_login",
                      "GITHUB_UNKNOWN_USER_NAME"))
     pull_request = build(
         builder.pull_request().body("@github_unknown_user_login").
         author(unknown_github_user).assignee(unknown_github_user).review(
             builder.review().body("@github_unknown_user_login").author(
                 unknown_github_user)).comment(
                     builder.comment().body("@github_unknown_user_login").
                     author(unknown_github_user)).requested_reviewer(
                         unknown_github_user))
     task_fields = src.asana.helpers.extract_task_fields_from_pull_request(
         pull_request)
     self.assertEqual(0, len(task_fields["followers"]))
Example #27
0
 def test_html_body_status_closed_not_merged(self):
     pull_request = build(builder.pull_request().author(
         builder.user("github_test_user_login")).url(
             "https://foo.bar/baz").body("BODY").closed(True).merged(False))
     task_fields = src.asana.helpers.extract_task_fields_from_pull_request(
         pull_request)
     actual = task_fields["html_notes"]
     expected_strings = [
         "<body>",
         "closed",
         "the pull request was closed without merging code.",
         "BODY",
         "</body>",
     ]
     self.assertContainsStrings(actual, expected_strings)
Example #28
0
 def test_handles_no_review_text(self):
     github_review = build(builder.review().author(
         builder.user("github_unknown_user_login")).state(
             ReviewState.APPROVED).body("").comment(
                 builder.comment().body("GITHUB_REVIEW_COMMENT_TEXT")))
     asana_review_comment = src.asana.helpers.asana_comment_from_github_review(
         github_review)
     self.assertContainsStrings(
         asana_review_comment,
         [
             "GitHub user 'github_unknown_user_login'",
             "approved",
             "and left inline comments:",
             "GITHUB_REVIEW_COMMENT_TEXT",
         ],
     )
Example #29
0
 def test_html_body_status_closed_approved_before(self,
                                                  approved_before_merging):
     approved_before_merging.return_value = True
     pull_request = build(builder.pull_request().author(
         builder.user("github_test_user_login")).url(
             "https://foo.bar/baz").body("BODY").closed(True).merged(True))
     task_fields = src.asana.helpers.extract_task_fields_from_pull_request(
         pull_request)
     actual = task_fields["html_notes"]
     expected_strings = [
         "<body>",
         "complete",
         "the pull request was approved before merging.",
         "BODY",
         "</body>",
     ]
     self.assertContainsStrings(actual, expected_strings)
 def test_considers_double_quotes_safe_in_comment_text(self):
     github_author = builder.user("github_unknown_user_login")
     placeholder = "💣"
     github_placeholder_comment = build(
         builder.comment().body(placeholder).author(github_author))
     asana_placeholder_comment = src.asana.helpers.asana_comment_from_github_comment(
         github_placeholder_comment)
     safe_characters = ['"', "'"]
     for safe_character in safe_characters:
         github_comment = build(
             builder.comment().body(safe_character).author(github_author))
         asana_comment = src.asana.helpers.asana_comment_from_github_comment(
             github_comment)
         expected = asana_placeholder_comment.replace(
             placeholder, safe_character)
         self.assertEqual(
             asana_comment,
             expected,
             f"Did not expected the {safe_character} character to be escaped",
         )