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") } }) } }