PullRequest.py
1 ############################ Copyrights and license ############################ 2 # # 3 # Copyright 2012 Vincent Jacques <vincent@vincent-jacques.net> # 4 # Copyright 2012 Zearin <zearin@gonk.net> # 5 # Copyright 2013 Vincent Jacques <vincent@vincent-jacques.net> # 6 # Copyright 2014 Vincent Jacques <vincent@vincent-jacques.net> # 7 # Copyright 2016 @tmshn <tmshn@r.recruit.co.jp> # 8 # Copyright 2016 Jannis Gebauer <ja.geb@me.com> # 9 # Copyright 2016 Peter Buckley <dx-pbuckley@users.noreply.github.com> # 10 # Copyright 2018 MarcoFalke <falke.marco@gmail.com> # 11 # Copyright 2018 Steve Kowalik <steven@wedontsleep.org> # 12 # Copyright 2018 sfdye <tsfdye@gmail.com> # 13 # # 14 # This file is part of PyGithub. # 15 # http://pygithub.readthedocs.io/ # 16 # # 17 # PyGithub is free software: you can redistribute it and/or modify it under # 18 # the terms of the GNU Lesser General Public License as published by the Free # 19 # Software Foundation, either version 3 of the License, or (at your option) # 20 # any later version. # 21 # # 22 # PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY # 23 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # 24 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # 25 # details. # 26 # # 27 # You should have received a copy of the GNU Lesser General Public License # 28 # along with PyGithub. If not, see <http://www.gnu.org/licenses/>. # 29 # # 30 ################################################################################ 31 32 from datetime import datetime, timezone 33 34 from . import Framework 35 36 37 class PullRequest(Framework.TestCase): 38 def setUp(self): 39 super().setUp() 40 self.repo = self.g.get_repo("PyGithub/PyGithub") 41 self.pull = self.repo.get_pull(31) 42 43 marco_repo = self.g.get_repo("MarcoFalke/PyGithub", lazy=True) 44 self.pullIssue256Closed = marco_repo.get_pull(1) 45 self.pullIssue256Merged = marco_repo.get_pull(2) 46 self.pullIssue256Conflict = marco_repo.get_pull(3) 47 self.pullIssue256Uncached = marco_repo.get_pull(4) 48 49 flo_repo = self.g.get_repo("FlorentClarret/PyGithub") 50 self.pullMaintainerCanModify = flo_repo.get_pull(2) 51 52 def testAttributesIssue256(self): 53 self.assertEqual( 54 self.pullIssue256Closed.closed_at, 55 datetime(2018, 5, 22, 14, 50, 43, tzinfo=timezone.utc), 56 ) 57 self.assertEqual( 58 self.pullIssue256Merged.closed_at, 59 datetime(2018, 5, 22, 14, 53, 13, tzinfo=timezone.utc), 60 ) 61 self.assertEqual(self.pullIssue256Conflict.closed_at, None) 62 self.assertEqual(self.pullIssue256Uncached.closed_at, None) 63 64 self.assertEqual(self.pullIssue256Closed.state, "closed") 65 self.assertEqual(self.pullIssue256Merged.state, "closed") 66 self.assertEqual(self.pullIssue256Conflict.state, "open") 67 self.assertEqual(self.pullIssue256Uncached.state, "open") 68 69 self.assertFalse(self.pullIssue256Closed.merged) 70 self.assertTrue(self.pullIssue256Merged.merged) 71 self.assertFalse(self.pullIssue256Conflict.merged) 72 self.assertFalse(self.pullIssue256Uncached.merged) 73 74 self.assertEqual(self.pullIssue256Closed.mergeable, None) 75 self.assertEqual(self.pullIssue256Merged.mergeable, None) 76 self.assertTrue(self.pullIssue256Conflict.mergeable) 77 self.assertEqual(self.pullIssue256Uncached.mergeable, None) 78 79 self.assertEqual(self.pullIssue256Closed.mergeable_state, "unknown") 80 self.assertEqual(self.pullIssue256Merged.mergeable_state, "unknown") 81 self.assertEqual(self.pullIssue256Conflict.mergeable_state, "clean") 82 self.assertEqual(self.pullIssue256Uncached.mergeable_state, "unknown") 83 84 def testAttributes(self): 85 self.assertEqual(self.pull.additions, 511) 86 self.assertEqual(self.pull.assignee.login, "jacquev6") 87 self.assertListKeyEqual(self.pull.assignees, lambda a: a.login, ["jacquev6"]) 88 self.assertEqual(self.pull.base.label, "PyGithub:topic/RewriteWithGeneratedCode") 89 self.assertEqual(self.pull.base.sha, "ed866fc43833802ab553e5ff8581c81bb00dd433") 90 self.assertEqual(self.pull.base.user.login, "PyGithub") 91 self.assertEqual(self.pull.base.ref, "topic/RewriteWithGeneratedCode") 92 self.assertEqual(self.pull.base.repo.full_name, "PyGithub/PyGithub") 93 self.assertEqual(self.pull.body, "Body edited by PyGithub\n") 94 self.assertEqual(self.pull.changed_files, 45) 95 self.assertEqual( 96 self.pull.closed_at, 97 datetime(2012, 5, 27, 10, 29, 7, tzinfo=timezone.utc), 98 ) 99 self.assertEqual(self.pull.comments, 1) 100 self.assertEqual(self.pull.commits, 3) 101 self.assertEqual( 102 self.pull.created_at, 103 datetime(2012, 5, 27, 9, 25, 36, tzinfo=timezone.utc), 104 ) 105 self.assertEqual(self.pull.deletions, 384) 106 self.assertEqual(self.pull.diff_url, "https://github.com/PyGithub/PyGithub/pull/31.diff") 107 self.assertEqual(self.pull.head.ref, "master") 108 self.assertEqual(self.pull.html_url, "https://github.com/PyGithub/PyGithub/pull/31") 109 self.assertEqual(self.pull.id, 1436215) 110 self.assertEqual( 111 self.pull.issue_url, 112 "https://api.github.com/repos/PyGithub/PyGithub/issues/31", 113 ) 114 self.assertListKeyEqual(self.pull.labels, lambda a: a.name, []) 115 self.assertFalse(self.pull.mergeable) 116 self.assertFalse(self.pull.rebaseable) 117 self.assertTrue(self.pull.merged) 118 self.assertEqual( 119 self.pull.merged_at, 120 datetime(2012, 5, 27, 10, 29, 7, tzinfo=timezone.utc), 121 ) 122 self.assertEqual(self.pull.merged_by.login, "jacquev6") 123 self.assertEqual(self.pull.number, 31) 124 self.assertEqual(self.pull.patch_url, "https://github.com/PyGithub/PyGithub/pull/31.patch") 125 self.assertEqual(self.pull.review_comments, 2) 126 self.assertEqual(self.pull.state, "closed") 127 self.assertEqual(self.pull.title, "Title edited by PyGithub") 128 self.assertEqual( 129 self.pull.updated_at, 130 datetime(2018, 6, 25, 12, 54, 43, tzinfo=timezone.utc), 131 ) 132 self.assertEqual(self.pull.url, "https://api.github.com/repos/PyGithub/PyGithub/pulls/31") 133 self.assertEqual(self.pull.user.login, "jacquev6") 134 self.assertEqual(self.pull.draft, False) 135 self.assertEqual(self.pull.maintainer_can_modify, False) 136 self.assertEqual( 137 repr(self.pull), 138 'PullRequest(title="Title edited by PyGithub", number=31)', 139 ) 140 self.assertEqual( 141 repr(self.pull.base), 142 'PullRequestPart(sha="ed866fc43833802ab553e5ff8581c81bb00dd433")', 143 ) 144 self.assertTrue(self.pullIssue256Conflict.rebaseable) 145 146 def testCreateComment(self): 147 commit = self.repo.get_commit("8a4f306d4b223682dd19410d4a9150636ebe4206") 148 comment = self.pull.create_comment("Comment created by PyGithub", commit, "src/github/Issue.py", 5) 149 self.assertEqual(comment.id, 886298) 150 151 def testCreateReviewCommentInReplyTo(self): 152 commit = self.repo.get_commit("8a4f306d4b223682dd19410d4a9150636ebe4206") 153 comment = self.pull.create_review_comment( 154 "Comment created by PyGithub", 155 commit, 156 "src/github/Issue.py", 157 5, 158 in_reply_to=42, 159 ) 160 self.assertEqual(comment.id, 886298) 161 162 def testCreateReviewCommentSubjectType(self): 163 commit = self.repo.get_commit("8a4f306d4b223682dd19410d4a9150636ebe4206") 164 comment = self.pull.create_review_comment( 165 "Comment created by PyGithub", 166 commit, 167 "src/github/Issue.py", 168 5, 169 subject_type="file", 170 ) 171 self.assertEqual(comment.id, 886298) 172 173 def testCreateMultilineReviewComment(self): 174 commit = self.repo.get_commit("8a4f306d4b223682dd19410d4a9150636ebe4206") 175 comment = self.pull.create_review_comment( 176 "Comment created by PyGithub", 177 commit, 178 "src/github/Issue.py", 179 10, 180 start_line=5, 181 ) 182 self.assertEqual(comment.id, 886298) 183 184 def testCreateMultilineReviewCommentAsSuggestion(self): 185 commit = self.repo.get_commit("8a4f306d4b223682dd19410d4a9150636ebe4206") 186 comment = self.pull.create_review_comment( 187 "Comment created by PyGithub", 188 commit, 189 "src/github/Issue.py", 190 10, 191 start_line=5, 192 as_suggestion=True, 193 ) 194 self.assertEqual(comment.id, 886298) 195 self.assertEqual(comment.body, "```suggestion\nComment created by PyGithub\n```") 196 197 def testCreateMultilineReviewCommentChoosingSide(self): 198 commit = self.repo.get_commit("8a4f306d4b223682dd19410d4a9150636ebe4206") 199 comment = self.pull.create_review_comment( 200 "Comment created by PyGithub", 201 commit, 202 "src/github/Issue.py", 203 10, 204 start_line=5, 205 side="RIGHT", 206 start_side="RIGHT", 207 ) 208 self.assertEqual(comment.id, 886298) 209 210 def testGetComments(self): 211 epoch = datetime(1970, 1, 1, 0, 0) 212 comments = self.pull.get_comments(sort="updated", direction="desc", since=epoch) 213 self.assertListKeyEqual(comments, lambda c: c.id, [197784357, 1580134]) 214 215 def testCreateIssueComment(self): 216 comment = self.pull.create_issue_comment("Issue comment created by PyGithub") 217 self.assertEqual(comment.id, 8387331) 218 219 def testGetIssueComments(self): 220 self.assertListKeyEqual(self.pull.get_issue_comments(), lambda c: c.id, [8387331]) 221 222 def testGetIssueComment(self): 223 comment = self.pull.get_issue_comment(8387331) 224 self.assertEqual(comment.body, "Issue comment created by PyGithub") 225 226 def testGetIssueEvents(self): 227 self.assertListKeyEqual( 228 self.pull.get_issue_events(), 229 lambda e: e.id, 230 [16349963, 16350729, 16350730, 16350731, 28469043, 98136335], 231 ) 232 233 def testGetReviewComments(self): 234 epoch = datetime(1970, 1, 1, 0, 0) 235 comments = self.pull.get_review_comments(sort="updated", direction="desc", since=epoch) 236 self.assertListKeyEqual(comments, lambda c: c.id, [197784357, 1580134]) 237 238 def testReviewRequests(self): 239 self.pull.create_review_request(reviewers="sfdye", team_reviewers="pygithub-owners") 240 review_requests = self.pull.get_review_requests() 241 self.assertListKeyEqual(review_requests[0], lambda c: c.login, ["sfdye"]) 242 self.assertListKeyEqual(review_requests[1], lambda c: c.slug, ["pygithub-owners"]) 243 self.pull.delete_review_request(reviewers="sfdye") 244 review_requests = self.pull.get_review_requests() 245 self.assertEqual(list(review_requests[0]), []) 246 self.assertListKeyEqual(review_requests[1], lambda c: c.slug, ["pygithub-owners"]) 247 248 def testEditWithoutArguments(self): 249 self.pull.edit() 250 251 def testEditWithAllArguments(self): 252 self.pullMaintainerCanModify.edit( 253 "Title edited by PyGithub", 254 "Body edited by PyGithub", 255 "open", 256 "master", 257 True, 258 ) 259 self.assertEqual(self.pullMaintainerCanModify.title, "Title edited by PyGithub") 260 self.assertEqual(self.pullMaintainerCanModify.body, "Body edited by PyGithub") 261 self.assertEqual(self.pullMaintainerCanModify.state, "open") 262 self.assertEqual(self.pullMaintainerCanModify.base.ref, "master") 263 self.assertTrue(self.pullMaintainerCanModify.maintainer_can_modify) 264 265 def testGetCommits(self): 266 self.assertListKeyEqual( 267 self.pull.get_commits(), 268 lambda c: c.sha, 269 [ 270 "4aadfff21cdd2d2566b0e4bd7309c233b5f4ae23", 271 "93dcae5cf207de376c91d0599226e7c7563e1d16", 272 "8a4f306d4b223682dd19410d4a9150636ebe4206", 273 ], 274 ) 275 276 def testGetFiles(self): 277 self.assertListKeyEqual( 278 self.pull.get_files(), 279 lambda f: f.filename, 280 [ 281 "codegen/templates/GithubObject.py", 282 "src/github/AuthenticatedUser.py", 283 "src/github/Authorization.py", 284 "src/github/Branch.py", 285 "src/github/Commit.py", 286 "src/github/CommitComment.py", 287 "src/github/CommitFile.py", 288 "src/github/CommitStats.py", 289 "src/github/Download.py", 290 "src/github/Event.py", 291 "src/github/Gist.py", 292 "src/github/GistComment.py", 293 "src/github/GistHistoryState.py", 294 "src/github/GitAuthor.py", 295 "src/github/GitBlob.py", 296 "src/github/GitCommit.py", 297 "src/github/GitObject.py", 298 "src/github/GitRef.py", 299 "src/github/GitTag.py", 300 "src/github/GitTree.py", 301 "src/github/GitTreeElement.py", 302 "src/github/Hook.py", 303 "src/github/Issue.py", 304 "src/github/IssueComment.py", 305 "src/github/IssueEvent.py", 306 "src/github/Label.py", 307 "src/github/Milestone.py", 308 "src/github/NamedUser.py", 309 "src/github/Organization.py", 310 "src/github/Permissions.py", 311 "src/github/Plan.py", 312 "src/github/PullRequest.py", 313 "src/github/PullRequestComment.py", 314 "src/github/PullRequestFile.py", 315 "src/github/Repository.py", 316 "src/github/RepositoryKey.py", 317 "src/github/Tag.py", 318 "src/github/Team.py", 319 "src/github/UserKey.py", 320 "test/Issue.py", 321 "test/IssueEvent.py", 322 "test/ReplayData/Issue.testAddAndRemoveLabels.txt", 323 "test/ReplayData/Issue.testDeleteAndSetLabels.txt", 324 "test/ReplayData/Issue.testGetLabels.txt", 325 "test/ReplayData/IssueEvent.setUp.txt", 326 ], 327 ) 328 329 def testGetLabels(self): 330 self.assertListKeyEqual(self.pull.get_labels(), lambda l: l.name, ["wip", "refactoring"]) 331 332 def testAddAndRemoveLabels(self): 333 wip = self.repo.get_label("wip") 334 refactoring = self.repo.get_label("refactoring") 335 self.assertListKeyEqual( 336 self.pull.get_labels(), 337 lambda l: l.name, 338 ["wip", "refactoring", "improvement"], 339 ) 340 self.pull.remove_from_labels(wip) 341 self.assertListKeyEqual(self.pull.get_labels(), lambda l: l.name, ["refactoring", "improvement"]) 342 self.pull.remove_from_labels(refactoring) 343 self.assertListKeyEqual(self.pull.get_labels(), lambda l: l.name, ["improvement"]) 344 self.pull.add_to_labels(wip, refactoring) 345 self.assertListKeyEqual( 346 self.pull.get_labels(), 347 lambda l: l.name, 348 ["wip", "refactoring", "improvement"], 349 ) 350 351 def testAddAndRemoveLabelsWithStringArguments(self): 352 wip = "wip" 353 refactoring = "refactoring" 354 self.assertListKeyEqual( 355 self.pull.get_labels(), 356 lambda l: l.name, 357 ["wip", "refactoring", "improvement"], 358 ) 359 self.pull.remove_from_labels(wip) 360 self.assertListKeyEqual(self.pull.get_labels(), lambda l: l.name, ["refactoring", "improvement"]) 361 self.pull.remove_from_labels(refactoring) 362 self.assertListKeyEqual(self.pull.get_labels(), lambda l: l.name, ["improvement"]) 363 self.pull.add_to_labels(wip, refactoring) 364 self.assertListKeyEqual( 365 self.pull.get_labels(), 366 lambda l: l.name, 367 ["wip", "refactoring", "improvement"], 368 ) 369 370 def testDeleteAndSetLabels(self): 371 wip = self.repo.get_label("wip") 372 refactoring = self.repo.get_label("refactoring") 373 self.assertListKeyEqual( 374 self.pull.get_labels(), 375 lambda l: l.name, 376 ["wip", "refactoring", "improvement"], 377 ) 378 self.pull.delete_labels() 379 self.assertListKeyEqual(self.pull.get_labels(), None, []) 380 self.pull.set_labels(wip, refactoring) 381 self.assertListKeyEqual(self.pull.get_labels(), lambda l: l.name, ["wip", "refactoring"]) 382 383 def testDeleteAndSetLabelsWithStringArguments(self): 384 wip = "wip" 385 refactoring = "refactoring" 386 self.assertListKeyEqual( 387 self.pull.get_labels(), 388 lambda l: l.name, 389 ["wip", "refactoring", "improvement"], 390 ) 391 self.pull.delete_labels() 392 self.assertListKeyEqual(self.pull.get_labels(), None, []) 393 self.pull.set_labels(wip, refactoring) 394 self.assertListKeyEqual(self.pull.get_labels(), lambda l: l.name, ["wip", "refactoring"]) 395 396 def testMerge(self): 397 self.assertFalse(self.pull.is_merged()) 398 status = self.pull.merge() 399 self.assertEqual(status.sha, "688208b1a5a074871d0e9376119556897439697d") 400 self.assertTrue(status.merged) 401 self.assertEqual(status.message, "Pull Request successfully merged") 402 self.assertTrue(self.pull.is_merged()) 403 self.assertEqual( 404 repr(status), 405 'PullRequestMergeStatus(sha="688208b1a5a074871d0e9376119556897439697d", merged=True)', 406 ) 407 408 def testMergeWithCommitMessage(self): 409 self.repo.get_pull(39).merge("Custom commit message created by PyGithub") 410 411 def testAddAndRemoveAssignees(self): 412 user1 = "jayfk" 413 user2 = self.g.get_user("jzelinskie") 414 self.assertListKeyEqual(self.pull.assignees, lambda a: a.login, ["jacquev6"]) 415 url = self.pull.url 416 self.pull.add_to_assignees(user1, user2) 417 self.assertListKeyEqual( 418 self.pull.assignees, 419 lambda a: a.login, 420 ["jacquev6", "stuglaser", "jayfk", "jzelinskie"], 421 ) 422 self.assertEqual(self.pull.url, url) 423 self.pull.remove_from_assignees(user1, user2) 424 self.assertListKeyEqual(self.pull.assignees, lambda a: a.login, ["jacquev6", "stuglaser"]) 425 self.assertEqual(self.pull.url, url) 426 427 def testUpdateBranch(self): 428 self.assertTrue(self.pull.update_branch("addaebea821105cf6600441f05ff2b413ab21a36")) 429 self.assertTrue(self.pull.update_branch())