Files
soul-yongping/scripts/test/config.py
卡若 76965adb23 chore: 清理敏感与开发文档,仅同步代码
- 永久忽略并从仓库移除 开发文档/
- 移除并忽略 .env 与小程序私有配置
- 同步小程序/管理端/API与脚本改动

Made-with: Cursor
2026-03-17 17:50:12 +08:00

120 lines
4.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- 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"
)