- Refactored all `password reset` and `auth dependency` tests to utilize async patterns for compatibility with async database sessions. - Enhanced test fixtures with `pytest-asyncio` to support asynchronous database operations. - Improved user handling with async context management for `test_user` and `async_mock_user`. - Introduced `await` syntax for route calls, token generation, and database transactions in test cases.
126 lines
4.3 KiB
Python
Executable File
126 lines
4.3 KiB
Python
Executable File
import pytest
|
|
|
|
from app.crud.user import user as user_crud
|
|
from app.models.user import User
|
|
from app.schemas.users import UserCreate, UserUpdate
|
|
|
|
|
|
def test_create_user(db_session, user_create_data):
|
|
user_in = UserCreate(**user_create_data)
|
|
user_obj = user_crud.create(db_session, obj_in=user_in)
|
|
|
|
assert user_obj.email == user_create_data["email"]
|
|
assert user_obj.first_name == user_create_data["first_name"]
|
|
assert user_obj.last_name == user_create_data["last_name"]
|
|
assert user_obj.phone_number == user_create_data["phone_number"]
|
|
assert user_obj.is_superuser == user_create_data["is_superuser"]
|
|
assert user_obj.password_hash is not None
|
|
assert user_obj.id is not None
|
|
|
|
|
|
def test_get_user(db_session, mock_user):
|
|
# Using mock_user fixture instead of creating new user
|
|
stored_user = user_crud.get(db_session, id=mock_user.id)
|
|
assert stored_user
|
|
assert stored_user.id == mock_user.id
|
|
assert stored_user.email == mock_user.email
|
|
|
|
|
|
def test_get_user_by_email(db_session, mock_user):
|
|
stored_user = user_crud.get_by_email(db_session, email=mock_user.email)
|
|
assert stored_user
|
|
assert stored_user.id == mock_user.id
|
|
assert stored_user.email == mock_user.email
|
|
|
|
|
|
def test_update_user(db_session, mock_user):
|
|
update_data = UserUpdate(
|
|
first_name="Updated",
|
|
last_name="Name",
|
|
phone_number="+9876543210"
|
|
)
|
|
|
|
updated_user = user_crud.update(db_session, db_obj=mock_user, obj_in=update_data)
|
|
|
|
assert updated_user.first_name == "Updated"
|
|
assert updated_user.last_name == "Name"
|
|
assert updated_user.phone_number == "+9876543210"
|
|
assert updated_user.email == mock_user.email
|
|
|
|
|
|
def test_delete_user(db_session, mock_user):
|
|
user_crud.remove(db_session, id=mock_user.id)
|
|
deleted_user = user_crud.get(db_session, id=mock_user.id)
|
|
assert deleted_user is None
|
|
|
|
|
|
def test_get_multi_users(db_session, mock_user, user_create_data):
|
|
# Create additional users (mock_user is already in db)
|
|
users_data = [
|
|
{**user_create_data, "email": f"test{i}@example.com"}
|
|
for i in range(2) # Creating 2 more users + mock_user = 3 total
|
|
]
|
|
|
|
for user_data in users_data:
|
|
user_in = UserCreate(**user_data)
|
|
user_crud.create(db_session, obj_in=user_in)
|
|
|
|
users = user_crud.get_multi(db_session, skip=0, limit=10)
|
|
assert len(users) == 3
|
|
assert all(isinstance(user, User) for user in users)
|
|
|
|
|
|
def test_is_active(db_session, mock_user):
|
|
assert user_crud.is_active(mock_user) is True
|
|
|
|
# Test deactivating user
|
|
update_data = UserUpdate(is_active=False)
|
|
deactivated_user = user_crud.update(db_session, db_obj=mock_user, obj_in=update_data)
|
|
assert user_crud.is_active(deactivated_user) is False
|
|
|
|
|
|
def test_is_superuser(db_session, mock_user, user_create_data):
|
|
# mock_user is regular user
|
|
assert user_crud.is_superuser(mock_user) is False
|
|
|
|
# Create superuser
|
|
super_user_data = {**user_create_data, "email": "super@example.com", "is_superuser": True}
|
|
super_user_in = UserCreate(**super_user_data)
|
|
super_user = user_crud.create(db_session, obj_in=super_user_in)
|
|
assert user_crud.is_superuser(super_user) is True
|
|
|
|
|
|
# Additional test cases
|
|
def test_create_duplicate_email(db_session, mock_user):
|
|
user_data = UserCreate(
|
|
email=mock_user.email, # Try to create user with existing email
|
|
password="TestPassword123!",
|
|
first_name="Test",
|
|
last_name="User"
|
|
)
|
|
with pytest.raises(Exception): # Should raise an integrity error
|
|
user_crud.create(db_session, obj_in=user_data)
|
|
|
|
|
|
def test_update_user_preferences(db_session, mock_user):
|
|
preferences = {"theme": "dark", "notifications": True}
|
|
update_data = UserUpdate(preferences=preferences)
|
|
|
|
updated_user = user_crud.update(db_session, db_obj=mock_user, obj_in=update_data)
|
|
assert updated_user.preferences == preferences
|
|
|
|
|
|
def test_get_multi_users_pagination(db_session, user_create_data):
|
|
# Create 5 users
|
|
for i in range(5):
|
|
user_in = UserCreate(**{**user_create_data, "email": f"test{i}@example.com"})
|
|
user_crud.create(db_session, obj_in=user_in)
|
|
|
|
# Test pagination
|
|
first_page = user_crud.get_multi(db_session, skip=0, limit=2)
|
|
second_page = user_crud.get_multi(db_session, skip=2, limit=2)
|
|
|
|
assert len(first_page) == 2
|
|
assert len(second_page) == 2
|
|
assert first_page[0].id != second_page[0].id
|