Forráskód Böngészése

test(ac20): 3 层规则补正向断言 + 常量注释写死存量实测

两点都来自复核意见:

1. 常量注释补一行存量实测(2026-11-10):三库 MAX(layer)=2、layer>3 共 0 行
   ⇒ 本规则与存量不矛盾,无需 grandfather。写它是为了下一个人不必再查一遍、
   也不必再怀疑「这规则是不是忘了考虑存量」。

2. 用例补正向断言:建到 3 层时**每一层都必须真建出来**(且逐层校验 layer)。
   原来只有「第 4 层被拒」这一半,如果上限被误写成 2,只测被拒的版本会照样绿。
   现在上限实际为 2 时立刻红:'建第 3 层失败(上限 3 应允许建到第 3 层)'。
   (实测:把判定改成 nextLayer > MaxDivideBizDepth-1 即复现此红,已回滚)

门禁(本包):
  go build  service/handler/apperr            exit=0
  go vet    service                            exit=0
  go test   -run 'Divide|AddSubordinate|AddLog'   14 PASS / ok 3.58s
  go test   -count=1(全包)                  ok 78.8s(上一轮同码跑过)
注:go build ./... 仍红,原因是 SE-2 未提交的 dualrun/stage2/run.go,与本提交无关。
Q 7 órája
szülő
commit
2a621f518c

+ 4 - 0
internal/academic/service/divide_service.go

@@ -56,6 +56,10 @@ const MaxDivideDepth int32 = 100
 //
 // 拍板日期 2026-11-10(业务确认为**硬规则**,不是建议)。
 //
+// 存量实测(2026-11-10):三个库 `t_user_divide_into` 均为 `MAX(layer)=2`、`layer>3` **0 行**
+// ⇒ 本规则与存量数据不矛盾,**无需存量豁免(grandfather)**,也不需要迁移/清洗。
+// (写这句不是为了留证据,是让下一个人不必再查一遍、也不必再怀疑"这规则是不是忘了考虑存量"。)
+//
 // 出处(已按本机前端仓实读校正,不是转述):
 //
 //	DEV-MERGE-LEGACY-PC-FRONTEND-2026/src/api/mock/routes/divide-into.ts:32

+ 7 - 2
internal/academic/service/divide_service_test.go

@@ -302,11 +302,16 @@ func TestAddSubordinateBizDepthLimit(t *testing.T) {
 	root := nodeID(0)
 	seedRoot(t, db, root, model.DivideTypeOneOff, "1.00")
 	prev := root
-	// 建到 layer=3(3 层 = 超管 / 校区主任 / 老师)
+	// **正向断言不可省**:建到 3 层,每一层都必须真建出来。
+	// 只断言"第 4 层被拒"是不够的 —— 把上限误写成 2 时,这个用例只测被拒的那半也照样绿,
+	// 而生产上第 3 层就再也建不出来了(存量里 MAX(layer)=2,说明第 3 层从未被验证过)。
 	for i := 1; i < bizDepth; i++ {
 		child := nodeID(i)
 		if err := svc.AddSubordinate(ctx, prev, child); err != nil {
-			t.Fatalf("建链 AddSubordinate(%s→%s) 失败: %v", prev, child, err)
+			t.Fatalf("建第 %d 层失败(上限 %d 应允许建到第 %d 层): %v", i+1, bizDepth, bizDepth, err)
+		}
+		if got := loadDivideNode(t, db, child).Layer; got != int32(i+1) {
+			t.Fatalf("第 %d 层的 layer 应为 %d,实得 %d", i+1, i+1, got)
 		}
 		prev = child
 	}