Skip to content

Commit

Permalink
add user creation unit test
Browse files Browse the repository at this point in the history
lint

lint
  • Loading branch information
mmiqball committed Nov 3, 2024
1 parent 287d434 commit 5f8fb34
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 26 deletions.
2 changes: 1 addition & 1 deletion backend/app/services/implementations/user_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ async def create_user(self, user: UserCreate) -> UserInDB:
firebase_admin.auth.delete_user(firebase_user.uid)
except firebase_admin.auth.AuthError as firebase_error:
self.logger.error(
"Failed to delete Firebase user after database insertion failed. "
"Failed to delete Firebase user after database insertion failed"
f"Firebase UID: {firebase_user.uid}. "
f"Error: {str(firebase_error)}"
)
Expand Down
Binary file added backend/test.db
Binary file not shown.
25 changes: 0 additions & 25 deletions backend/tests/unit/test_models.py

This file was deleted.

127 changes: 127 additions & 0 deletions backend/tests/unit/test_user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

from app.models import Role
from app.models.Base import Base
from app.models.User import User
from app.schemas.user import UserCreate, UserInDB, UserRole
from app.services.implementations.user_service import UserService

# Test DB Configuration
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)


class MockFirebaseUser:
"""Mock Firebase user response"""

def __init__(self):
self.uid = "test_firebase_uid"
self.email = "[email protected]"


class MockFirebaseError(Exception):
"""Mock Firebase error"""

pass


class MockAuthError(MockFirebaseError):
"""Mock Firebase auth error"""

def __init__(self, code, message):
self.code = code
self.message = message
super().__init__(f"{code}: {message}")


@pytest.fixture
def mock_firebase_auth(monkeypatch):
"""Mock Firebase authentication service"""

class MockAuth:
def create_user(self, email, password):
return MockFirebaseUser()

def get_user_by_email(self, email):
return MockFirebaseUser()

def delete_user(self, uid):
pass

AuthError = MockAuthError

mock_auth = MockAuth()
monkeypatch.setattr("firebase_admin.auth", mock_auth)
return mock_auth


@pytest.fixture(scope="function")
def db_session():
"""Provide a clean database session for each test"""
Base.metadata.create_all(bind=engine)
session = TestingSessionLocal()

try:
# Clean up any existing data first
session.query(User).delete()
session.query(Role).delete()
session.commit()

# Create test role
test_role = Role(id=1, name=UserRole.PARTICIPANT)
session.add(test_role)
session.commit()

yield session
finally:
session.rollback()
session.close()
# Clean up
session = TestingSessionLocal()
session.query(User).delete()
session.query(Role).delete()
session.commit()
session.close()
Base.metadata.drop_all(bind=engine)


@pytest.mark.asyncio
async def test_create_user_service(mock_firebase_auth, db_session):
"""Test user creation flow including Firebase auth and database storage"""
try:
# Arrange
user_service = UserService(db_session)
user_data = UserCreate(
first_name="Test",
last_name="User",
email="[email protected]",
password="TestPass@123",
role=UserRole.PARTICIPANT,
)

# Act
created_user = await user_service.create_user(user_data)

# Assert response
assert isinstance(created_user, UserInDB)
assert created_user.first_name == "Test"
assert created_user.last_name == "User"
assert created_user.email == "[email protected]"
assert created_user.role_id == 1
assert created_user.auth_id == "test_firebase_uid"

# Assert database state
db_user = db_session.query(User).filter_by(email="[email protected]").first()
assert db_user is not None
assert db_user.auth_id == "test_firebase_uid"
assert db_user.role_id == 1

db_session.commit() # Commit successful test
except Exception:
db_session.rollback() # Rollback on error
raise

0 comments on commit 5f8fb34

Please sign in to comment.