fix: 终审修复——站点停用接线/prefix查重补创建reset/默认凭据警示+取舍补录
- I-1 站点停用全链接线: Site 数据类加 status 字段; DB 源 _load_one 与 文件源 read_tenant 均只输出 active 站点(停用站点域名不进 registry 索引 → 该域名 404;全停用=合法运营状态输出空 sites;文件源无 status 键默认 active 兼容)。E2E: PATCH 站点 disabled → 其域名 404、复启用 恢复;源级直测两源过滤。 - I-3 prefix 跨租户查重补两口: db.other_push_prefixes 共用助手 (MAX(version) 逐租户当前前缀,排除自身);创建向导(出厂档案前缀被占 → 400 提示改 blank/改占用方)与 reset push(重置回出厂撞车 → 400 提示 走 PUT)接入;PUT 原有查重改用同一助手。rollback 维持豁免(历史不可变 语义优先,取舍清单记档)。既有测试第二租户改 blank profile 避撞。 - I-4 默认凭据警示: lifespan 启动检测 ADMIN_PASSWORD 仍为 Settings 字段 默认值(非硬编码第二份,防双源漂移)→ logger.warning 醒目提示; CLAUDE.md Phase 4 部署记档补 ADMIN_PASSWORD 生产要求。 - I-2/M-2 取舍补录: 密钥掩码未实现(GET config/settings 明文返回 api_key/smtp 密码,Phase 3 前须定 __SET__ 哨兵方案);站点管理权限现为 仅超管(Phase 3 对接时决策放开或改 spec);取舍清单第 2 条同步刷新 (rollback 现为唯一豁免口)。 全量回归: 571 passed(基线 566 + 新增 5)。 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -350,6 +350,33 @@ def test_reset_blank_tenant_groups(super_client):
|
||||
assert r.json()["config"] == DEFAULT_CONFIG["contact"]
|
||||
|
||||
|
||||
def test_reset_push_prefix_collision(super_client):
|
||||
"""终审 I-3:reset push 组补跨租户查重——本租户改过前缀后,出厂前缀被
|
||||
别人取走,重置回出厂会撞车 → 400 提示改走 PUT 指定前缀。"""
|
||||
_create(super_client, slug="jc1", profile="jiancai") # 出厂 ai-kefu-jc
|
||||
_create(super_client, slug="au1", profile="auto") # 出厂 ai-kefu
|
||||
# jc1 让出出厂前缀,au1 取走
|
||||
assert _put_group(super_client, "jc1", "push",
|
||||
{"prefix": "jc1-new"}).status_code == 200
|
||||
assert _put_group(super_client, "au1", "push",
|
||||
{"prefix": "ai-kefu-jc"}).status_code == 200
|
||||
# 重置 jc1 的 push → 出厂 ai-kefu-jc 已被 au1 占用 → 400
|
||||
r = super_client.post(f"{_cfg('jc1')}/push/reset",
|
||||
headers=_auth(super_client))
|
||||
assert r.status_code == 400
|
||||
detail = r.json()["detail"]
|
||||
assert "ai-kefu-jc" in detail and "占用" in detail
|
||||
# 当前版本未被重置覆盖(仍是 jc1-new)
|
||||
assert _get_config(super_client, "jc1")["config"]["push"]["prefix"] == "jc1-new"
|
||||
# 撞车解除后(au1 改走)重置即可成功
|
||||
assert _put_group(super_client, "au1", "push",
|
||||
{"prefix": "au1-new"}).status_code == 200
|
||||
r = super_client.post(f"{_cfg('jc1')}/push/reset",
|
||||
headers=_auth(super_client))
|
||||
assert r.status_code == 200
|
||||
assert r.json()["config"]["prefix"] == "ai-kefu-jc"
|
||||
|
||||
|
||||
# ---- 平台设置(仅超管;本阶段只落存储与接口) ----------------------------------------
|
||||
|
||||
|
||||
@@ -423,7 +450,9 @@ def test_wall_group_round_trip_and_body_hygiene(super_client):
|
||||
assert r.status_code == 400
|
||||
|
||||
# 首登未改密的租户管理员 → 409(与登录/改密之外的受保护端点同款门)
|
||||
_create(super_client, slug="t2", admin="t2-admin", password="t2-pass-1")
|
||||
# (blank: 第二个租户不撞 jiancai 出厂 push.prefix——终审 I-3 创建查重)
|
||||
_create(super_client, slug="t2", admin="t2-admin", password="t2-pass-1",
|
||||
profile="blank")
|
||||
token = super_client.post(
|
||||
LOGIN, json={"username": "t2-admin", "password": "t2-pass-1"}
|
||||
).json()["token"]
|
||||
|
||||
Reference in New Issue
Block a user