Files
trade-assistant/backend/tests/conftest.py
T
TradeMate Dev 5d2bced39f docs: update project docs and clean up redundant files
- PROGRESS.md: update to 2026-05-29 with security hardening (T-005),
  4-frontend architecture, AI provider refactoring, discovery features,
  landing page/referral/quota, desktop layout, admin AI management
- AGENTS.md: add AI provider list (Alibaba/NVIDIA, removed Claude/DeepL/Local),
  DB-driven config, CSRF/rate-limit/CORS notes, admin_ai reload quirk
- .env.example: sync with actual config, replace deprecated providers
  with current Sensenova/OpencodeGo/NVIDIA/Spark/Alibaba
- docs/PROJECT_STATUS.md: archive (fully superseded by PROGRESS.md)
- Remove generated JS files (_bing_search.js, _batch_search.js)
- Remove empty directories (data/corpus, data/models)
- Remove backend/.coverage (test artifact)
- Fix services/.gitignore to cover _bing_search.js
- Include pending AI provider DB admin feature (admin_ai, AIProvider model,
  AIProviders.vue, migration) and T-008 test report
2026-05-29 11:15:33 +08:00

160 lines
4.6 KiB
Python

import pytest
import asyncio
from typing import AsyncGenerator
from httpx import AsyncClient, ASGITransport
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# Mock aliyunsdkalimt before importing app.main
import types
aliyunsdkalimt = types.ModuleType('aliyunsdkalimt')
aliyunsdkalimt.__path__ = ['/tmp/mock_aliyunsdkalimt']
sys.modules['aliyunsdkalimt'] = aliyunsdkalimt
aliyunsdkalimt_request = types.ModuleType('aliyunsdkalimt.request')
aliyunsdkalimt_request.__path__ = ['/tmp/mock_aliyunsdkalimt/request']
sys.modules['aliyunsdkalimt.request'] = aliyunsdkalimt_request
aliyunsdkalimt_request_v20181012 = types.ModuleType('aliyunsdkalimt.request.v20181012')
sys.modules['aliyunsdkalimt.request.v20181012'] = aliyunsdkalimt_request_v20181012
class TranslateGeneralRequest:
def __init__(self):
self.source_text = None
self.source_language = None
self.target_language = None
self.scene = None
def setSourceText(self, text):
self.source_text = text
def setSourceLanguage(self, lang):
self.source_language = lang
def setTargetLanguage(self, lang):
self.target_language = lang
def setScene(self, scene):
self.scene = scene
class TranslateECommerceRequest:
def __init__(self):
self.source_text = None
self.source_language = None
self.target_language = None
self.scene = None
def setSourceText(self, text):
self.source_text = text
def setSourceLanguage(self, lang):
self.source_language = lang
def setTargetLanguage(self, lang):
self.target_language = lang
def setScene(self, scene):
self.scene = scene
aliyunsdkalimt_request_v20181012.TranslateGeneralRequest = TranslateGeneralRequest
aliyunsdkalimt_request_v20181012.TranslateECommerceRequest = TranslateECommerceRequest
# Mock AcsClient
aliyunsdkcore = types.ModuleType('aliyunsdkcore')
aliyunsdkcore_client = types.ModuleType('aliyunsdkcore.client')
class AcsClient:
def __init__(self, *args, **kwargs):
pass
def do_action(self, request):
return b'{"TranslateResult": "mock translation"}'
aliyunsdkcore_client.AcsClient = AcsClient
sys.modules['aliyunsdkcore'] = aliyunsdkcore
sys.modules['aliyunsdkcore.client'] = aliyunsdkcore_client
from app.main import app
from app.database import Base, get_db
from app.models.user import User
from app.core.security import hash_password
TEST_DATABASE_URL = "postgresql+asyncpg://admin:dWFNi67nHNbPbjmP@localhost:5432/foreign_trade_test"
test_engine = create_async_engine(TEST_DATABASE_URL, echo=False)
TestAsyncSessionLocal = sessionmaker(
test_engine,
class_=AsyncSession,
expire_on_commit=False,
)
@pytest.fixture(scope="module")
def event_loop():
loop = asyncio.get_event_loop_policy().new_event_loop()
yield loop
loop.close()
@pytest.fixture(scope="function")
async def db_session() -> AsyncGenerator[AsyncSession, None]:
async with test_engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async with TestAsyncSessionLocal() as session:
yield session
async with test_engine.begin() as conn:
await conn.run_sync(Base.metadata.drop_all)
@pytest.fixture(scope="function")
async def client(db_session: AsyncSession) -> AsyncGenerator[AsyncClient, None]:
async def override_get_db():
yield db_session
app.dependency_overrides[get_db] = override_get_db
async with AsyncClient(
transport=ASGITransport(app=app),
base_url="http://test"
) as ac:
yield ac
app.dependency_overrides.clear()
@pytest.fixture
async def test_user(db_session: AsyncSession) -> User:
user = User(
phone="13800138000",
username="test_user",
password_hash=hash_password("test123456"),
tier="free",
)
db_session.add(user)
await db_session.commit()
await db_session.refresh(user)
return user
@pytest.fixture
async def auth_headers(test_user: User) -> dict:
from app.core.security import create_access_token
token = create_access_token({"sub": str(test_user.id), "tier": test_user.tier})
return {"Authorization": f"Bearer {token}"}
# Mark all async test functions with pytest.mark.asyncio
def pytest_collection_modifyitems(items):
for item in items:
if hasattr(item, 'function') and asyncio.iscoroutinefunction(item.function):
item.add_marker(pytest.mark.asyncio)