"""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()