feat(feishu): 添加飞书入站事件inbox和混合数据库协调功能 - 实现飞书入站事件持久化inbox机制,支持状态管理、租约锁定和重试退避 - 添加混合数据库基线协调工具,确保平台PostgreSQL结构安全对齐 - 增加运行组件心跳检测和readiness就绪检查机制 - 实现app_ticket事件的安全轮换和验证处理 - 添加生产环境运行编排和fail-closed安全机制 - 支持webhook快速确认和长连接独立进程处理 - 完善个人数据擦除时的待处理事件清理功能 ```
62 lines
2.0 KiB
Python
62 lines
2.0 KiB
Python
import os
|
|
import sys
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
|
|
_database_file = tempfile.NamedTemporaryFile(
|
|
prefix="company-ai-platform-tests-",
|
|
suffix=".db",
|
|
delete=False,
|
|
)
|
|
_database_file.close()
|
|
_database_path = Path(_database_file.name)
|
|
|
|
# This module is loaded before test modules are imported. Keep every suite run isolated
|
|
# from a developer's local .env, database, queues, and external AI/Feishu credentials.
|
|
os.environ.update(
|
|
{
|
|
"COMPANY_AI_DISABLE_DOTENV": "true",
|
|
"APP_ENV": "test",
|
|
"DATABASE_URL": f"sqlite:///{_database_path.as_posix()}",
|
|
"LEGACY_DATABASE_URL": "",
|
|
"LEGACY_ALLOWED_QUERIES": "{}",
|
|
"LEGACY_PROJECT_QUERY": "",
|
|
"LEGACY_TASK_QUERY": "",
|
|
"API_KEY": "test-key",
|
|
"API_KEYS": "[]",
|
|
"AUDIT_API_KEY": "audit-key",
|
|
"AUDIT_API_KEYS": "[]",
|
|
"AUDIT_API_ACTOR": "audit-manager",
|
|
"MODEL_PROVIDER": "noop",
|
|
"DIRECT_LLM_API_KEY": "",
|
|
"HERMES_API_KEY": "",
|
|
"OPENCLAW_API_KEY": "",
|
|
"OPENCLAW_GATEWAY_TOKEN": "",
|
|
"FEISHU_APP_ID": "",
|
|
"FEISHU_APP_SECRET": "",
|
|
"FEISHU_ENCRYPT_KEY": "",
|
|
"FEISHU_DEFAULT_CHAT_ID": "",
|
|
"FEISHU_VERIFICATION_TOKEN": "test-feishu-token",
|
|
"FEISHU_EVENT_TRANSPORT": "webhook",
|
|
"FEISHU_ADMIN_IDENTITIES": "",
|
|
"FEISHU_USER_FEATURES_ENABLED": "false",
|
|
"MARKET_DATA_TOKEN": "",
|
|
"SCHEDULER_ENABLED": "false",
|
|
"TASK_QUEUE_ENABLED": "false",
|
|
"TASK_QUEUE_ALWAYS_EAGER": "false",
|
|
"LEGACY_SYNC_ENABLED": "false",
|
|
}
|
|
)
|
|
|
|
|
|
def pytest_sessionfinish() -> None:
|
|
"""Remove the suite database after every test module has finished."""
|
|
|
|
database_module = sys.modules.get("app.core.database.session")
|
|
if database_module is not None:
|
|
database_module.engine.dispose()
|
|
if database_module.legacy_engine is not None:
|
|
database_module.legacy_engine.dispose()
|
|
_database_path.unlink(missing_ok=True)
|