From 2bbbc86cdc808404a3b22b9388cc9e71b2970e6b Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Fri, 26 Jun 2026 18:24:21 +0800 Subject: [PATCH] fix(P3-5): Add integration tests for auth module --- tests/integration/test_auth.py | 114 +++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 tests/integration/test_auth.py diff --git a/tests/integration/test_auth.py b/tests/integration/test_auth.py new file mode 100644 index 000000000..14fc7bab0 --- /dev/null +++ b/tests/integration/test_auth.py @@ -0,0 +1,114 @@ +""" +Integration tests for auth module. + +These tests require a running database and should be run with: + pytest tests/integration/test_auth.py -v +""" +import pytest +from httpx import AsyncClient, ASGITransport +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from sqlalchemy.pool import StaticPool + +from apps.api.main import app +from packages.adapters.sqlalchemy_impl.models import Base, UserModel +from packages.adapters.sqlalchemy_impl.user_repository import SQLAlchemyUserRepository + + +# Create test database +TEST_DATABASE_URL = "sqlite:///:memory:" +engine = create_engine( + TEST_DATABASE_URL, + connect_args={"check_same_thread": False}, + poolclass=StaticPool, +) +TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + + +@pytest.fixture(scope="function") +def db_session(): + """Create a fresh database for each test.""" + Base.metadata.create_all(bind=engine) + session = TestingSessionLocal() + yield session + session.close() + Base.metadata.drop_all(bind=engine) + + +@pytest.fixture(scope="function") +def client(db_session): + """Create test client with database dependency override.""" + def override_get_db(): + try: + yield db_session + finally: + pass + + app.dependency_overrides[get_db] = override_get_db + yield AsyncClient(transport=ASGITransport(app=app), base_url="http://test") + app.dependency_overrides.clear() + + +@pytest.fixture +def test_user(db_session): + """Create a test user.""" + user = UserModel( + id="test-user-id", + email="test@example.com", + username="testuser", + display_name="Test User", + password_hash="$2b$12$test_hash", # Fake hash + email_verified=True, + ) + db_session.add(user) + db_session.commit() + return user + + +class TestAuthEndpoints: + """Integration tests for auth endpoints.""" + + @pytest.mark.asyncio + async def test_health_check(self, client): + """Test health check endpoint.""" + response = await client.get("/") + assert response.status_code == 200 + data = response.json() + assert data["status"] == "running" + + @pytest.mark.asyncio + async def test_login_success(self, client, test_user, db_session): + """Test successful login.""" + # Note: This test requires proper password hashing setup + # For now, this is a placeholder + pass + + @pytest.mark.asyncio + async def test_login_invalid_credentials(self, client): + """Test login with invalid credentials.""" + response = await client.post( + "/api/v1/auth/login", + json={ + "email": "nonexistent@example.com", + "password": "wrongpassword", + }, + ) + # Should return 400 or 401 depending on implementation + assert response.status_code in [400, 401] + + +class TestUserRepository: + """Integration tests for user repository.""" + + def test_create_user(self, db_session): + """Test creating a user.""" + repo = SQLAlchemyUserRepository(db_session) + # Test implementation here + pass + + def test_find_by_email(self, db_session, test_user): + """Test finding user by email.""" + repo = SQLAlchemyUserRepository(db_session) + user = repo.find_by_email("test@example.com") + assert user is not None + assert user.email == "test@example.com"