Skip to content

Commit 3d87816

Browse files
authored
Merge pull request #15 from getmarkus/cm-branch-13
feat(tests): add session and client fixtures for tests
2 parents 3279f18 + 241be04 commit 3d87816

File tree

6 files changed

+51
-53
lines changed

6 files changed

+51
-53
lines changed

app/resource_adapters/persistence/sqlmodel/database.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from loguru import logger
44
from sqlalchemy.engine import Engine
5+
from sqlalchemy.pool import StaticPool
56
from sqlmodel import Session, SQLModel, create_engine
67

78
from config import Settings
@@ -24,14 +25,14 @@ def get_engine(database_url: str | None = None) -> Engine:
2425
if database_url is None:
2526
database_url = Settings.get_settings().database_url
2627

27-
_engine = create_engine(
28-
database_url, echo=True
29-
)
28+
_engine = create_engine(database_url, echo=True)
3029
# Initialize database if using SQLModel
31-
if Settings.get_settings().execution_mode == "sqlmodel" and not Settings.get_settings().migrate_database:
30+
if (
31+
Settings.get_settings().execution_mode == "sqlmodel"
32+
and not Settings.get_settings().migrate_database
33+
):
3234
logger.info("Creating database tables...")
3335
SQLModel.metadata.create_all(_engine)
3436
logger.info("Database tables created successfully")
35-
36-
return _engine
3737

38+
return _engine

app/tests/conftest.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import pytest
2+
from fastapi.testclient import TestClient
3+
from sqlmodel import Session, delete
4+
5+
from app.resource_adapters.persistence.sqlmodel.database import get_engine, get_db
6+
from app.resource_adapters.persistence.sqlmodel.issues import Issue
7+
from main import app
8+
9+
10+
@pytest.fixture(name="session", autouse=True)
11+
def session_fixture():
12+
13+
with Session(get_engine()) as session:
14+
yield session
15+
statement = delete(Issue)
16+
session.exec(statement)
17+
session.commit()
18+
19+
20+
@pytest.fixture(name="client")
21+
def client_fixture(session: Session):
22+
def get_session_override():
23+
return session
24+
25+
app.dependency_overrides[get_db] = get_session_override
26+
27+
with TestClient(app) as client:
28+
yield client
29+
app.dependency_overrides.clear()

app/tests/test_issues.py

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,13 @@
11
import pytest
22
from fastapi.testclient import TestClient
3-
from sqlmodel import Session, SQLModel, create_engine
4-
from sqlmodel.pool import StaticPool
3+
from sqlmodel import Session
54

6-
from main import app
75
from app.core.usecases.analyze_issue import AnalyzeIssue
86
from app.domain.issue import Issue, IssueState
97
from app.interface_adapters.exceptions import NotFoundException
10-
from app.resource_adapters.persistence.sqlmodel.database import get_db
118
from app.resource_adapters.persistence.sqlmodel.issues import SQLModelIssueRepository
129

1310

14-
# https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/
15-
@pytest.fixture(name="session")
16-
def session_fixture():
17-
engine = create_engine(
18-
"sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool
19-
)
20-
SQLModel.metadata.create_all(engine)
21-
with Session(engine) as session:
22-
yield session
23-
24-
25-
@pytest.fixture(name="client")
26-
def client_fixture(session: Session):
27-
def get_session_override():
28-
return session
29-
30-
app.dependency_overrides[get_db] = get_session_override
31-
with TestClient(app, raise_server_exceptions=False) as client:
32-
yield client
33-
app.dependency_overrides.clear()
34-
35-
3611
def test_analyze_issue_command(client: TestClient, session: Session):
3712
# Test case 1: Successful analysis
3813
issue_number = 1
@@ -80,6 +55,7 @@ def test_analyze_issue_not_found(client: TestClient, session: Session):
8055

8156
response = client.post("/issues/1/analyze")
8257
assert response.status_code == 404
58+
assert response.json() == {"version": 1, "issue_number": 1}
8359

8460

8561
def test_analyze_issue_invalid_number(client: TestClient, session: Session):

config.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ class Settings(BaseSettings):
1717
env_smoke_test: str = ""
1818
project_name: str = ""
1919
database_url: str = "sqlite:///./issues.db"
20-
#database_url: str = "sqlite://"
2120
migrate_database: bool = False
2221
# BACKEND_CORS_ORIGINS is a JSON-formatted list of origins
2322
# e.g: '["http://localhost", "http://localhost:4200", "http://localhost:3000", \

pyproject.toml

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,4 @@ requires = ["hatchling"]
2323
build-backend = "hatchling.build"
2424

2525
[dependency-groups]
26-
dev = [
27-
"pytest>=8.3.4",
28-
]
29-
30-
[tool.pytest.ini_options]
31-
asyncio_mode = "auto"
32-
anyio_backend = "asyncio"
33-
asyncio_default_fixture_loop_scope = "function"
26+
dev = ["pytest>=8.3.4"]

uv.lock

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)