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
This commit is contained in:
TradeMate Dev
2026-05-29 11:15:33 +08:00
parent c04fa2c19f
commit 5d2bced39f
31 changed files with 1933 additions and 816 deletions
+80 -2
View File
@@ -9,6 +9,77 @@ 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
@@ -25,7 +96,7 @@ TestAsyncSessionLocal = sessionmaker(
)
@pytest.fixture(scope="session")
@pytest.fixture(scope="module")
def event_loop():
loop = asyncio.get_event_loop_policy().new_event_loop()
yield loop
@@ -78,4 +149,11 @@ async def test_user(db_session: AsyncSession) -> User:
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}"}
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)