Newer
Older
gnexus-tasks / backend / tests / conftest.py
"""Фикстуры тестов: in-memory БД и авторизация-заглушка."""

from collections.abc import Iterator
from typing import Any

import pytest
from fastapi.testclient import TestClient
from sqlalchemy import create_engine
from sqlalchemy.orm import Session, sessionmaker
from sqlalchemy.pool import StaticPool

from app.db import Base
from app.dependencies import get_db, require_user
from app.main import app

TEST_DB_URL = "sqlite://"

_engine = create_engine(
    TEST_DB_URL,
    connect_args={"check_same_thread": False},
    poolclass=StaticPool,
)
Base.metadata.create_all(_engine)
_test_session_factory = sessionmaker(bind=_engine, expire_on_commit=False)


def _override_get_db() -> Iterator[Session]:
    session = _test_session_factory()
    try:
        yield session
        session.commit()
    except Exception:
        session.rollback()
        raise
    finally:
        session.close()


app.dependency_overrides[get_db] = _override_get_db

AUTH_USER: dict[str, str] = {"user_id": "1", "email": "test@example.com"}
app.dependency_overrides[require_user] = lambda: AUTH_USER


@pytest.fixture
def client() -> Iterator[TestClient]:
    with TestClient(app) as c:
        yield c


def create_task(client: TestClient, title: str = "тестовая задача") -> dict[str, Any]:
    resp = client.post("/api/tasks", json={"title": title})
    assert resp.status_code == 200, resp.text
    task_id = resp.json()["id"]
    resp = client.get(f"/api/tasks/{task_id}")
    assert resp.status_code == 200, resp.text
    return resp.json()