feat: simplify SOP to immediate-effect configuration

This commit is contained in:
Eric 1549169735@qq.com
2026-08-18 16:27:02 +08:00
parent c5ab886b70
commit 8de48fb05e
150 changed files with 6764 additions and 1626 deletions

View File

@@ -47,6 +47,14 @@ func TestValidateNodeAnswersRejectsAnswersForMessage(t *testing.T) {
}
}
func TestValidateNodeAnswersSupportsNodeRequiredFormFields(t *testing.T) {
fields := []model.ScenarioField{{FieldKey: "pet_name", FieldName: "宠物名称", FieldType: "text"}}
node := model.SOPNode{Type: "form", Config: datatypes.JSON([]byte(`{"field_keys":["pet_name"],"required_field_keys":["pet_name"]}`))}
if err := validateNodeAnswers(node, fields, map[string]interface{}{}); err == nil || !strings.Contains(err.Error(), "请填写宠物名称") {
t.Fatalf("validateNodeAnswers() error = %v, want node-required error", err)
}
}
func TestValidateNodeAnswersChoiceOptions(t *testing.T) {
fields := []model.ScenarioField{{FieldKey: "intent", FieldName: "客户意向", FieldType: "text"}}
node := model.SOPNode{Type: "choice", Config: datatypes.JSON([]byte(`{"field_key":"intent","required":true,"options":["继续了解","暂不考虑"]}`))}
@@ -58,3 +66,26 @@ func TestValidateNodeAnswersChoiceOptions(t *testing.T) {
t.Fatalf("validateNodeAnswers() error = %v, want invalid choice option", err)
}
}
func TestValidateInitialAnswers(t *testing.T) {
fields := []model.ScenarioField{
{FieldKey: "pet_name", FieldName: "宠物名称", FieldType: "text", Required: true},
{FieldKey: "pet_weight", FieldName: "体重", FieldType: "number"},
}
if err := validateInitialAnswers(fields, map[string]interface{}{"pet_name": "团子"}); err != nil {
t.Fatalf("validateInitialAnswers() error = %v", err)
}
if err := validateInitialAnswers(fields, map[string]interface{}{"unknown": "value"}); err == nil || !strings.Contains(err.Error(), "不存在") {
t.Fatalf("validateInitialAnswers() error = %v, want unknown-field error", err)
}
if err := validateInitialAnswers(fields, map[string]interface{}{"pet_weight": "heavy"}); err == nil || !strings.Contains(err.Error(), "必须是数字") {
t.Fatalf("validateInitialAnswers() error = %v, want value-type error", err)
}
}
func TestValidateInitialAnswersRequiresMappedInput(t *testing.T) {
fields := []model.ScenarioField{{FieldKey: "customer_id", FieldName: "客户 ID", FieldType: "text", SourcePath: "customer.id", Required: true}}
if err := validateInitialAnswers(fields, map[string]interface{}{}); err == nil {
t.Fatal("expected missing mapped input to fail")
}
}