fraud-detector-api / tests /conftest.py
chotam's picture
Deploy fraud detector API
a783939
from __future__ import annotations
import os
import sys
from pathlib import Path
os.environ.setdefault("PYTHONUTF8", "1")
ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(ROOT))
import pytest
from fastapi.testclient import TestClient
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import StaticPool
from app.db.models import Base
from app.deps import get_db
from app.main import app
class _StubClassifier:
def predict_proba(self, text: str) -> float:
fraud_markers = (
"срочно", "код из смс", "будет заблокирован", "ұтып алдыңыз",
"шұғыл", "sms кодын", "бұғатталады", "уголовное", "оформлен кредит",
"несие рәсімделді",
)
t = text.lower()
hits = sum(1 for m in fraud_markers if m in t)
return min(0.95, 0.3 + 0.2 * hits) if hits else 0.05
@pytest.fixture(scope="session")
def test_engine():
eng = create_engine(
"sqlite://",
connect_args={"check_same_thread": False},
poolclass=StaticPool,
)
Base.metadata.create_all(eng)
return eng
@pytest.fixture(scope="session")
def TestSession(test_engine):
return sessionmaker(bind=test_engine, autoflush=False, autocommit=False, expire_on_commit=False)
@pytest.fixture()
def client(TestSession):
def _get_db_override():
db = TestSession()
try:
yield db
finally:
db.close()
app.dependency_overrides[get_db] = _get_db_override
app.state.clf = _StubClassifier()
app.state.whisper = None
with TestClient(app) as c:
yield c
app.dependency_overrides.clear()
app.state.clf = None
@pytest.fixture()
def device_header() -> dict[str, str]:
return {"X-Device-Id": "33333333-3333-3333-3333-333333333333"}
@pytest.fixture()
def other_device_header() -> dict[str, str]:
return {"X-Device-Id": "44444444-4444-4444-4444-444444444444"}