@@ -1213,6 +1213,60 @@ async def test_reset_role_and_password(self, client, mocker):
12131213 patch_validate_token .assert_called_once_with (ADMIN_USER_HEADER ['Authorization' ])
12141214 patch_logger_debug .assert_called_once_with ('Received %s request for %s' , 'PUT' , '/fledge/admin/2/reset' )
12151215
1216+ @pytest .mark .parametrize ("request_data, ret_val" , [
1217+ ({"username" : "admin" , "password" : "fledge" }, (1 , "token1" , True )),
1218+ ({"username" : "user" , "password" : "fledge" }, (2 , "token2" , False ))
1219+ ])
1220+ async def test_login_auth_password (self , client , request_data , ret_val ):
1221+ async def async_mock ():
1222+ return ret_val
1223+
1224+ # Changed in version 3.8: patch() now returns an AsyncMock if the target is an async function.
1225+ if sys .version_info .major == 3 and sys .version_info .minor >= 8 :
1226+ _rv = await async_mock ()
1227+ else :
1228+ _rv = asyncio .ensure_future (async_mock ())
1229+
1230+ with patch .object (middleware ._logger , 'debug' ) as patch_logger :
1231+ with patch .object (User .Objects , 'login' , return_value = _rv ) as patch_user_login :
1232+ with patch .object (auth ._logger , 'info' ) as patch_auth_logger :
1233+ resp = await client .post ('/fledge/login' , data = json .dumps (request_data ))
1234+ assert 200 == resp .status
1235+ r = await resp .text ()
1236+ actual = json .loads (r )
1237+ assert ret_val [0 ] == actual ['uid' ]
1238+ assert ret_val [1 ] == actual ['token' ]
1239+ assert ret_val [2 ] == actual ['admin' ]
1240+ patch_auth_logger .assert_called_once_with ('User with username:<{}> logged in successfully.' .format (
1241+ request_data ['username' ]))
1242+ # TODO: host arg patch transport.request.extra_info
1243+ args , kwargs = patch_user_login .call_args
1244+ assert request_data ['username' ] == args [0 ]
1245+ assert request_data ['password' ] == args [1 ]
1246+ # patch_user_login.assert_called_once_with()
1247+ patch_logger .assert_called_once_with ('Received %s request for %s' , 'POST' , '/fledge/login' )
1248+
1249+ @pytest .mark .parametrize ("exception_name, status_code, msg" , [
1250+ (User .PasswordNotSetError , 400 , 'Password is not set for this user.' ),
1251+ (User .DoesNotExist , 404 , 'User does not exist' ),
1252+ (User .PasswordDoesNotMatch , 404 , 'Username or Password do not match' ),
1253+ (Exception , 500 , 'Internal Server Error' )
1254+ ])
1255+ async def test_login_fails_when_password_auth_used_but_password_not_set (self , client , exception_name ,
1256+ status_code , msg ):
1257+ request_data_payload = {"username" : "ranveer" , "password" : "Singh@123" }
1258+ with patch .object (middleware ._logger , 'debug' ) as patch_logger :
1259+ with patch .object (User .Objects , 'login' , side_effect = exception_name (msg )):
1260+ with patch .object (auth ._logger , 'error' ) as patch_auth_logger :
1261+ resp = await client .post ('/fledge/login' , data = json .dumps (request_data_payload ))
1262+ assert status_code == resp .status
1263+ assert msg == resp .reason
1264+ r = await resp .text ()
1265+ actual = json .loads (r )
1266+ assert {'message' : msg } == actual
1267+ patch_auth_logger .assert_not_called () if status_code != 500 else patch_auth_logger .assert_called ()
1268+ patch_logger .assert_called_once_with ('Received %s request for %s' , 'POST' , '/fledge/login' )
1269+
12161270 @pytest .mark .parametrize ("auth_method, request_data, ret_val" , [
12171271 ("certificate" , "-----BEGIN CERTIFICATE----- Test -----END CERTIFICATE-----" , (2 , "token2" , False ))
12181272 ])
0 commit comments