- mltextarea compiles (with size), binds as a writable scalar and goes through the mltext lift, translation write and hydrate paths - preset on or from an mltextarea field stays refused - tests: compile, Postgres round trip over a nullable host column with multi-line text, invalid locale maps, preset refusals
206 lines
4.4 KiB
Go
206 lines
4.4 KiB
Go
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",
|
|
},
|
|
{
|
|
name: "mltextarea target is refused",
|
|
yaml: `fields:
|
|
title:
|
|
type: mltext
|
|
label: Title
|
|
excerpt:
|
|
type: mltextarea
|
|
label: Excerpt
|
|
preset: title
|
|
`,
|
|
compileErr: "preset is only valid on type: text or mltext",
|
|
},
|
|
{
|
|
name: "mltextarea source is refused",
|
|
yaml: `fields:
|
|
excerpt:
|
|
type: mltextarea
|
|
label: Excerpt
|
|
slug:
|
|
type: mltext
|
|
label: Slug
|
|
preset: excerpt
|
|
`,
|
|
checkErr: "field slug: preset field excerpt 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)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|