c8ff086b7b
从 transformFields-D3I9yUm6.js 反推出 form_fields_for_add 的真实结构:
{ fieldId, fieldName, componentType, fieldType, required, options[] }
前端 transformFields 把它转成 fieldEn=fieldId / fieldZh=fieldName 后提交,
且请假原因并非硬编码字段,而是学校后台动态配置的。
原先只按「原因/事由」关键词填值,若学校把字段命名为"申请理由说明"
"补充信息"等就会漏填,导致学校端校验失败。
改为两轮策略:
1. 优先按标签命中(原因/事由/说明);
2. 未命中时,用「必填的文本类字段」(TEXT/TEXTAREA/LONGTEXT)兜底填入请假原因。
该校表单通常只有一个原因字段,兜底可覆盖自定义命名;
选择类字段(RADIO/CHECKBOX 等)不猜测,留空由学校端校验。
新增 4 个单测覆盖:关键词命中、自定义命名、兜底逻辑、空输入不 panic。
55 lines
2.0 KiB
Go
55 lines
2.0 KiB
Go
package handler
|
|
|
|
import "testing"
|
|
|
|
// fillXsgzFieldValues:优先按标签匹配,未命中时用必填文本字段兜底。
|
|
func TestFillXsgzFieldValues(t *testing.T) {
|
|
req := &ExecuteLeaveApplyRequest{LeaveReason: "感冒发烧需休息"}
|
|
|
|
t.Run("按标签命中原因字段", func(t *testing.T) {
|
|
fields := []map[string]interface{}{
|
|
{"fieldId": "f1", "fieldName": "请假原因", "fieldType": "TEXTAREA", "required": true},
|
|
{"fieldId": "f2", "fieldName": "紧急联系人", "fieldType": "TEXT", "required": true},
|
|
}
|
|
fillXsgzFieldValues(fields, req)
|
|
if fields[0]["value"] != req.LeaveReason {
|
|
t.Fatalf("原因字段未被填充: %v", fields[0])
|
|
}
|
|
if _, ok := fields[1]["value"]; ok {
|
|
t.Fatalf("非原因字段不应被填充: %v", fields[1])
|
|
}
|
|
})
|
|
|
|
t.Run("学校自定义字段名时用必填文本兜底", func(t *testing.T) {
|
|
fields := []map[string]interface{}{
|
|
{"fieldId": "f1", "fieldName": "申请理由说明", "fieldType": "TEXTAREA", "required": true},
|
|
{"fieldId": "f2", "fieldName": "备注", "fieldType": "TEXT", "required": false},
|
|
}
|
|
fillXsgzFieldValues(fields, req)
|
|
// "说明" 命中第一轮
|
|
if fields[0]["value"] != req.LeaveReason {
|
|
t.Fatalf("含'说明'的字段应被填充: %v", fields[0])
|
|
}
|
|
})
|
|
|
|
t.Run("无关键词时必填文本字段兜底", func(t *testing.T) {
|
|
fields := []map[string]interface{}{
|
|
{"fieldId": "f1", "fieldName": "补充信息", "fieldType": "TEXTAREA", "required": true},
|
|
{"fieldId": "f2", "fieldName": "选择项", "fieldType": "RADIO", "required": true},
|
|
}
|
|
fillXsgzFieldValues(fields, req)
|
|
if fields[0]["value"] != req.LeaveReason {
|
|
t.Fatalf("必填文本字段应兜底填充: %v", fields[0])
|
|
}
|
|
if _, ok := fields[1]["value"]; ok {
|
|
t.Fatalf("选择类字段不应猜测填充: %v", fields[1])
|
|
}
|
|
})
|
|
|
|
t.Run("空 fields 与空原因不 panic", func(t *testing.T) {
|
|
fillXsgzFieldValues(nil, req)
|
|
fillXsgzFieldValues([]map[string]interface{}{}, req)
|
|
fillXsgzFieldValues([]map[string]interface{}{{"fieldId": "f1"}}, &ExecuteLeaveApplyRequest{})
|
|
})
|
|
}
|