/ tests / CheckRun.py
CheckRun.py
  1  ############################ Copyrights and license ############################
  2  #                                                                              #
  3  # Copyright 2020 Dhruv Manilawala <dhruvmanila@gmail.com>                      #
  4  #                                                                              #
  5  # This file is part of PyGithub.                                               #
  6  # http://pygithub.readthedocs.io/                                              #
  7  #                                                                              #
  8  # PyGithub is free software: you can redistribute it and/or modify it under    #
  9  # the terms of the GNU Lesser General Public License as published by the Free  #
 10  # Software Foundation, either version 3 of the License, or (at your option)    #
 11  # any later version.                                                           #
 12  #                                                                              #
 13  # PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY  #
 14  # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS    #
 15  # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more #
 16  # details.                                                                     #
 17  #                                                                              #
 18  # You should have received a copy of the GNU Lesser General Public License     #
 19  # along with PyGithub. If not, see <http://www.gnu.org/licenses/>.             #
 20  #                                                                              #
 21  ################################################################################
 22  
 23  from datetime import datetime, timezone
 24  
 25  from . import Framework
 26  
 27  
 28  class CheckRun(Framework.TestCase):
 29      def setUp(self):
 30          super().setUp()
 31          self.repo = self.g.get_repo("PyGithub/PyGithub")
 32          self.testrepo = self.g.get_repo("dhruvmanila/pygithub-testing")
 33          self.check_run_id = 1039891953
 34          self.check_run_ref = "6bc9ecc8c849df4e45e60c1e6a5df8876180a20a"
 35          self.check_run = self.repo.get_check_run(self.check_run_id)
 36          self.commit = self.repo.get_commit(self.check_run_ref)
 37  
 38      def testAttributes(self):
 39          self.assertEqual(self.check_run.app.id, 15368)
 40          self.assertEqual(self.check_run.app.slug, "github-actions")
 41          self.assertEqual(self.check_run.check_suite_id, 1110219217)
 42          self.assertEqual(
 43              self.check_run.completed_at,
 44              datetime(2020, 8, 28, 4, 21, 21, tzinfo=timezone.utc),
 45          )
 46          self.assertEqual(self.check_run.conclusion, "success")
 47          self.assertEqual(
 48              self.check_run.details_url,
 49              "https://github.com/PyGithub/PyGithub/runs/1039891953",
 50          )
 51          self.assertEqual(self.check_run.external_id, "6b512fe7-587c-5ecc-c4a3-03b7358c152d")
 52          self.assertEqual(self.check_run.head_sha, "6bc9ecc8c849df4e45e60c1e6a5df8876180a20a")
 53          self.assertEqual(
 54              self.check_run.html_url,
 55              "https://github.com/PyGithub/PyGithub/runs/1039891953",
 56          )
 57          self.assertEqual(self.check_run.id, 1039891953)
 58          self.assertEqual(self.check_run.name, "test (Python 3.8)")
 59          self.assertEqual(self.check_run.node_id, "MDg6Q2hlY2tSdW4xMDM5ODkxOTUz")
 60          self.assertEqual(self.check_run.output.annotations_count, 0)
 61          self.assertEqual(len(self.check_run.pull_requests), 0)
 62          self.assertEqual(
 63              self.check_run.started_at,
 64              datetime(2020, 8, 28, 4, 20, 27, tzinfo=timezone.utc),
 65          )
 66          self.assertEqual(self.check_run.status, "completed")
 67          self.assertEqual(
 68              self.check_run.url,
 69              "https://api.github.com/repos/PyGithub/PyGithub/check-runs/1039891953",
 70          )
 71          self.assertEqual(repr(self.check_run), 'CheckRun(id=1039891953, conclusion="success")')
 72  
 73      def testCheckRunOutputAttributes(self):
 74          check_run_output = self.repo.get_check_run(1039891917).output
 75          self.assertEqual(check_run_output.title, "test (Python 3.6)")
 76          self.assertEqual(
 77              check_run_output.summary,
 78              "There are 1 failures, 0 warnings, and 0 notices.",
 79          )
 80          self.assertIsNone(check_run_output.text)
 81          self.assertEqual(check_run_output.annotations_count, 1)
 82          self.assertEqual(
 83              check_run_output.annotations_url,
 84              "https://api.github.com/repos/PyGithub/PyGithub/check-runs/1039891917/annotations",
 85          )
 86          self.assertEqual(repr(check_run_output), 'CheckRunOutput(title="test (Python 3.6)")')
 87  
 88      def testGetCheckRunsForRef(self):
 89          check_runs = self.commit.get_check_runs()
 90          self.assertEqual(check_runs.totalCount, 4)
 91          self.assertListEqual(
 92              [check_run.id for check_run in check_runs],
 93              [1039891953, 1039891931, 1039891917, 1039891902],
 94          )
 95  
 96      def testGetCheckRunsForRefFilterByCheckName(self):
 97          check_runs = self.commit.get_check_runs(check_name="test (Python 3.6)")
 98          self.assertEqual(check_runs.totalCount, 1)
 99          self.assertListEqual([check_run.id for check_run in check_runs], [1039891917])
100  
101      def testGetCheckRunsForRefFilterByStatus(self):
102          completed_check_runs = self.commit.get_check_runs(status="completed")
103          self.assertEqual(completed_check_runs.totalCount, 4)
104          self.assertListEqual(
105              [check_run.id for check_run in completed_check_runs],
106              [1039891953, 1039891931, 1039891917, 1039891902],
107          )
108          queued_check_runs = self.commit.get_check_runs(status="queued")
109          self.assertEqual(queued_check_runs.totalCount, 0)
110          in_progress_check_runs = self.commit.get_check_runs(status="in_progress")
111          self.assertEqual(in_progress_check_runs.totalCount, 0)
112  
113      def testGetCheckRunsForRefFilterByFilter(self):
114          latest_check_runs = self.commit.get_check_runs(filter="latest")
115          all_check_runs = self.commit.get_check_runs(filter="all")
116          self.assertEqual(latest_check_runs.totalCount, 4)
117          self.assertListEqual(
118              [check_run.id for check_run in latest_check_runs],
119              [1039891953, 1039891931, 1039891917, 1039891902],
120          )
121          self.assertEqual(all_check_runs.totalCount, 4)
122          self.assertListEqual(
123              [check_run.id for check_run in all_check_runs],
124              [1039891953, 1039891931, 1039891917, 1039891902],
125          )
126  
127      def testCreateCheckRunInProgress(self):
128          check_run = self.testrepo.create_check_run(
129              name="basic_check_run",
130              head_sha="0283d46537193f1fed7d46859f15c5304b9836f9",
131              status="in_progress",
132              external_id="50",
133              details_url="https://www.example.com",
134              started_at=datetime(2020, 9, 4, 1, 14, 52),
135              output={"title": "PyGithub Check Run Test", "summary": "Test summary"},
136          )
137          self.assertEqual(check_run.name, "basic_check_run")
138          self.assertEqual(check_run.head_sha, "0283d46537193f1fed7d46859f15c5304b9836f9")
139          self.assertEqual(check_run.status, "in_progress")
140          self.assertEqual(check_run.external_id, "50")
141          self.assertEqual(
142              check_run.started_at,
143              datetime(2020, 9, 4, 1, 14, 52, tzinfo=timezone.utc),
144          )
145          self.assertEqual(check_run.output.title, "PyGithub Check Run Test")
146          self.assertEqual(check_run.output.summary, "Test summary")
147          self.assertIsNone(check_run.output.text)
148          self.assertEqual(check_run.output.annotations_count, 0)
149          # We don't want to keep this hanging
150          check_run.edit(conclusion="success")
151          self.assertEqual(check_run.conclusion, "success")
152          self.assertEqual(check_run.status, "completed")
153  
154      def testCreateCheckRunCompleted(self):
155          check_run = self.testrepo.create_check_run(
156              name="completed_check_run",
157              head_sha="0283d46537193f1fed7d46859f15c5304b9836f9",
158              status="completed",
159              started_at=datetime(2020, 10, 20, 10, 30, 29),
160              conclusion="success",
161              completed_at=datetime(2020, 10, 20, 11, 30, 50),
162              output={
163                  "title": "Readme report",
164                  "summary": "There are 0 failures, 2 warnings, and 1 notices.",
165                  "text": "You may have some misspelled words on lines 2 and 4.",
166                  "annotations": [
167                      {
168                          "path": "README.md",
169                          "annotation_level": "warning",
170                          "title": "Spell Checker",
171                          "message": "Check your spelling for 'banaas'.",
172                          "raw_details": "Do you mean 'bananas' or 'banana'?",
173                          "start_line": 2,
174                          "end_line": 2,
175                      },
176                      {
177                          "path": "README.md",
178                          "annotation_level": "warning",
179                          "title": "Spell Checker",
180                          "message": "Check your spelling for 'aples'",
181                          "raw_details": "Do you mean 'apples' or 'Naples'",
182                          "start_line": 4,
183                          "end_line": 4,
184                      },
185                  ],
186                  "images": [
187                      {
188                          "alt": "Test Image",
189                          "image_url": "http://example.com/images/42",
190                      }
191                  ],
192              },
193              actions=[
194                  {
195                      "label": "Fix",
196                      "identifier": "fix_errors",
197                      "description": "Allow us to fix these errors for you",
198                  }
199              ],
200          )
201          self.assertEqual(check_run.name, "completed_check_run")
202          self.assertEqual(check_run.head_sha, "0283d46537193f1fed7d46859f15c5304b9836f9")
203          self.assertEqual(check_run.status, "completed")
204          self.assertEqual(
205              check_run.started_at,
206              datetime(2020, 10, 20, 10, 30, 29, tzinfo=timezone.utc),
207          ),
208          self.assertEqual(check_run.conclusion, "success")
209          self.assertEqual(
210              check_run.completed_at,
211              datetime(2020, 10, 20, 11, 30, 50, tzinfo=timezone.utc),
212          ),
213          self.assertEqual(check_run.output.annotations_count, 2)
214  
215      def testUpdateCheckRunSuccess(self):
216          # This is a different check run created for this test
217          check_run = self.testrepo.create_check_run(
218              name="edit_check_run",
219              head_sha="0283d46537193f1fed7d46859f15c5304b9836f9",
220              status="in_progress",
221              external_id="100",
222              started_at=datetime(2020, 10, 20, 14, 24, 31),
223              output={"title": "Check run for testing edit method", "summary": ""},
224          )
225          self.assertEqual(check_run.name, "edit_check_run")
226          self.assertEqual(check_run.status, "in_progress")
227          check_run.edit(
228              status="completed",
229              conclusion="success",
230              output={
231                  "title": "Check run for testing edit method",
232                  "summary": "This is the summary of editing check run as completed.",
233              },
234          )
235          self.assertEqual(check_run.name, "edit_check_run")
236          self.assertEqual(check_run.status, "completed")
237          self.assertEqual(check_run.conclusion, "success")
238          self.assertEqual(check_run.output.title, "Check run for testing edit method")
239          self.assertEqual(
240              check_run.output.summary,
241              "This is the summary of editing check run as completed.",
242          )
243          self.assertEqual(check_run.output.annotations_count, 0)
244  
245      def testUpdateCheckRunFailure(self):
246          # This is a different check run created for this test
247          check_run = self.testrepo.create_check_run(
248              name="fail_check_run",
249              head_sha="0283d46537193f1fed7d46859f15c5304b9836f9",
250              status="in_progress",
251              external_id="101",
252              started_at=datetime(2020, 10, 20, 10, 14, 51),
253              output={"title": "Check run for testing failure", "summary": ""},
254          )
255          self.assertEqual(check_run.name, "fail_check_run")
256          self.assertEqual(check_run.status, "in_progress")
257          check_run.edit(
258              status="completed",
259              conclusion="failure",
260              output={
261                  "title": "Check run for testing failure",
262                  "summary": "There is 1 whitespace error.",
263                  "text": "You may have a whitespace error in the file 'test.py'",
264                  "annotations": [
265                      {
266                          "path": "test.py",
267                          "annotation_level": "failure",
268                          "title": "whitespace checker",
269                          "message": "Remove the unnecessary whitespace from the file.",
270                          "start_line": 2,
271                          "end_line": 2,
272                          "start_column": 17,
273                          "end_column": 18,
274                      }
275                  ],
276              },
277              actions=[
278                  {
279                      "label": "Fix",
280                      "identifier": "fix_errors",
281                      "description": "Allow us to fix these errors for you",
282                  }
283              ],
284          )
285          self.assertEqual(check_run.status, "completed")
286          self.assertEqual(check_run.conclusion, "failure")
287          self.assertEqual(check_run.output.annotations_count, 1)
288  
289      def testUpdateCheckRunAll(self):
290          check_run = self.testrepo.get_check_run(1279259090)
291          check_run.edit(
292              name="update_all_params",
293              head_sha="0283d46537193f1fed7d46859f15c5304b9836f9",
294              details_url="https://www.example-url.com",
295              external_id="49",
296              started_at=datetime(2020, 10, 20, 1, 10, 20),
297              completed_at=datetime(2020, 10, 20, 2, 20, 30),
298              actions=[
299                  {
300                      "label": "Hello World!",
301                      "identifier": "identity",
302                      "description": "Hey! This is a test",
303                  }
304              ],
305          )
306          self.assertEqual(check_run.name, "update_all_params")
307          self.assertEqual(check_run.head_sha, "0283d46537193f1fed7d46859f15c5304b9836f9")
308          self.assertEqual(check_run.details_url, "https://www.example-url.com")
309          self.assertEqual(check_run.external_id, "49")
310          self.assertEqual(
311              check_run.started_at,
312              datetime(2020, 10, 20, 1, 10, 20, tzinfo=timezone.utc),
313          )
314          self.assertEqual(
315              check_run.completed_at,
316              datetime(2020, 10, 20, 2, 20, 30, tzinfo=timezone.utc),
317          )
318  
319      def testCheckRunAnnotationAttributes(self):
320          check_run = self.testrepo.get_check_run(1280914700)
321          self.assertEqual(check_run.name, "annotations")
322          annotation = check_run.get_annotations()[0]
323          self.assertEqual(annotation.annotation_level, "warning")
324          self.assertIsNone(annotation.end_column)
325          self.assertEqual(annotation.end_line, 2)
326          self.assertEqual(annotation.message, "Check your spelling for 'banaas'.")
327          self.assertEqual(annotation.path, "README.md")
328          self.assertEqual(annotation.raw_details, "Do you mean 'bananas' or 'banana'?")
329          self.assertIsNone(annotation.start_column)
330          self.assertEqual(annotation.start_line, 2)
331          self.assertEqual(annotation.title, "Spell Checker")
332          self.assertEqual(repr(annotation), 'CheckRunAnnotation(title="Spell Checker")')
333  
334      def testListCheckRunAnnotations(self):
335          check_run = self.testrepo.get_check_run(1280914700)
336          self.assertEqual(check_run.name, "annotations")
337          self.assertEqual(check_run.status, "completed")
338          annotation_list = check_run.get_annotations()
339          self.assertEqual(annotation_list.totalCount, 2)
340          self.assertListEqual([annotation.start_line for annotation in annotation_list], [2, 4])