GitRelease.py
1 ############################ Copyrights and license ############################ 2 # # 3 # Copyright 2015 Ed Holland <eholland@alertlogic.com> # 4 # Copyright 2016 Benjamin Whitney <benjamin.whitney@ironnetcybersecurity.com> # 5 # Copyright 2016 Jannis Gebauer <ja.geb@me.com> # 6 # Copyright 2016 Peter Buckley <dx-pbuckley@users.noreply.github.com> # 7 # Copyright 2017 Chris McBride <thehighlander@users.noreply.github.com> # 8 # Copyright 2017 Simon <spam@esemi.ru> # 9 # Copyright 2018 Andrew Smith <espadav8@gmail.com> # 10 # Copyright 2018 Daniel Kesler <kesler.daniel@gmail.com> # 11 # Copyright 2018 Kuba <jakub.glapa@adspired.com> # 12 # Copyright 2018 Maarten Fonville <mfonville@users.noreply.github.com> # 13 # Copyright 2018 Shinichi TAMURA <shnch.tmr@gmail.com> # 14 # Copyright 2018 edquist <edquist@users.noreply.github.com> # 15 # Copyright 2018 sfdye <tsfdye@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 import os 36 import zipfile 37 from datetime import datetime, timezone 38 39 from github import GithubException 40 41 from . import Framework 42 43 44 class FileLikeStub: 45 def __init__(self): 46 self.dat = b"I wanted to come up with some clever phrase or something here to test with but my mind is blank." 47 self.file_length = len(self.dat) 48 self.index = 0 49 50 def read(self, size=-1): 51 if size < 0 or size is None: 52 start = self.index 53 self.index = self.file_length 54 return self.dat[start:] 55 else: 56 start = self.index 57 end = start + size 58 self.index = end 59 return self.dat[start:end] 60 61 62 repo_name = "RepoTest" 63 user = "rickrickston123" 64 release_id = 28524234 65 author_id = 64711998 66 tag = "v1.0" 67 create_date = datetime(2020, 7, 12, 7, 34, 42, tzinfo=timezone.utc) 68 publish_date = datetime(2020, 7, 14, 0, 58, 20, tzinfo=timezone.utc) 69 70 71 class GitRelease(Framework.TestCase): 72 def setUp(self): 73 super().setUp() 74 self.new_tag = "v1.25.2" # Used for new releases 75 self.content_path = "content.txt" 76 self.artifact_path = "archive.zip" 77 78 with open(self.content_path, "w") as zip_content: 79 zip_content.write("Pedro for president.") 80 81 artifact = zipfile.ZipFile(self.artifact_path, "w") 82 artifact.write(self.content_path) 83 artifact.close() 84 self.repo = self.g.get_user(user).get_repo(repo_name) 85 self.release = self.repo.get_release(release_id) 86 87 def tearDown(self): 88 if os.path.exists(self.content_path): 89 os.remove(self.content_path) 90 if os.path.exists(self.artifact_path): 91 os.remove(self.artifact_path) 92 93 super().tearDown() 94 95 def setUpNewRelease(self): 96 repo = self.repo 97 commit_sha = repo.get_commits()[0].sha # Just need any commit 98 self.new_release = repo.create_git_tag_and_release( 99 self.new_tag, 100 "tag message", 101 "release title", 102 "release message", 103 commit_sha, 104 "commit", 105 ) 106 self.new_release_id = self.new_release.id 107 108 def tearDownNewRelease(self): 109 try: 110 new_release = self.repo.get_release(self.new_release_id) 111 new_release.delete_release() 112 except GithubException: 113 pass # Already deleted 114 115 def testAttributes(self): 116 release = self.release 117 self.assertEqual(release.id, release_id) 118 self.assertEqual(release.tag_name, tag) 119 self.assertEqual(release.target_commitish, "master") 120 self.assertEqual( 121 release.upload_url, 122 "https://uploads.github.com/repos/{}/{}/releases/{}/assets{{?name,label}}".format( 123 user, repo_name, release_id 124 ), 125 ) 126 self.assertEqual(release.body, "Body") 127 self.assertEqual(release.title, "Test") 128 self.assertFalse(release.draft) 129 self.assertFalse(release.prerelease) 130 self.assertEqual( 131 release.url, 132 f"https://api.github.com/repos/{user}/{repo_name}/releases/{release_id}", 133 ) 134 self.assertEqual(release.author._rawData["login"], user) 135 self.assertEqual(release.author.login, user) 136 self.assertEqual(release.author.id, author_id) 137 self.assertEqual(release.author.type, "User") 138 self.assertEqual( 139 release.html_url, 140 f"https://github.com/{user}/{repo_name}/releases/tag/{tag}", 141 ) 142 self.assertEqual(release.created_at, create_date) 143 self.assertEqual(release.published_at, publish_date) 144 self.assertEqual( 145 release.tarball_url, 146 f"https://api.github.com/repos/{user}/{repo_name}/tarball/{tag}", 147 ) 148 self.assertEqual( 149 release.zipball_url, 150 f"https://api.github.com/repos/{user}/{repo_name}/zipball/{tag}", 151 ) 152 self.assertEqual(repr(release), 'GitRelease(title="Test")') 153 self.assertEqual(len(release.assets), 1) 154 self.assertEqual( 155 repr(release.assets[0]), 156 'GitReleaseAsset(url="https://api.github.com/repos/' 157 f'{user}/{repo_name}/releases/assets/{release.raw_data["assets"][0]["id"]}")', 158 ) 159 160 def testGetRelease(self): 161 release_by_id = self.release 162 release_by_tag = self.repo.get_release(tag) 163 self.assertEqual(release_by_id, release_by_tag) 164 165 def testGetLatestRelease(self): 166 latest_release = self.repo.get_latest_release() 167 self.assertEqual(latest_release.tag_name, tag) 168 169 def testGetAssets(self): 170 repo = self.repo 171 release = self.release 172 self.assertEqual(release.id, release_id) 173 174 asset_list = [x for x in release.get_assets()] 175 self.assertTrue(asset_list is not None) 176 self.assertEqual(len(asset_list), 1) 177 178 asset_id = asset_list[0].id 179 asset = repo.get_release_asset(asset_id) 180 self.assertTrue(asset is not None) 181 self.assertEqual(asset.id, asset_id) 182 183 def testDelete(self): 184 self.setUpNewRelease() 185 self.new_release.delete_release() 186 self.tearDownNewRelease() 187 188 def testUpdate(self): 189 self.setUpNewRelease() 190 release = self.new_release 191 new_release = release.update_release("Updated Test", "Updated Body") 192 self.assertEqual(new_release.title, "Updated Test") 193 self.assertEqual(new_release.body, "Updated Body") 194 self.tearDownNewRelease() 195 196 def testUploadAsset(self): 197 self.setUpNewRelease() 198 release = self.new_release 199 self.assertEqual(release.id, self.new_release_id) 200 201 release.upload_asset(self.artifact_path, "unit test artifact", "application/zip") 202 self.tearDownNewRelease() 203 204 def testUploadAssetWithName(self): 205 self.setUpNewRelease() 206 release = self.new_release 207 r = release.upload_asset(self.artifact_path, name="foobar.zip", content_type="application/zip") 208 self.assertEqual(r.name, "foobar.zip") 209 self.tearDownNewRelease() 210 211 def testCreateGitTagAndRelease(self): 212 self.setUpNewRelease() 213 # Creation code already done in setup, so we'll just test what's already here. 214 release = self.new_release 215 self.assertEqual(release.tag_name, self.new_tag) 216 self.assertEqual(release.body, "release message") 217 self.assertEqual(release.title, "release title") 218 self.assertEqual(release.author._rawData["login"], user) 219 self.assertEqual( 220 release.html_url, 221 f"https://github.com/{user}/{repo_name}/releases/tag/{self.new_tag}", 222 ) 223 self.tearDownNewRelease() 224 225 def testUploadAssetFromMemory(self): 226 self.setUpNewRelease() 227 release = self.new_release 228 content_size = os.path.getsize(self.content_path) 229 with open(self.content_path, "rb") as f: 230 release.upload_asset_from_memory( 231 f, 232 content_size, 233 name="file_name", 234 content_type="text/plain", 235 label="unit test artifact", 236 ) 237 asset_list = [x for x in release.get_assets()] 238 self.assertTrue(asset_list is not None) 239 self.assertEqual(len(asset_list), 1) 240 self.tearDownNewRelease() 241 242 def testUploadAssetFileLike(self): 243 self.setUpNewRelease() 244 file_like = FileLikeStub() 245 release = self.new_release 246 release.upload_asset_from_memory( 247 file_like, 248 file_like.file_length, 249 name="file_like", 250 content_type="text/plain", 251 label="another unit test artifact", 252 ) 253 asset_list = [x for x in release.get_assets()] 254 self.assertTrue(asset_list is not None) 255 self.assertEqual(len(asset_list), 1) 256 self.tearDownNewRelease()