Files
iqudo-top1/internal/run/generic_scenario_test.go
2026-08-18 16:27:02 +08:00

51 lines
2.1 KiB
Go

package run
import (
"reflect"
"testing"
"git.iwork-ai.com/xdc/iqudo-top1/internal/model"
"gorm.io/datatypes"
)
func TestGenericRuntimeSupportsDifferentDomains(t *testing.T) {
tests := []struct {
name string
fields []model.ScenarioField
input map[string]interface{}
rules []model.ScenarioRule
wantInput map[string]interface{}
wantOutput interface{}
}{
{
name: "pet order",
fields: []model.ScenarioField{{FieldKey: "tags", SourcePath: "order.items[*].symptom_tags[*]"}},
input: map[string]interface{}{"order": map[string]interface{}{"items": []interface{}{map[string]interface{}{"symptom_tags": []interface{}{"soft_stool"}}}}},
rules: []model.ScenarioRule{{RuleKey: "pet", Condition: datatypes.JSON([]byte(`{"field":"input.tags","operator":"exists"}`)), Actions: datatypes.JSON([]byte(`[{"operation":"set","field":"matched","value_from":"input.tags"}]`))}},
wantInput: map[string]interface{}{"tags": []interface{}{"soft_stool"}}, wantOutput: []interface{}{"soft_stool"},
},
{
name: "course recommendation",
fields: []model.ScenarioField{{FieldKey: "goals", SourcePath: "learner.goals[*]"}},
input: map[string]interface{}{"learner": map[string]interface{}{"goals": []interface{}{"presentation"}}},
rules: []model.ScenarioRule{{RuleKey: "course", Condition: datatypes.JSON([]byte(`{"field":"input.goals","operator":"exists"}`)), Actions: datatypes.JSON([]byte(`[{"operation":"set","field":"matched","value_from":"input.goals"}]`))}},
wantInput: map[string]interface{}{"goals": []interface{}{"presentation"}}, wantOutput: []interface{}{"presentation"},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
mapped := mapScenarioInput(test.fields, test.input)
if !reflect.DeepEqual(mapped, test.wantInput) {
t.Fatalf("mapped=%#v", mapped)
}
derived, _, err := applyScenarioRules(test.rules, mapped)
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(derived["matched"], test.wantOutput) {
t.Fatalf("derived=%#v", derived)
}
})
}
}