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