/ tests / Exceptions.py
Exceptions.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 Vincent Jacques <vincent@vincent-jacques.net>                 #
  6  # Copyright 2014 Vincent Jacques <vincent@vincent-jacques.net>                 #
  7  # Copyright 2016 Peter Buckley <dx-pbuckley@users.noreply.github.com>          #
  8  # Copyright 2016 humbug <bah>                                                  #
  9  # Copyright 2017 Hugo <hugovk@users.noreply.github.com>                        #
 10  # Copyright 2017 Simon <spam@esemi.ru>                                         #
 11  # Copyright 2018 Steve Kowalik <steven@wedontsleep.org>                        #
 12  # Copyright 2018 sfdye <tsfdye@gmail.com>                                      #
 13  #                                                                              #
 14  # This file is part of PyGithub.                                               #
 15  # http://pygithub.readthedocs.io/                                              #
 16  #                                                                              #
 17  # PyGithub is free software: you can redistribute it and/or modify it under    #
 18  # the terms of the GNU Lesser General Public License as published by the Free  #
 19  # Software Foundation, either version 3 of the License, or (at your option)    #
 20  # any later version.                                                           #
 21  #                                                                              #
 22  # PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY  #
 23  # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS    #
 24  # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more #
 25  # details.                                                                     #
 26  #                                                                              #
 27  # You should have received a copy of the GNU Lesser General Public License     #
 28  # along with PyGithub. If not, see <http://www.gnu.org/licenses/>.             #
 29  #                                                                              #
 30  ################################################################################
 31  
 32  import pickle
 33  
 34  import github
 35  
 36  from . import Framework
 37  
 38  
 39  class Exceptions(Framework.TestCase):
 40      def testInvalidInput(self):
 41          with self.assertRaises(github.GithubException) as raisedexp:
 42              self.g.get_user().create_key("Bad key", "xxx")
 43          self.assertEqual(raisedexp.exception.status, 422)
 44          self.assertEqual(
 45              raisedexp.exception.data,
 46              {
 47                  "errors": [
 48                      {
 49                          "code": "custom",
 50                          "field": "key",
 51                          "message": "key is invalid. It must begin with 'ssh-rsa' or 'ssh-dss'. Check that you're copying the public half of the key",
 52                          "resource": "PublicKey",
 53                      }
 54                  ],
 55                  "message": "Validation Failed",
 56              },
 57          )
 58  
 59      def testNonJsonDataReturnedByGithub(self):
 60          # Replay data was forged according to https://github.com/jacquev6/PyGithub/pull/182
 61          with self.assertRaises(github.GithubException) as raisedexp:
 62              # 503 would be retried, disable retries
 63              self.get_github(retry=None, pool_size=self.pool_size).get_user("jacquev6")
 64          self.assertEqual(raisedexp.exception.status, 503)
 65          self.assertEqual(
 66              raisedexp.exception.data,
 67              {
 68                  "data": "<html><body><h1>503 Service Unavailable</h1>No server is available to handle this request.</body></html>",
 69              },
 70          )
 71  
 72      def testUnknownObject(self):
 73          with self.assertRaises(github.GithubException) as raisedexp:
 74              self.g.get_user().get_repo("Xxx")
 75          self.assertEqual(raisedexp.exception.status, 404)
 76          self.assertEqual(raisedexp.exception.data, {"message": "Not Found"})
 77          self.assertEqual(str(raisedexp.exception), '404 {"message": "Not Found"}')
 78  
 79      def testUnknownUser(self):
 80          with self.assertRaises(github.GithubException) as raisedexp:
 81              self.g.get_user("ThisUserShouldReallyNotExist")
 82          self.assertEqual(raisedexp.exception.status, 404)
 83          self.assertEqual(raisedexp.exception.data, {"message": "Not Found"})
 84          self.assertEqual(str(raisedexp.exception), '404 {"message": "Not Found"}')
 85  
 86      def testBadAuthentication(self):
 87          with self.assertRaises(github.GithubException) as raisedexp:
 88              github.Github(auth=github.Auth.Login("BadUser", "BadPassword")).get_user().login
 89          self.assertEqual(raisedexp.exception.status, 401)
 90          self.assertEqual(raisedexp.exception.data, {"message": "Bad credentials"})
 91          self.assertEqual(str(raisedexp.exception), '401 {"message": "Bad credentials"}')
 92  
 93      def testExceptionPickling(self):
 94          pickle.loads(pickle.dumps(github.GithubException("foo", "bar", None)))
 95  
 96      def testJSONParseError(self):
 97          # Replay data was forged to force a JSON error
 98          with self.assertRaises(ValueError):
 99              self.g.get_user("jacquev6")
100  
101  
102  class SpecificExceptions(Framework.TestCase):
103      def testBadCredentials(self):
104          self.assertRaises(
105              github.BadCredentialsException,
106              lambda: github.Github(auth=github.Auth.Login("BadUser", "BadPassword")).get_user().login,
107          )
108  
109      def test2FARequired(self):
110          self.assertRaises(
111              github.TwoFactorException,
112              lambda: github.Github(auth=github.Auth.Login("2fauser", "password")).get_user().login,
113          )
114  
115      def testUnknownObject(self):
116          self.assertRaises(github.UnknownObjectException, lambda: self.g.get_user().get_repo("Xxx"))
117  
118      def testBadUserAgent(self):
119          self.assertRaises(
120              github.BadUserAgentException,
121              lambda: github.Github(auth=self.login, user_agent="").get_user().name,
122          )
123  
124      def testRateLimitExceeded(self):
125          # rate limit errors would be retried if retry is not set None
126          g = github.Github(retry=None)
127  
128          def exceed():
129              for i in range(100):
130                  g.get_user("jacquev6")
131  
132          self.assertRaises(github.RateLimitExceededException, exceed)
133  
134      def testAuthenticatedRateLimitExceeded(self):
135          def exceed():
136              for i in range(100):
137                  res = self.g.search_code("jacquev6")
138                  res.get_page(0)
139  
140          with self.assertRaises(github.RateLimitExceededException) as raised:
141              exceed()
142          self.assertEqual(raised.exception.headers.get("retry-after"), "60")
143  
144      def testIncompletableObject(self):
145          github.UserKey.UserKey.setCheckAfterInitFlag(False)
146          obj = github.UserKey.UserKey(None, {}, {}, False)
147          self.assertRaises(github.IncompletableObject, obj._completeIfNeeded)