120 lines
4.0 KiB
Python
120 lines
4.0 KiB
Python
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
"""
|
|||
|
|
测试配置。从项目 soul-api/.env* 或 scripts/test/.env.test 或环境变量读取。
|
|||
|
|
必须明确指定测试环境,避免误测正式库。
|
|||
|
|
"""
|
|||
|
|
import os
|
|||
|
|
from pathlib import Path
|
|||
|
|
|
|||
|
|
# 项目根目录(scripts/test 的上级的上级)
|
|||
|
|
PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent
|
|||
|
|
SOUL_API_ENV = PROJECT_ROOT / "soul-api"
|
|||
|
|
TEST_DIR = Path(__file__).resolve().parent
|
|||
|
|
|
|||
|
|
|
|||
|
|
def _apply_env_file(path: Path) -> None:
|
|||
|
|
"""将 .env 文件中的变量加载到 os.environ(仅当未设置时)"""
|
|||
|
|
if not path.exists():
|
|||
|
|
return
|
|||
|
|
for line in path.read_text(encoding="utf-8", errors="ignore").splitlines():
|
|||
|
|
line = line.strip()
|
|||
|
|
if not line or line.startswith("#") or "=" not in line:
|
|||
|
|
continue
|
|||
|
|
k, v = line.split("=", 1)
|
|||
|
|
k = k.strip()
|
|||
|
|
v = v.strip().strip('"').strip("'")
|
|||
|
|
if k and k not in os.environ:
|
|||
|
|
os.environ[k] = v
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 优先加载 scripts/test/.env.test(本地覆盖)
|
|||
|
|
_apply_env_file(TEST_DIR / ".env.test")
|
|||
|
|
|
|||
|
|
# 环境与 API 地址映射(与 miniprogram/app.js、soul-api/.env* 一致)
|
|||
|
|
ENV_PROFILES = {
|
|||
|
|
"local": "http://localhost:8080",
|
|||
|
|
"souldev": "https://souldev.quwanzhi.com",
|
|||
|
|
"soulapi": "https://soulapi.quwanzhi.com",
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 环境中文名(用于提示)
|
|||
|
|
ENV_LABELS = {
|
|||
|
|
"local": "本地",
|
|||
|
|
"souldev": "测试",
|
|||
|
|
"soulapi": "正式",
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
def _load_env_file(path: Path) -> dict:
|
|||
|
|
"""解析 .env 文件为 dict"""
|
|||
|
|
out = {}
|
|||
|
|
if not path.exists():
|
|||
|
|
return out
|
|||
|
|
for line in path.read_text(encoding="utf-8", errors="ignore").splitlines():
|
|||
|
|
line = line.strip()
|
|||
|
|
if not line or line.startswith("#") or "=" not in line:
|
|||
|
|
continue
|
|||
|
|
k, v = line.split("=", 1)
|
|||
|
|
out[k.strip()] = v.strip().strip('"').strip("'")
|
|||
|
|
return out
|
|||
|
|
|
|||
|
|
|
|||
|
|
def _resolve_api_base() -> tuple[str, str]:
|
|||
|
|
"""
|
|||
|
|
解析 API 地址与当前环境标签。
|
|||
|
|
优先级:SOUL_TEST_ENV > SOUL_API_BASE > 从 soul-api/.env 读取 > 默认 local
|
|||
|
|
"""
|
|||
|
|
env_val = os.environ.get("SOUL_TEST_ENV", "").strip().lower()
|
|||
|
|
explicit_base = os.environ.get("SOUL_API_BASE", "").strip().rstrip("/")
|
|||
|
|
|
|||
|
|
if explicit_base:
|
|||
|
|
# 显式指定了地址,根据地址推断环境标签
|
|||
|
|
label = "自定义"
|
|||
|
|
for k, v in ENV_PROFILES.items():
|
|||
|
|
if v.rstrip("/") == explicit_base:
|
|||
|
|
label = ENV_LABELS.get(k, k)
|
|||
|
|
break
|
|||
|
|
return explicit_base, label
|
|||
|
|
|
|||
|
|
if env_val in ENV_PROFILES:
|
|||
|
|
return ENV_PROFILES[env_val], ENV_LABELS.get(env_val, env_val)
|
|||
|
|
|
|||
|
|
# 尝试从 soul-api/.env 读取 API_BASE_URL
|
|||
|
|
env_path = SOUL_API_ENV / ".env"
|
|||
|
|
env_dev = SOUL_API_ENV / ".env.development"
|
|||
|
|
env_prod = SOUL_API_ENV / ".env.production"
|
|||
|
|
for p in [env_path, env_dev, env_prod]:
|
|||
|
|
loaded = _load_env_file(p)
|
|||
|
|
if loaded.get("API_BASE_URL"):
|
|||
|
|
base = loaded["API_BASE_URL"].rstrip("/")
|
|||
|
|
for k, v in ENV_PROFILES.items():
|
|||
|
|
if v.rstrip("/") == base:
|
|||
|
|
return base, ENV_LABELS.get(k, k)
|
|||
|
|
return base, "项目配置"
|
|||
|
|
|
|||
|
|
# 默认本地,并提示未显式指定
|
|||
|
|
return ENV_PROFILES["local"], ENV_LABELS["local"]
|
|||
|
|
|
|||
|
|
|
|||
|
|
API_BASE, ENV_LABEL = _resolve_api_base()
|
|||
|
|
|
|||
|
|
# 管理端登录(与 scripts/本地启动.sh 一致;不同环境账号可能不同)
|
|||
|
|
ADMIN_USERNAME = os.environ.get("SOUL_ADMIN_USERNAME", "admin")
|
|||
|
|
ADMIN_PASSWORD = os.environ.get("SOUL_ADMIN_PASSWORD", "admin123")
|
|||
|
|
|
|||
|
|
# 小程序开发环境登录用 userId(仅 local/souldev 且 APP_ENV=development 时可用)
|
|||
|
|
MINIAPP_DEV_USER_ID = os.environ.get("SOUL_MINIPROGRAM_DEV_USER_ID", "")
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_env_banner() -> str:
|
|||
|
|
"""返回测试环境提示横幅"""
|
|||
|
|
return (
|
|||
|
|
"\n"
|
|||
|
|
"========================================\n"
|
|||
|
|
f" 测试环境: {ENV_LABEL} ({API_BASE})\n"
|
|||
|
|
"========================================\n"
|
|||
|
|
" 若需切换,请设置: SOUL_TEST_ENV=local|souldev|soulapi\n"
|
|||
|
|
" 或: SOUL_API_BASE=<完整 API 地址>\n"
|
|||
|
|
"========================================\n"
|
|||
|
|
)
|