/ tests / PullRequest.py
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())