修「填了显示名却说还没有中文名」,并给枚举拼错拦一道

用户报:把某行的导出值改成 MKPOICategoryCarRent、又手填了显示名「租车」,
保存成功、框里也回填了,页面却仍挂着「还没有中文名」。

两件事叠在一起:

1. 判断错了。Missing 只看内置表,没看有没有自定义覆盖 ——
   填过了还照样提示。改成 categoryLabelMissing(v) && 没有覆盖。
   补 TestCategoryLabelMissingRespectsOverride,并做变异验证(去掉那半个条件即报错)。

2. 值本身是拼错的。MKPOICategoryCarRent 不是真机的枚举,正确是
   MKPOICategoryCarRental(少了个 al)——站内看不出任何异常,但导回手机后
   那个地点显示不出类别。这正是加「显示名」时提醒过的风险,所以补一道防线:
   编辑页把内置枚举名渲染给脚本,往 poi_category 写值的两个入口
   (类别台账的「改名」、地点行内编辑的「自定义类别」)都过 okEnum(),
   不在已知枚举里就 confirm,还能猜「你是不是想写 MKPOICategoryCarRental」。
   中文值和已知枚举不打扰。

另外:这次用脚本往模板写 JS 时,\n 被多转义一层成了真换行,JS 单引号字符串
含裸换行 ⇒ 整块 <script> 语法错误、页面交互全哑,而模板解析测试照样通过。
新增 inline_script_test.go 扫所有内联脚本块(现在 31 个),字符串跨行就报错
并指出文件行号,已做变异验证。
This commit is contained in:
tamakyi
2026-09-20 12:22:11 +08:00
parent 82e63412c0
commit 693ee82ab8
5 changed files with 245 additions and 1 deletions
+41
View File
@@ -277,3 +277,44 @@ func TestCategoryLabelOverridesEverywhereThenResets(t *testing.T) {
t.Error("恢复默认后不该再出现自定义名")
}
}
// 填过显示名之后就不该再标「还没有中文名」——判断得看覆盖,不能只看内置表。
// (2026-09-20 用户把「租车点」改成拼错的 MKPOICategoryCarRent、又手填了显示名,
// 页面却还挂着「还没有中文名」,就是这么来的。)
func TestCategoryLabelMissingRespectsOverride(t *testing.T) {
const val = "MKPOICategoryCarRent" // 真机没有这个枚举,内置表自然也没有
f := newMovementFixture(t)
f.mustExec(t, `INSERT INTO places (dataset_id, src_pk, name, lat, lon, poi_category)
VALUES ($1,692021,'显示名测试点',30,120,$2)`, f.dsID, val)
t.Cleanup(func() {
f.pg.ExecContext(f.ctx, `DELETE FROM places WHERE dataset_id=$1 AND src_pk=692021`, f.dsID)
f.pg.ExecContext(f.ctx, `DELETE FROM category_labels WHERE value=$1`, val)
})
body := func() string {
rec := httptest.NewRecorder()
f.srv.editPage(rec, httptest.NewRequest("GET", "/admin/edit", nil).WithContext(f.ctx))
if rec.Code != http.StatusOK {
t.Fatalf("渲染失败: %d", rec.Code)
}
return rec.Body.String()
}
if b := body(); !strings.Contains(b, "还没有中文名") || !strings.Contains(b, "填一个中文名") {
t.Fatal("既不在内置表、也没填过,应当提示去补一个中文名")
}
if got := taxonomyPost(t, f, "/admin/edit/category/label", url.Values{
"value": {val}, "label": {"租车"},
}); got["custom"] != true {
t.Fatalf("应报告已自定义,实际 %v", got)
}
b := body()
if strings.Contains(b, "还没有中文名") {
t.Error("已经填过显示名了,不该再说「还没有中文名」")
}
if !strings.Contains(b, "已自定义") {
t.Error("填过显示名之后应当标成「已自定义」")
}
if !strings.Contains(b, `value="租车"`) {
t.Error("显示名框应回填已保存的名字")
}
}