82 lines
2.2 KiB
Python
82 lines
2.2 KiB
Python
import asyncio
|
|
from contextlib import contextmanager
|
|
import os
|
|
|
|
import pytest
|
|
from fastapi.testclient import TestClient
|
|
|
|
|
|
from src.db.base import SessionLocal
|
|
from src.db.session import get_db
|
|
from src.main import app
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
def client():
|
|
db_ref = SessionLocal()
|
|
loop_ref = None
|
|
|
|
async def _get_db():
|
|
nonlocal loop_ref
|
|
loop_ref = asyncio.get_running_loop()
|
|
try:
|
|
yield db_ref
|
|
await db_ref.flush()
|
|
except:
|
|
await db_ref.rollback()
|
|
raise
|
|
|
|
app.dependency_overrides[get_db] = _get_db
|
|
with TestClient(app) as test_client:
|
|
try:
|
|
yield test_client
|
|
finally:
|
|
if db_ref is not None and loop_ref:
|
|
async def cleanup():
|
|
await db_ref.rollback()
|
|
await db_ref.close()
|
|
|
|
future = asyncio.run_coroutine_threadsafe(cleanup(), loop_ref)
|
|
future.result()
|
|
app.dependency_overrides.clear()
|
|
|
|
|
|
@pytest.fixture
|
|
def admin_password() -> str:
|
|
# Пароль админа берём из окружения, чтобы не хардкодить локальные отличия.
|
|
return os.getenv("OPENBAO__TEST_ADMIN_PASSWORD", "admin123")
|
|
|
|
|
|
@pytest.fixture
|
|
def isp_password() -> str:
|
|
# Пароль админа берём из окружения, чтобы не хардкодить локальные отличия.
|
|
return os.getenv("OPENBAO__TEST_EXECUTOR_PASSWORD", "admin123")
|
|
|
|
|
|
@pytest.fixture
|
|
def admin_tokens(client, admin_password: str):
|
|
response = client.post(
|
|
"/api/v1/auth/login",
|
|
json={"username": "admin", "password": admin_password},
|
|
)
|
|
assert response.status_code == 200
|
|
return response.json()
|
|
|
|
|
|
@pytest.fixture
|
|
def auth_headers():
|
|
def _build(tokens: dict) -> dict:
|
|
return {"Authorization": f"Bearer {tokens['access_token']}"}
|
|
|
|
return _build
|
|
|
|
@pytest.fixture
|
|
def isp_tokens(client, isp_password: str):
|
|
response = client.post(
|
|
"/api/v1/auth/login",
|
|
json={"username": "isp1", "password": isp_password},
|
|
)
|
|
assert response.status_code == 200
|
|
return response.json()
|