refactor: config_views 单入口 + 0语义统一 + FakeAI 收敛(清理单#1#2#3)
- #3 六个消费视图 resolver 收拢 app/platform/config_views(单一定义点): resolve_email/push/ai_settings ← 各服务文件, resolve_contact_flags/ context_seed_map ← conversation, name_to_region_extras ← manager __init__ 内联取值(or None 语义原样)——函数体逐字搬入,服务层 import 之, 旧定义删;Phase 3 编辑器/试金石与该模块对接 - #2 限流 0 语义统一: conn_limiter.try_acquire 的 limit 与 chat_rest 的 rate_limit_per_hour 取值同款——0 或负 = 回退出厂默认(与姊妹键一致), 原 conn_limiter 0=全拒改为回退;chat_rest 取值抽 _resolve_rate_limit 纯函数供锚定 - #1 FakeAI 收敛进 conftest(超集: extract/evaluate/eval_calls),四份拷贝 删(test_lead_email_trigger/test_cc_integration/test_channel_hygiene/ test_lead_push_wiring——计划记三份,grep 实有四份;push_wiring 经 evaluate 参数注入原本地固定返回值,断言零改动) 全量 558 passed(554 + 新增 4: 单入口/内联等价/两处 0 语义) Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -18,13 +18,16 @@ from dataclasses import replace
|
||||
from sqlalchemy import select
|
||||
|
||||
from app.engine.config import settings
|
||||
from app.engine.services import email_service, lead_push_service
|
||||
from app.engine.services.ai_service import resolve_ai_settings
|
||||
from app.engine.services import email_service
|
||||
from app.engine.services.cc_completion import name_to_region
|
||||
from app.engine.services.conversation import (
|
||||
ConversationManager, context_seed_map, resolve_contact_flags,
|
||||
)
|
||||
from app.engine.services.conversation import ConversationManager
|
||||
from app.engine.services.rate_limit import _reset_for_test, check
|
||||
# Task 10: 消费视图 resolver 单入口(原 ai_service/conversation 直引与
|
||||
# email_service/lead_push_service 模块属性取值改为这里,断言不动)
|
||||
from app.platform.config_views import (
|
||||
context_seed_map, resolve_ai_settings, resolve_contact_flags,
|
||||
resolve_email_settings, resolve_push_settings,
|
||||
)
|
||||
from app.platform.tenant_config import TenantConfig
|
||||
from tests.conftest import build_jiancai_runtime
|
||||
|
||||
@@ -39,7 +42,7 @@ def test_email_reads_tenant_smtp(monkeypatch):
|
||||
"""租户段优先于全局 settings: smtp/sender_name/notify_emails 全量覆盖。"""
|
||||
monkeypatch.setattr(settings, "SMTP_HOST", "env-host")
|
||||
monkeypatch.setattr(settings, "SMTP_USER", "env@x.com")
|
||||
r = email_service.resolve_email_settings(_cfg({"email": {
|
||||
r = resolve_email_settings(_cfg({"email": {
|
||||
"smtp": {"host": "t.smtp", "port": 587, "user": "t@x.com",
|
||||
"password": "t-pass"},
|
||||
"sender_name": "Auto Co",
|
||||
@@ -59,7 +62,7 @@ def test_email_falls_back_to_env_settings(monkeypatch):
|
||||
("SMTP_USER", "env@x.com"), ("SMTP_PASS", "env-pass"),
|
||||
("NOTIFY_EMAIL", "notify@env.com")):
|
||||
monkeypatch.setattr(settings, k, v)
|
||||
r = email_service.resolve_email_settings(_cfg({}).data)
|
||||
r = resolve_email_settings(_cfg({}).data)
|
||||
assert r == {
|
||||
"host": "env-host", "port": 465, "user": "env@x.com",
|
||||
"password": "env-pass", "sender_name": "HESUPIPE",
|
||||
@@ -73,7 +76,7 @@ def test_email_partial_smtp_override(monkeypatch):
|
||||
monkeypatch.setattr(settings, "SMTP_PORT", 465)
|
||||
monkeypatch.setattr(settings, "SMTP_USER", "env@x.com")
|
||||
monkeypatch.setattr(settings, "SMTP_PASS", "env-pass")
|
||||
r = email_service.resolve_email_settings(
|
||||
r = resolve_email_settings(
|
||||
_cfg({"email": {"smtp": {"host": "t.smtp"}}}).data)
|
||||
assert (r["host"], r["port"], r["user"], r["password"]) == (
|
||||
"t.smtp", 465, "env@x.com", "env-pass")
|
||||
@@ -112,8 +115,8 @@ def test_seed_tenants_ship_email_group(monkeypatch):
|
||||
From 头渲染时外层再包【】(send_* 的 msg["From"] 拼法),seed 存裸名。"""
|
||||
monkeypatch.setattr(settings, "NOTIFY_EMAIL", "env-notify@x.com")
|
||||
from tests.conftest import build_auto_runtime
|
||||
au = email_service.resolve_email_settings(build_auto_runtime().config.data)
|
||||
jc_r = email_service.resolve_email_settings(
|
||||
au = resolve_email_settings(build_auto_runtime().config.data)
|
||||
jc_r = resolve_email_settings(
|
||||
build_jiancai_runtime().config.data)
|
||||
assert au["sender_name"] == "XYH"
|
||||
assert au["notify_emails"] == ["18339827479@163.com"]
|
||||
@@ -140,7 +143,7 @@ def test_push_reads_tenant_section(monkeypatch):
|
||||
"""PUSH 组全部字段: 租户段给了就用租户的(显式数值优先于 env——
|
||||
env 已 patch 成 7.5/5/2.0,断言 5/4/0.5 才证明读的是租户槽)。"""
|
||||
_patch_push_env(monkeypatch)
|
||||
r = lead_push_service.resolve_push_settings(_cfg({"push": {
|
||||
r = resolve_push_settings(_cfg({"push": {
|
||||
"enabled": True, "url": "https://t.example/push", "api_key": "t-key",
|
||||
"prefix": "t-pfx", "timeout": 5, "max_attempts": 4,
|
||||
"retry_backoff_base": 0.5,
|
||||
@@ -158,7 +161,7 @@ def test_push_reads_tenant_section(monkeypatch):
|
||||
def test_push_empty_section_falls_back_to_env(monkeypatch):
|
||||
"""空槽(默认 False/空串/数值 None 哨兵)视同未设置 → 回退 env PUSH_*。"""
|
||||
_patch_push_env(monkeypatch)
|
||||
r = lead_push_service.resolve_push_settings(_cfg({}).data)
|
||||
r = resolve_push_settings(_cfg({}).data)
|
||||
assert r == {
|
||||
"enabled": True, "url": "env-url", "api_key": "env-key",
|
||||
"prefix": "env-pfx", "timeout": 7.5, "max_attempts": 5,
|
||||
@@ -308,7 +311,7 @@ def test_factory_model_sentinel_in_sync():
|
||||
与 DEFAULT_CONFIG 出厂 model 一致——默认值一旦漂移,"回退 env AI_MODEL"
|
||||
永不触发且无测试报错。"""
|
||||
from app.platform.defaults import DEFAULT_CONFIG
|
||||
from app.engine.services.ai_service import _FACTORY_DEFAULT_MODEL
|
||||
from app.platform.config_views import _FACTORY_DEFAULT_MODEL
|
||||
assert _FACTORY_DEFAULT_MODEL == DEFAULT_CONFIG["ai"]["model"]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user