Skip to content

Commit e7a13e9

Browse files
committed
tests: Fix database connection errors by adding shared conftest fixture
1 parent b2af2bf commit e7a13e9

3 files changed

Lines changed: 65 additions & 57 deletions

File tree

tests/conftest.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import os
2+
import pytest
3+
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
4+
from sqlmodel import SQLModel
5+
6+
from src.core.config import settings
7+
from src.core import database
8+
9+
# Test Database URL
10+
TEST_DATABASE_URL = "sqlite+aiosqlite:///test_commitguard.db"
11+
12+
@pytest.fixture(autouse=True, scope="session")
13+
def override_db_url():
14+
"""Override database URL for the entire test session."""
15+
original_url = settings.DATABASE_URL
16+
settings.DATABASE_URL = TEST_DATABASE_URL
17+
yield
18+
settings.DATABASE_URL = original_url
19+
20+
@pytest.fixture(autouse=True)
21+
async def setup_test_db():
22+
"""Initialize test database before each test."""
23+
# Ensure database engine and session maker use the test URL
24+
original_engine = database.engine
25+
original_session_local = database.AsyncSessionLocal
26+
27+
database.engine = create_async_engine(TEST_DATABASE_URL)
28+
new_session_local = async_sessionmaker(
29+
bind=database.engine,
30+
class_=AsyncSession,
31+
expire_on_commit=False,
32+
autoflush=False,
33+
)
34+
database.AsyncSessionLocal = new_session_local
35+
36+
# Patch src.agents.learning if it's already imported
37+
import sys
38+
if "src.agents.learning" in sys.modules:
39+
import src.agents.learning
40+
src.agents.learning.AsyncSessionLocal = new_session_local
41+
42+
async with database.engine.begin() as conn:
43+
await conn.run_sync(SQLModel.metadata.create_all)
44+
45+
yield
46+
47+
async with database.engine.begin() as conn:
48+
await conn.run_sync(SQLModel.metadata.drop_all)
49+
50+
await database.engine.dispose()
51+
database.engine = original_engine
52+
database.AsyncSessionLocal = original_session_local
53+
54+
if "src.agents.learning" in sys.modules:
55+
import src.agents.learning
56+
src.agents.learning.AsyncSessionLocal = original_session_local
57+
58+
if os.path.exists("test_commitguard.db"):
59+
try:
60+
os.remove("test_commitguard.db")
61+
except PermissionError:
62+
pass

tests/test_database.py

Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
1-
import os
2-
31
import pytest
4-
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
5-
from sqlmodel import SQLModel
62

7-
from src.core.config import settings
83
from src.core.database import (
94
get_user_by_git_email,
105
get_user_reliability,
@@ -14,44 +9,7 @@
149
update_user_reliability,
1510
)
1611

17-
# Test Database URL
18-
TEST_DATABASE_URL = "sqlite+aiosqlite:///test_commitguard.db"
19-
20-
21-
@pytest.fixture(autouse=True)
22-
async def setup_test_db():
23-
# Override settings for testing
24-
original_url = settings.DATABASE_URL
25-
settings.DATABASE_URL = TEST_DATABASE_URL
26-
27-
from src.core import database
28-
29-
original_engine = database.engine
30-
original_session_local = database.AsyncSessionLocal
31-
32-
database.engine = create_async_engine(TEST_DATABASE_URL)
33-
database.AsyncSessionLocal = async_sessionmaker(
34-
bind=database.engine,
35-
class_=AsyncSession,
36-
expire_on_commit=False,
37-
autoflush=False,
38-
)
39-
40-
async with database.engine.begin() as conn:
41-
await conn.run_sync(SQLModel.metadata.create_all)
42-
43-
yield
44-
45-
async with database.engine.begin() as conn:
46-
await conn.run_sync(SQLModel.metadata.drop_all)
47-
48-
await database.engine.dispose()
49-
database.engine = original_engine
50-
database.AsyncSessionLocal = original_session_local
51-
settings.DATABASE_URL = original_url
52-
53-
if os.path.exists("test_commitguard.db"):
54-
os.remove("test_commitguard.db")
12+
# Using shared setup_test_db fixture from conftest.py
5513

5614

5715
@pytest.mark.asyncio

tests/test_roadmap.py

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,8 @@
33
from src.agents.brain import CommitGuardBrain
44
from src.agents.safety import SafetySupervisor
55
from src.agents.learning import SupervisorFeedbackLoop
6-
from src.schemas.agents import ToneType, SafetyAudit, SafetyFeedback
7-
from src.core.database import init_db
8-
9-
10-
@pytest.fixture(autouse=True)
11-
async def setup_db():
12-
"""Ensure database is initialized and clean."""
13-
await init_db()
14-
from src.core.database import AsyncSessionLocal
15-
from sqlmodel import delete
16-
17-
async with AsyncSessionLocal() as session:
18-
await session.execute(delete(SafetyFeedback))
19-
await session.commit()
6+
from src.schemas.agents import ToneType, SafetyAudit
7+
# Using shared setup_test_db fixture from conftest.py
208

219

2210
@pytest.mark.asyncio

0 commit comments

Comments
 (0)