Skip to content

Commit

Permalink
login test cases added
Browse files Browse the repository at this point in the history
  • Loading branch information
anasnadeemws committed Mar 15, 2024
1 parent 6832325 commit b9debb0
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 17 deletions.
1 change: 0 additions & 1 deletion app/daos/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,6 @@ def login(data: Login, db_session: Session):
if not check_password_hash(user_details.password, user_data["password"]):
raise InvalidCredentialsException(messages["INVALID_CREDENTIALS"])

del user_details.password
token = jwt_utils.create_access_token({"sub": user_details.email, "id": user_details.id})
return response_formatter(messages["LOGIN_SUCCESSFULLY"], {"token": token})

Expand Down
75 changes: 59 additions & 16 deletions app/tests/test_daos_users.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
from __future__ import annotations

from collections import namedtuple
from datetime import datetime
import json
import unittest
from unittest.mock import MagicMock, patch
from collections import namedtuple
from datetime import datetime
from unittest.mock import MagicMock
from unittest.mock import patch

from fastapi import HTTPException
import pytest
from alchemy_mock.mocking import AlchemyMagicMock
from alchemy_mock.mocking import UnifiedAlchemyMagicMock
from fastapi import HTTPException
from freezegun import freeze_time
from sqlalchemy import Select
from werkzeug.security import generate_password_hash

from app.daos.users import create_user, list_users
from app.daos.users import create_user
from app.daos.users import get_user
from app.daos.users import list_users
from app.daos.users import login
from app.schemas.users.users_request import CreateUser
from app.schemas.users.users_request import Login


@pytest.fixture
Expand Down Expand Up @@ -86,32 +91,33 @@ def test_create_user(db_session):
}
assert response == expected_response


class TestListUsers(unittest.TestCase):
@patch('app.models.users.User') # Patch the User model
@patch('app.daos.users.paginate') # Patch the paginate function
@patch("app.models.users.User") # Patch the User model
@patch("app.daos.users.paginate") # Patch the paginate function
def test_list_users_success(self, mock_paginate, mock_user):
# Mocking the Session
mock_session = AlchemyMagicMock()

# Creating mock users
user1 = UnifiedAlchemyMagicMock(id=1, name='User1', email='user1@example.com', mobile='1234567890')
user2 = UnifiedAlchemyMagicMock(id=2, name='User2', email='user2@example.com', mobile='9876543210')
user1 = UnifiedAlchemyMagicMock(id=1, name="User1", email="user1@example.com", mobile="1234567890")
user2 = UnifiedAlchemyMagicMock(id=2, name="User2", email="user2@example.com", mobile="9876543210")

# Mocking the query result
mock_query = Select()

mock_user.query = mock_query

# Mocking the paginate function
mock_paginate.return_value = [user1, user2] # Assuming paginate returns the same users for simplicity

# Call the function
result = list_users(mock_session)

# Assertions
self.assertEqual(result, [user1, user2])

@patch('app.daos.users.paginate')
@patch("app.daos.users.paginate")
def test_list_users_exception(self, mock_paginate):
# Mocking the Session
mock_session = UnifiedAlchemyMagicMock()
Expand All @@ -134,8 +140,9 @@ def test_list_users_exception(self, mock_paginate):
# Assertions
self.assertEqual(cm.exception.status_code, 400)


class TestGetUser(unittest.IsolatedAsyncioTestCase):
@patch('app.daos.users.retrieve_cache')
@patch("app.daos.users.retrieve_cache")
async def test_get_user_no_cache_no_user_found(self, mock_retrieve_cache):
# Mocking retrieve_cache to return no cached user
mock_retrieve_cache.return_value = None, None
Expand All @@ -153,13 +160,49 @@ async def test_get_user_no_cache_no_user_found(self, mock_retrieve_cache):
with self.assertRaises(HTTPException) as cm:
await get_user(0, mock_session)
# Assertions
mock_retrieve_cache.assert_called_once_with('user_0')
mock_retrieve_cache.assert_called_once_with("user_0")
mock_query.where.assert_called_once()
self.assertEqual(cm.exception.status_code, 400)
self.assertEqual(str(cm.exception.detail), "No User found for given ID.")

# Write similar tests for other scenarios (e.g., cache hit, database query exception, cache creation exception)

if __name__ == '__main__':
unittest.main()

login_data = Login(email="test@gmail.com", password="Test@123")


# Test if user login is successful
@patch("app.constants.jwt_utils.create_access_token")
@patch("app.daos.users.check_password_hash")
def test_login_successful(mock_create_access_token, mock_check_password_hash):
mock_create_access_token.return_value = True
mock_check_password_hash.return_value = True

mock_db_session = AlchemyMagicMock()
User = namedtuple("User", ["id", "email", "password"])
user = User(id=1, email="test@gmail.com", password=generate_password_hash("Test@123", method="pbkdf2"))
mock_db_session.query.return_value.where.return_value.first.return_value = user

response = login(login_data, mock_db_session)
expected_response = {
"success": True,
"message": "User logged in successfully.",
"data": {"token": True},
}
assert response == expected_response


def test_login_invalid_password():
mock_db_session = AlchemyMagicMock()

User = namedtuple("User", ["id", "email", "password"])
user = User(id=1, email="test@gmail.com", password="Test@13")

mock_db_session.query.return_value.where.return_value.first.return_value = user

with pytest.raises(Exception):
login(login_data, mock_db_session)


if __name__ == "__main__":
unittest.main()

0 comments on commit b9debb0

Please sign in to comment.