File size: 2,067 Bytes
a783939
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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"}