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])