|
|
"""Unit tests for database module.""" |
|
|
|
|
|
import pytest |
|
|
from sqlalchemy.orm import Session |
|
|
|
|
|
from app.database import get_db, init_db, SessionLocal, Base, engine |
|
|
|
|
|
|
|
|
class TestDatabase: |
|
|
"""Test database initialization and session management.""" |
|
|
|
|
|
def test_init_db_creates_tables(self): |
|
|
"""Test that init_db creates all model tables.""" |
|
|
init_db() |
|
|
|
|
|
|
|
|
from app.models import User, Project, Task, LogEntry, ProjectMembership |
|
|
|
|
|
|
|
|
assert "users" in Base.metadata.tables |
|
|
assert "projects" in Base.metadata.tables |
|
|
assert "tasks" in Base.metadata.tables |
|
|
assert "log_entries" in Base.metadata.tables |
|
|
assert "project_memberships" in Base.metadata.tables |
|
|
|
|
|
def test_session_local_returns_session(self): |
|
|
"""Test SessionLocal creates a valid session.""" |
|
|
session = SessionLocal() |
|
|
assert isinstance(session, Session) |
|
|
session.close() |
|
|
|
|
|
def test_get_db_yields_session(self): |
|
|
"""Test get_db generator yields a session and closes it.""" |
|
|
gen = get_db() |
|
|
db = next(gen) |
|
|
|
|
|
assert isinstance(db, Session) |
|
|
|
|
|
|
|
|
try: |
|
|
next(gen) |
|
|
except StopIteration: |
|
|
pass |
|
|
|
|
|
def test_get_db_closes_on_exception(self): |
|
|
"""Test get_db closes session even on exception.""" |
|
|
gen = get_db() |
|
|
db = next(gen) |
|
|
|
|
|
|
|
|
try: |
|
|
gen.throw(Exception("test error")) |
|
|
except Exception: |
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestDatabaseEngine: |
|
|
"""Test database engine configuration.""" |
|
|
|
|
|
def test_engine_is_sqlite(self): |
|
|
"""Test engine is configured for SQLite.""" |
|
|
assert "sqlite" in str(engine.url) |
|
|
|
|
|
def test_engine_allows_multithread(self): |
|
|
"""Test SQLite is configured for multi-threaded access.""" |
|
|
|
|
|
assert engine.pool is not None |
|
|
|