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)