40 lines
1.7 KiB
Go
40 lines
1.7 KiB
Go
package platform
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
)
|
|
|
|
func TestContentValidation(t *testing.T) {
|
|
cases := []struct {
|
|
name, kind, body string
|
|
valid bool
|
|
}{
|
|
{"plain text", "text", `{"text":""}`, true},
|
|
{"empty article draft", "article", `{"article":{"sections":[]}}`, true},
|
|
{"paragraph descriptions", "article", `{"article":{"sections":[{"id":"s","title":"Section","description":"Summary","paragraphs":[{"id":"p","text":"Body","description":"Notes"}]}]}}`, true},
|
|
{"duplicate paragraph IDs", "article", `{"article":{"sections":[{"id":"s","paragraphs":[{"id":"p","text":"One"},{"id":"p","text":"Two"}]}]}}`, false},
|
|
{"markdown field", "article", `{"markdown":"# Heading"}`, false},
|
|
{"unknown schema", "text", `{"schema_version":2,"text":"Text"}`, false},
|
|
{"null content", "board", `null`, false},
|
|
{"nested unknown field", "image", `{"image":{"url":"https://example.com/image.png","secret":"unexpected"}}`, false},
|
|
{"insecure image", "image", `{"image":{"url":"http://example.com/image.png"}}`, false},
|
|
{"URL credentials", "image", `{"image":{"url":"https://user:password@example.com/image.png"}}`, false},
|
|
{"card and text", "card", `{"parts":[{"kind":"text","text":"Caption"}]}`, true},
|
|
{"empty card", "card", `{"parts":[]}`, false},
|
|
{"mismatched part", "card", `{"parts":[{"kind":"text","image":{"url":"https://example.com/image.png"}}]}`, false},
|
|
{"board payload", "board", `{"text":"Wrong type"}`, false},
|
|
}
|
|
for _, test := range cases {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
out, ok := normalizeContent(test.kind, json.RawMessage(test.body))
|
|
if ok != test.valid {
|
|
t.Fatalf("valid=%v, want %v", ok, test.valid)
|
|
}
|
|
if ok && !json.Valid(out) {
|
|
t.Fatal("normalized content is invalid JSON")
|
|
}
|
|
})
|
|
}
|
|
}
|