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