Implemented user CRUD operations including creation, retrieval, updating, and deletion through a generic CRUD base class. Enhanced user schemas with additional attributes and created tests to verify functionality, covering edge cases such as duplicates and pagination. Updated the test suite with new fixtures and methods to support the tests.
126 lines
4.3 KiB
Python
126 lines
4.3 KiB
Python
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
|