/ tests / Issue.py
Issue.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 Stuart Glaser <stuglaser@gmail.com>                           #
  6  # Copyright 2013 Vincent Jacques <vincent@vincent-jacques.net>                 #
  7  # Copyright 2014 Vincent Jacques <vincent@vincent-jacques.net>                 #
  8  # Copyright 2016 @tmshn <tmshn@r.recruit.co.jp>                                #
  9  # Copyright 2016 Jannis Gebauer <ja.geb@me.com>                                #
 10  # Copyright 2016 Matt Babineau <babineaum@users.noreply.github.com>            #
 11  # Copyright 2016 Peter Buckley <dx-pbuckley@users.noreply.github.com>          #
 12  # Copyright 2017 Nicolas Agustín Torres <nicolastrres@gmail.com>               #
 13  # Copyright 2018 sfdye <tsfdye@gmail.com>                                      #
 14  # Copyright 2019 Nick Campbell <nicholas.j.campbell@gmail.com>                 #
 15  # Copyright 2020 Huan-Cheng Chang <changhc84@gmail.com>                        #
 16  #                                                                              #
 17  # This file is part of PyGithub.                                               #
 18  # http://pygithub.readthedocs.io/                                              #
 19  #                                                                              #
 20  # PyGithub is free software: you can redistribute it and/or modify it under    #
 21  # the terms of the GNU Lesser General Public License as published by the Free  #
 22  # Software Foundation, either version 3 of the License, or (at your option)    #
 23  # any later version.                                                           #
 24  #                                                                              #
 25  # PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY  #
 26  # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS    #
 27  # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more #
 28  # details.                                                                     #
 29  #                                                                              #
 30  # You should have received a copy of the GNU Lesser General Public License     #
 31  # along with PyGithub. If not, see <http://www.gnu.org/licenses/>.             #
 32  #                                                                              #
 33  ################################################################################
 34  
 35  from datetime import datetime, timezone
 36  
 37  from . import Framework
 38  
 39  
 40  class Issue(Framework.TestCase):
 41      def setUp(self):
 42          super().setUp()
 43          self.repo = self.g.get_user().get_repo("PyGithub")
 44          self.issue = self.repo.get_issue(28)
 45  
 46      def testAttributes(self):
 47          self.assertEqual(self.issue.assignee.login, "jacquev6")
 48          self.assertListKeyEqual(self.issue.assignees, lambda a: a.login, ["jacquev6", "stuglaser"])
 49          self.assertEqual(self.issue.body, "Body edited by PyGithub")
 50          self.assertEqual(
 51              self.issue.closed_at,
 52              datetime(2012, 5, 26, 14, 59, 33, tzinfo=timezone.utc),
 53          )
 54          self.assertEqual(self.issue.closed_by.login, "jacquev6")
 55          self.assertEqual(self.issue.comments, 0)
 56          self.assertEqual(
 57              self.issue.comments_url,
 58              "https://github.com/jacquev6/PyGithub/issues/28/comments",
 59          )
 60          self.assertEqual(
 61              self.issue.created_at,
 62              datetime(2012, 5, 19, 10, 38, 23, tzinfo=timezone.utc),
 63          )
 64          self.assertEqual(
 65              self.issue.events_url,
 66              "https://github.com/jacquev6/PyGithub/issues/28/events",
 67          )
 68          self.assertEqual(self.issue.html_url, "https://github.com/jacquev6/PyGithub/issues/28")
 69          self.assertEqual(self.issue.id, 4653757)
 70          self.assertListKeyEqual(
 71              self.issue.labels,
 72              lambda l: l.name,
 73              ["Bug", "Project management", "Question"],
 74          )
 75          self.assertEqual(
 76              self.issue.labels_url,
 77              "https://github.com/jacquev6/PyGithub/issues/28/labels{/name}",
 78          )
 79          self.assertEqual(self.issue.milestone.title, "Version 0.4")
 80          self.assertEqual(self.issue.number, 28)
 81          self.assertEqual(self.issue.pull_request.diff_url, None)
 82          self.assertEqual(self.issue.pull_request.patch_url, None)
 83          self.assertEqual(self.issue.pull_request.html_url, None)
 84          self.assertEqual(self.issue.state, "closed")
 85          self.assertEqual(self.issue.state_reason, "completed")
 86          self.assertEqual(self.issue.title, "Issue created by PyGithub")
 87          self.assertEqual(
 88              self.issue.updated_at,
 89              datetime(2012, 5, 26, 14, 59, 33, tzinfo=timezone.utc),
 90          )
 91          self.assertEqual(self.issue.url, "https://api.github.com/repos/jacquev6/PyGithub/issues/28")
 92          self.assertFalse(self.issue.locked)
 93          self.assertIsNone(self.issue.active_lock_reason)
 94          self.assertEqual(self.issue.user.login, "jacquev6")
 95          self.assertEqual(self.issue.repository.name, "PyGithub")
 96          self.assertEqual(repr(self.issue), 'Issue(title="Issue created by PyGithub", number=28)')
 97  
 98      def testEditWithoutParameters(self):
 99          self.issue.edit()
100  
101      def testEditWithAllParameters(self):
102          user = self.g.get_user("jacquev6")
103          milestone = self.repo.get_milestone(2)
104          self.issue.edit(
105              "Title edited by PyGithub",
106              "Body edited by PyGithub",
107              user,
108              "open",
109              milestone,
110              ["Bug"],
111              ["jacquev6", "stuglaser"],
112          )
113          self.assertEqual(self.issue.assignee.login, "jacquev6")
114          self.assertListKeyEqual(self.issue.assignees, lambda a: a.login, ["jacquev6", "stuglaser"])
115          self.assertEqual(self.issue.body, "Body edited by PyGithub")
116          self.assertEqual(self.issue.state, "open")
117          self.assertEqual(self.issue.title, "Title edited by PyGithub")
118          self.assertListKeyEqual(self.issue.labels, lambda l: l.name, ["Bug"])
119  
120      def testEditResetMilestone(self):
121          self.assertEqual(self.issue.milestone.title, "Version 0.4")
122          self.issue.edit(milestone=None)
123          self.assertEqual(self.issue.milestone, None)
124  
125      def testEditResetAssignee(self):
126          self.assertEqual(self.issue.assignee.login, "jacquev6")
127          self.issue.edit(assignee=None)
128          self.assertEqual(self.issue.assignee, None)
129  
130      def testEditWithStateReasonNotPlanned(self):
131          self.issue.edit(state="closed", state_reason="not_planned")
132          self.assertEqual(self.issue.state, "closed")
133          self.assertEqual(self.issue.state_reason, "not_planned")
134  
135      def testEditWithStateReasonReopened(self):
136          self.issue.edit(state="open", state_reason="reopened")
137          self.assertEqual(self.issue.state, "open")
138          self.assertEqual(self.issue.state_reason, "reopened")
139  
140      def testLock(self):
141          self.issue.lock("resolved")
142  
143      def testUnlock(self):
144          self.issue.unlock()
145  
146      def testCreateComment(self):
147          comment = self.issue.create_comment("Comment created by PyGithub")
148          self.assertEqual(comment.id, 5808311)
149  
150      def testGetComments(self):
151          self.assertListKeyEqual(self.issue.get_comments(), lambda c: c.user.login, ["jacquev6", "roskakori"])
152  
153      def testGetCommentsSince(self):
154          self.assertListKeyEqual(
155              self.issue.get_comments(datetime(2012, 5, 26, 13, 59, 33, tzinfo=timezone.utc)),
156              lambda c: c.user.login,
157              ["jacquev6", "roskakori"],
158          )
159  
160      def testGetEvents(self):
161          self.assertListKeyEqual(self.issue.get_events(), lambda e: e.id, [15819975, 15820048])
162  
163      def testGetLabels(self):
164          self.assertListKeyEqual(
165              self.issue.get_labels(),
166              lambda l: l.name,
167              ["Bug", "Project management", "Question"],
168          )
169  
170      def testAddAndRemoveAssignees(self):
171          user1 = "jayfk"
172          user2 = self.g.get_user("jzelinskie")
173          self.assertListKeyEqual(self.issue.assignees, lambda a: a.login, ["jacquev6", "stuglaser"])
174          self.issue.add_to_assignees(user1, user2)
175          self.assertListKeyEqual(
176              self.issue.assignees,
177              lambda a: a.login,
178              ["jacquev6", "stuglaser", "jayfk", "jzelinskie"],
179          )
180          self.issue.remove_from_assignees(user1, user2)
181          self.assertListKeyEqual(self.issue.assignees, lambda a: a.login, ["jacquev6", "stuglaser"])
182  
183      def testAddAndRemoveLabels(self):
184          bug = self.repo.get_label("Bug")
185          question = self.repo.get_label("Question")
186          self.assertListKeyEqual(
187              self.issue.get_labels(),
188              lambda l: l.name,
189              ["Bug", "Project management", "Question"],
190          )
191          self.issue.remove_from_labels(bug)
192          self.assertListKeyEqual(
193              self.issue.get_labels(),
194              lambda l: l.name,
195              ["Project management", "Question"],
196          )
197          self.issue.remove_from_labels(question)
198          self.assertListKeyEqual(self.issue.get_labels(), lambda l: l.name, ["Project management"])
199          self.issue.add_to_labels(bug, question)
200          self.assertListKeyEqual(
201              self.issue.get_labels(),
202              lambda l: l.name,
203              ["Bug", "Project management", "Question"],
204          )
205  
206      def testAddAndRemoveLabelsWithStringArguments(self):
207          bug = "Bug"
208          question = "Question"
209          self.assertListKeyEqual(
210              self.issue.get_labels(),
211              lambda l: l.name,
212              ["Bug", "Project management", "Question"],
213          )
214          self.issue.remove_from_labels(bug)
215          self.assertListKeyEqual(
216              self.issue.get_labels(),
217              lambda l: l.name,
218              ["Project management", "Question"],
219          )
220          self.issue.remove_from_labels(question)
221          self.assertListKeyEqual(self.issue.get_labels(), lambda l: l.name, ["Project management"])
222          self.issue.add_to_labels(bug, question)
223          self.assertListKeyEqual(
224              self.issue.get_labels(),
225              lambda l: l.name,
226              ["Bug", "Project management", "Question"],
227          )
228  
229      def testDeleteAndSetLabels(self):
230          bug = self.repo.get_label("Bug")
231          question = self.repo.get_label("Question")
232          self.assertListKeyEqual(
233              self.issue.get_labels(),
234              lambda l: l.name,
235              ["Bug", "Project management", "Question"],
236          )
237          self.issue.delete_labels()
238          self.assertListKeyEqual(self.issue.get_labels(), None, [])
239          self.issue.set_labels(bug, question)
240          self.assertListKeyEqual(self.issue.get_labels(), lambda l: l.name, ["Bug", "Question"])
241  
242      def testDeleteAndSetLabelsWithStringArguments(self):
243          bug = "Bug"
244          question = "Question"
245          self.assertListKeyEqual(
246              self.issue.get_labels(),
247              lambda l: l.name,
248              ["Bug", "Project management", "Question"],
249          )
250          self.issue.delete_labels()
251          self.assertListKeyEqual(self.issue.get_labels(), None, [])
252          self.issue.set_labels(bug, question)
253          self.assertListKeyEqual(self.issue.get_labels(), lambda l: l.name, ["Bug", "Question"])
254  
255      def testGetReactions(self):
256          reactions = self.issue.get_reactions()
257          self.assertEqual(reactions[0].content, "+1")
258  
259      def testCreateReaction(self):
260          reaction = self.issue.create_reaction("hooray")
261  
262          self.assertEqual(reaction.id, 16917472)
263          self.assertEqual(reaction.content, "hooray")
264  
265      def testDeleteReaction(self):
266          self.assertTrue(self.issue.delete_reaction(85740167))
267  
268      def testGetTimeline(self):
269          expected_events = {
270              "referenced",
271              "cross-referenced",
272              "locked",
273              "unlocked",
274              "closed",
275              "assigned",
276              "commented",
277              "subscribed",
278              "labeled",
279          }
280          events = self.issue.get_timeline()
281  
282          first = events[0]
283          self.assertEqual(15819975, first.id)
284          self.assertEqual("MDE1OlN1YnNjcmliZWRFdmVudDE1ODE5OTc1", first.node_id)
285          self.assertEqual(
286              "https://api.github.com/repos/PyGithub/PyGithub/issues/events/15819975",
287              first.url,
288          )
289          self.assertEqual("jacquev6", first.actor.login)
290          self.assertEqual(327146, first.actor.id)
291          self.assertEqual("subscribed", first.event)
292          self.assertIsNone(first.commit_id)
293          self.assertIsNone(first.commit_url)
294          self.assertEqual(repr(first), "TimelineEvent(id=15819975)")
295  
296          for event in events:
297              self.assertIn(event.event, expected_events)
298              self.assertIsNotNone(event.created_at)
299              self.assertIsNotNone(event.actor)
300  
301              if event.event == "cross-referenced":
302                  # cross-referenced events don't include an event id or node_id
303                  self.assertIsNotNone(event.source)
304                  self.assertEqual(event.source.type, "issue")
305                  self.assertEqual(event.source.issue.number, 857)
306                  self.assertEqual(repr(event.source), 'TimelineEventSource(type="issue")')
307              else:
308                  self.assertIsNotNone(event.id)
309                  self.assertIsNotNone(event.node_id)
310  
311                  if event.event == "commented":
312                      self.assertIsNotNone(event.body)
313                  else:
314                      self.assertIsNone(event.source)
315                      self.assertIsNotNone(event.actor)