fix(bot-bridge): subjects category 白名单补齐库内实况 revenue/profit_loss — 消除库内合法值被400拒 (dama-cma-subjects-category-whitelist-20260912)

This commit is contained in:
Hermes CI Fix
2026-09-12 11:09:16 +08:00
parent ca2832b698
commit 46fc1a4ecc
2 changed files with 90 additions and 1 deletions
+76
View File
@@ -573,3 +573,79 @@ class TestSubjectsWrite:
}, headers=BOT_KEY)
assert resp.status_code == 200, resp.json()
assert resp.json()["inserted"] == 2
# ── category 白名单 vs 字典实况(2026-09-12 dama-cma-subjects-category-whitelist)──
# 生产库 SELECT DISTINCT category FROM subjects(207 行,2026-09-12 只读核验):
DB_CATEGORY_CORPUS_20260912 = ("asset", "cost", "detail", "equity", "expense",
"income", "liability", "profit_loss", "revenue")
def test_whitelist_covers_dictionary_corpus(self):
"""防漂移:库内真实取值若被白名单漏掉 → 本测试失败
原缺陷(DAMA 复核):白名单 8 值漏 revenue / profit_loss,库内合法值被 400 拒。
"""
from app.api.bot_bridge import _SUBJ_CATEGORIES
missing = sorted(set(self.DB_CATEGORY_CORPUS_20260912) - set(_SUBJ_CATEGORIES))
assert not missing, f"库内真实取值被端点白名单漏掉: {missing}"
@pytest.mark.parametrize("cat", DB_CATEGORY_CORPUS_20260912)
def test_dictionary_category_accepted(self, client: TestClient, db: Session, cat: str):
"""字典实况每个取值都能通过端点校验并落库(不再出现「库内合法、端点 400」)"""
code = "95" + f"{self.DB_CATEGORY_CORPUS_20260912.index(cat) + 1:02d}"
resp = client.post(self.URL, json={"subjects": [self._row(code, f"验证-{cat}", category=cat)]},
headers=BOT_KEY)
assert resp.status_code == 200, resp.json()
assert resp.json()["inserted"] == 1
db.expire_all()
row = db.query(Subject).filter(Subject.subject_code == code).first()
assert row is not None and row.category == cat
def test_revenue_existing_row_update_existing_true(self, client: TestClient, db: Session):
"""原 400 复现用例:库内既有 revenue 行(6001 主营业务收入)+ update_existing=true"""
db.add(Subject(subject_code="6001", subject_name="主营业务收入", level=1,
category="revenue", is_active=1))
other = Subject(subject_code="6051", subject_name="其他业务收入", level=1,
category="revenue", is_active=1)
db.add(other)
db.commit()
before = db.query(Subject).count()
resp = client.post(self.URL, json={
"subjects": [self._row("6001", "主营业务收入(新30号)", category="revenue", level=1)],
"update_existing": True}, headers=BOT_KEY)
assert resp.status_code == 200, resp.json()
d = resp.json()
assert (d["inserted"], d["updated"], d["skipped"]) == (0, 1, 0), d
db.expire_all()
row = db.query(Subject).filter(Subject.subject_code == "6001").first()
assert row.subject_name == "主营业务收入(新30号)" and row.category == "revenue"
# 仅目标行变化:行数不变,邻行逐字段未动
assert db.query(Subject).count() == before
nb = db.query(Subject).filter(Subject.subject_code == "6051").first()
assert (nb.subject_name, nb.category, nb.level) == ("其他业务收入", "revenue", 1)
def test_profit_loss_existing_row_update_existing_true(self, client: TestClient, db: Session):
db.add(Subject(subject_code="6901", subject_name="终止经营损益", level=1,
category="profit_loss", is_active=1))
db.commit()
resp = client.post(self.URL, json={
"subjects": [self._row("6901", "终止经营损益(V2)", category="profit_loss")],
"update_existing": True}, headers=BOT_KEY)
assert resp.status_code == 200, resp.json()
assert resp.json()["updated"] == 1
db.expire_all()
row = db.query(Subject).filter(Subject.subject_code == "6901").first()
assert row.subject_name == "终止经营损益(V2)" and row.category == "profit_loss"
def test_revenue_existing_row_update_existing_false_skips(self, client: TestClient, db: Session):
"""update_existing=false:revenue 行正常 skip,逐字段未被改写"""
db.add(Subject(subject_code="6011", subject_name="利息收入(银行存款)", level=1,
category="revenue", is_active=1))
db.commit()
resp = client.post(self.URL, json={
"subjects": [self._row("6011", "不应生效的名称", category="income")]}, headers=BOT_KEY)
assert resp.status_code == 200, resp.json()
d = resp.json()
assert (d["inserted"], d["updated"], d["skipped"]) == (0, 0, 1), d
db.expire_all()
row = db.query(Subject).filter(Subject.subject_code == "6011").first()
assert (row.subject_name, row.category) == ("利息收入(银行存款)", "revenue")