package cabana import ( "encoding/json" "strings" "testing" ) // TestPresetML pins preset on multilingual fields: a text or mltext target // may follow a text or mltext source; any other target or source type is // refused, by CompileForm for the target and by checkPresets for the source. func TestPresetML(t *testing.T) { cases := []struct { name string yaml string compileErr string checkErr string preset *FieldPreset json []string }{ { name: "mltext title to mltext slug", yaml: `fields: title: type: mltext label: Title slug: type: mltext label: Slug preset: field: title type: slug `, preset: &FieldPreset{Field: "title", Type: "slug"}, json: []string{`"type":"mltext"`, `"preset":{"field":"title","type":"slug"}`}, }, { name: "short form on an mltext slug", yaml: `fields: title: type: mltext label: Title slug: type: mltext label: Slug preset: title `, preset: &FieldPreset{Field: "title", Type: "slug"}, }, { name: "exact copy between mltext fields", yaml: `fields: title: type: mltext label: Title slug: type: mltext label: Slug preset: field: title type: exact `, preset: &FieldPreset{Field: "title", Type: "exact"}, }, { name: "text source to mltext target", yaml: `fields: title: type: text label: Title slug: type: mltext label: Slug preset: title `, preset: &FieldPreset{Field: "title", Type: "slug"}, }, { name: "mltext source to text target", yaml: `fields: title: type: mltext label: Title slug: type: text label: Slug preset: title `, preset: &FieldPreset{Field: "title", Type: "slug"}, }, { name: "mlmarkdown target is refused", yaml: `fields: title: type: mltext label: Title slug: type: mlmarkdown label: Slug preset: title `, compileErr: "preset is only valid on type: text or mltext", }, { name: "markdown target is refused", yaml: `fields: title: type: text label: Title slug: type: markdown label: Slug preset: title `, compileErr: "preset is only valid on type: text or mltext", }, { name: "mlmarkdown source is refused", yaml: `fields: body: type: mlmarkdown label: Body slug: type: mltext label: Slug preset: body `, checkErr: "field slug: preset field body must be a text or mltext field", }, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { schema, err := CompileForm("acme.demo", schemaController{model: "Widget"}, formFS(formConfig, tc.yaml)) if tc.compileErr != "" { if err == nil || !strings.Contains(err.Error(), tc.compileErr) { t.Fatalf("compile err = %v, want %q", err, tc.compileErr) } return } if err != nil { t.Fatalf("compile: %v", err) } err = checkPresets(schema.Fields) if tc.checkErr != "" { if err == nil || err.Error() != tc.checkErr { t.Fatalf("checkPresets err = %v, want %q", err, tc.checkErr) } return } if err != nil { t.Fatalf("checkPresets: %v", err) } var slug *FormField for i := range schema.Fields { if schema.Fields[i].Name == "slug" { slug = &schema.Fields[i] } } if slug == nil { t.Fatal("slug field missing") } if slug.Preset == nil || *slug.Preset != *tc.preset { t.Fatalf("preset = %+v, want %+v", slug.Preset, tc.preset) } if len(tc.json) == 0 { return } raw, err := json.Marshal(slug) if err != nil { t.Fatal(err) } for _, want := range tc.json { if !strings.Contains(string(raw), want) { t.Fatalf("json %s lacks %s", raw, want) } } }) } }