90 lines
3.4 KiB
Python
90 lines
3.4 KiB
Python
"""Tests for the UserService class."""
|
|
|
|
from sqlmodel import SQLModel, Session, create_engine
|
|
|
|
from app.models.user import User
|
|
from app.services.user_service import UserService
|
|
|
|
|
|
class TestUserService:
|
|
"""Tests for user CRUD operations."""
|
|
|
|
def _setup(self):
|
|
"""Create an in-memory DB and service instance."""
|
|
engine = create_engine("sqlite:///:memory:")
|
|
SQLModel.metadata.create_all(engine)
|
|
session = Session(engine)
|
|
service = UserService(session)
|
|
return session, service
|
|
|
|
def test_create_user(self) -> None:
|
|
"""create_user should insert a new user and return it."""
|
|
session, service = self._setup()
|
|
user = service.create_user(
|
|
username="phil",
|
|
password_hash="hashed",
|
|
display_name="Phillip",
|
|
height="6'0\"",
|
|
weight="260 lbs",
|
|
goals="Muscle build",
|
|
is_admin=False,
|
|
)
|
|
assert user.id is not None
|
|
assert user.username == "phil"
|
|
session.close()
|
|
|
|
def test_get_user_by_id(self) -> None:
|
|
"""get_user_by_id should return the correct user."""
|
|
session, service = self._setup()
|
|
created = service.create_user(
|
|
username="test", password_hash="h", display_name="Test"
|
|
)
|
|
found = service.get_user_by_id(created.id)
|
|
assert found is not None
|
|
assert found.username == "test"
|
|
session.close()
|
|
|
|
def test_get_user_by_username(self) -> None:
|
|
"""get_user_by_username should return the correct user."""
|
|
session, service = self._setup()
|
|
service.create_user(username="admin", password_hash="h", display_name="Admin")
|
|
found = service.get_user_by_username("admin")
|
|
assert found is not None
|
|
assert found.display_name == "Admin"
|
|
session.close()
|
|
|
|
def test_get_user_by_username_not_found(self) -> None:
|
|
"""get_user_by_username should return None for missing users."""
|
|
session, service = self._setup()
|
|
found = service.get_user_by_username("nonexistent")
|
|
assert found is None
|
|
session.close()
|
|
|
|
def test_list_users(self) -> None:
|
|
"""list_users should return all users."""
|
|
session, service = self._setup()
|
|
service.create_user(username="a", password_hash="h", display_name="A")
|
|
service.create_user(username="b", password_hash="h", display_name="B")
|
|
users = service.list_users()
|
|
assert len(users) == 2
|
|
session.close()
|
|
|
|
def test_list_non_admin_users(self) -> None:
|
|
"""list_users with exclude_admin=True should skip admin users."""
|
|
session, service = self._setup()
|
|
service.create_user(username="admin", password_hash="h", display_name="Admin", is_admin=True)
|
|
service.create_user(username="user", password_hash="h", display_name="User", is_admin=False)
|
|
users = service.list_users(exclude_admin=True)
|
|
assert len(users) == 1
|
|
assert users[0].username == "user"
|
|
session.close()
|
|
|
|
def test_update_user(self) -> None:
|
|
"""update_user should modify the specified fields."""
|
|
session, service = self._setup()
|
|
user = service.create_user(username="u", password_hash="h", display_name="Old")
|
|
updated = service.update_user(user.id, display_name="New", weight="250 lbs")
|
|
assert updated.display_name == "New"
|
|
assert updated.weight == "250 lbs"
|
|
session.close()
|