@@ -2153,3 +2153,74 @@ def test_set_auth_scheme_preference_signer_with_bearer_token(
21532153 assert signature_version == expected_signature_version , (
21542154 f"Expected '{ expected_signature_version } ' but got '{ signature_version } '"
21552155 )
2156+
2157+
2158+ def test_map_oauth2_errors_adds_message ():
2159+ body = {'error' : 'invalid_grant' , 'error_description' : 'Token is expired' }
2160+ response_dict = {
2161+ 'status_code' : 400 ,
2162+ 'body' : json .dumps (body ).encode ('utf-8' ),
2163+ 'headers' : {},
2164+ }
2165+ handlers ._map_oauth2_errors (response_dict )
2166+ parsed = json .loads (response_dict ['body' ])
2167+ assert parsed ['Message' ] == 'Token is expired'
2168+ assert parsed ['error' ] == body ['error' ]
2169+ assert parsed ['error_description' ] == body ['error_description' ]
2170+
2171+
2172+ @pytest .mark .parametrize (
2173+ "status_code, body" ,
2174+ [
2175+ # Success response
2176+ (200 , {'access_token' : 'foo' }),
2177+ # No error_description
2178+ (400 , {'error' : 'invalid_grant' }),
2179+ # Empty error description
2180+ (400 , {'error' : 'invalid_grant' , 'error_description' : '' }),
2181+ # Error response already contains Message or message
2182+ (
2183+ 400 ,
2184+ {
2185+ 'error' : 'invalid_grant' ,
2186+ 'error_description' : 'foo' ,
2187+ 'Message' : 'something went wrong' ,
2188+ },
2189+ ),
2190+ (
2191+ 400 ,
2192+ {
2193+ 'error' : 'invalid_grant' ,
2194+ 'error_description' : 'bar' ,
2195+ 'message' : 'something went wrong' ,
2196+ },
2197+ ),
2198+ ],
2199+ )
2200+ def test_map_oauth2_errors_preserves_body (status_code , body ):
2201+ response_dict = {
2202+ 'status_code' : status_code ,
2203+ 'body' : json .dumps (body ).encode ('utf-8' ),
2204+ 'headers' : {},
2205+ }
2206+ original_body = response_dict ['body' ]
2207+ handlers ._map_oauth2_errors (response_dict )
2208+ assert response_dict ['body' ] == original_body
2209+
2210+
2211+ @pytest .mark .parametrize (
2212+ "response_dict" ,
2213+ [
2214+ # Invalid JSON body
2215+ {'status_code' : 400 , 'body' : b'not json' , 'headers' : {}},
2216+ # Empty body
2217+ {'status_code' : 400 , 'body' : b'' , 'headers' : {}},
2218+ # No body
2219+ {'status_code' : 400 , 'headers' : {}},
2220+ # Missing status_code
2221+ {'body' : b'{}' , 'headers' : {}},
2222+ ],
2223+ )
2224+ def test_map_oauth2_errors_does_not_raise (response_dict ):
2225+ # Should silently pass on malformed inputs
2226+ handlers ._map_oauth2_errors (response_dict )
0 commit comments