package sandbox import ( "context" "testing" "go.starlark.net/starlark" ) func runFormsScript(t *testing.T, script string) starlark.StringDict { t.Helper() mod := BuildFormsModule(context.Background()) predeclared := starlark.StringDict{"forms": mod} globals, err := starlark.ExecFile(&starlark.Thread{Name: "test"}, "test.star", script, predeclared) if err != nil { t.Fatal(err) } return globals } func TestFormsModule_ValidateValid(t *testing.T) { globals := runFormsScript(t, ` tpl = { "fields": [ {"key": "name", "type": "text", "label": "Name", "required": True}, {"key": "email", "type": "email", "label": "Email"}, ] } result = forms.validate(tpl, {"name": "Alice", "email": "alice@example.com"}) `) result := globals["result"].(*starlark.Dict) valid, _, _ := result.Get(starlark.String("valid")) if valid != starlark.True { t.Fatalf("expected valid=True, got %v", valid) } errors, _, _ := result.Get(starlark.String("errors")) errList := errors.(*starlark.List) if errList.Len() != 0 { t.Fatalf("expected 0 errors, got %d", errList.Len()) } } func TestFormsModule_ValidateRequired(t *testing.T) { globals := runFormsScript(t, ` tpl = { "fields": [ {"key": "name", "type": "text", "label": "Name", "required": True}, ] } result = forms.validate(tpl, {}) `) result := globals["result"].(*starlark.Dict) valid, _, _ := result.Get(starlark.String("valid")) if valid != starlark.False { t.Fatalf("expected valid=False, got %v", valid) } errors, _, _ := result.Get(starlark.String("errors")) errList := errors.(*starlark.List) if errList.Len() != 1 { t.Fatalf("expected 1 error, got %d", errList.Len()) } errDict := errList.Index(0).(*starlark.Dict) key, _, _ := errDict.Get(starlark.String("key")) if key.(starlark.String).GoString() != "name" { t.Fatalf("expected error key 'name', got %v", key) } } func TestFormsModule_ValidateTypeErrors(t *testing.T) { globals := runFormsScript(t, ` tpl = { "fields": [ {"key": "age", "type": "number", "label": "Age", "validation": {"min": 0, "max": 150}}, {"key": "email", "type": "email", "label": "Email"}, ] } result = forms.validate(tpl, {"age": -5, "email": "bad"}) `) result := globals["result"].(*starlark.Dict) valid, _, _ := result.Get(starlark.String("valid")) if valid != starlark.False { t.Fatalf("expected valid=False, got %v", valid) } errors, _, _ := result.Get(starlark.String("errors")) errList := errors.(*starlark.List) if errList.Len() != 2 { t.Fatalf("expected 2 errors, got %d", errList.Len()) } } func TestFormsModule_ValidateCondition(t *testing.T) { globals := runFormsScript(t, ` tpl = { "fields": [ {"key": "type", "type": "text", "label": "Type"}, {"key": "details", "type": "text", "label": "Details", "required": True, "condition": {"when": "type", "op": "eq", "value": "other"}}, ] } # Condition not met — details not required result1 = forms.validate(tpl, {"type": "normal"}) # Condition met — details required result2 = forms.validate(tpl, {"type": "other"}) `) result1 := globals["result1"].(*starlark.Dict) valid1, _, _ := result1.Get(starlark.String("valid")) if valid1 != starlark.True { t.Fatalf("result1: expected valid=True, got %v", valid1) } result2 := globals["result2"].(*starlark.Dict) valid2, _, _ := result2.Get(starlark.String("valid")) if valid2 != starlark.False { t.Fatalf("result2: expected valid=False, got %v", valid2) } }