// SPDX-Licence-Identifier: EUPL-1.2
package help
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestRenderMarkdown_Good(t *testing.T) {
t.Run("heading hierarchy H1-H6", func(t *testing.T) {
input := "# H1\n## H2\n### H3\n#### H4\n##### H5\n###### H6\n"
html, err := RenderMarkdown(input)
require.NoError(t, err)
assert.Contains(t, html, "
H1
")
assert.Contains(t, html, "H2
")
assert.Contains(t, html, "H3
")
assert.Contains(t, html, "H4
")
assert.Contains(t, html, "H5
")
assert.Contains(t, html, "H6
")
})
t.Run("fenced code blocks with language", func(t *testing.T) {
input := "```go\nfmt.Println(\"hello\")\n```\n"
html, err := RenderMarkdown(input)
require.NoError(t, err)
assert.Contains(t, html, "")
assert.Contains(t, html, "fmt.Println")
assert.Contains(t, html, "
")
})
t.Run("inline code backticks", func(t *testing.T) {
input := "Use `go test` to run tests.\n"
html, err := RenderMarkdown(input)
require.NoError(t, err)
assert.Contains(t, html, "go test")
})
t.Run("unordered lists", func(t *testing.T) {
input := "- Alpha\n- Beta\n- Gamma\n"
html, err := RenderMarkdown(input)
require.NoError(t, err)
assert.Contains(t, html, "")
assert.Contains(t, html, "- Alpha
")
assert.Contains(t, html, "- Beta
")
assert.Contains(t, html, "- Gamma
")
assert.Contains(t, html, "
")
})
t.Run("ordered lists", func(t *testing.T) {
input := "1. First\n2. Second\n3. Third\n"
html, err := RenderMarkdown(input)
require.NoError(t, err)
assert.Contains(t, html, "")
assert.Contains(t, html, "- First
")
assert.Contains(t, html, "- Second
")
assert.Contains(t, html, "- Third
")
assert.Contains(t, html, "
")
})
t.Run("links and images", func(t *testing.T) {
input := "[Example](https://example.com)\n\n\n"
html, err := RenderMarkdown(input)
require.NoError(t, err)
assert.Contains(t, html, `Example`)
assert.Contains(t, html, `
")
assert.Contains(t, html, "Name | ")
assert.Contains(t, html, "Value | ")
assert.Contains(t, html, "foo | ")
assert.Contains(t, html, "42 | ")
assert.Contains(t, html, "")
})
t.Run("empty input returns empty string", func(t *testing.T) {
html, err := RenderMarkdown("")
require.NoError(t, err)
assert.Equal(t, "", html)
})
t.Run("special characters escaped in text", func(t *testing.T) {
input := "Use `` tags & \"quotes\".\n"
html, err := RenderMarkdown(input)
require.NoError(t, err)
// The & in prose should be escaped
assert.Contains(t, html, "&")
// Angle brackets in code should be escaped
assert.Contains(t, html, "<div>")
})
}
func TestRenderMarkdown_Good_RawHTML(t *testing.T) {
// html.WithUnsafe() should allow raw HTML pass-through
input := "
raw html
\n"
html, err := RenderMarkdown(input)
require.NoError(t, err)
assert.Contains(t, html, `
raw html
`)
}
func TestRenderMarkdown_Good_GFMExtras(t *testing.T) {
t.Run("strikethrough", func(t *testing.T) {
input := "~~deleted~~\n"
html, err := RenderMarkdown(input)
require.NoError(t, err)
assert.Contains(t, html, "
deleted")
})
t.Run("autolinks", func(t *testing.T) {
input := "Visit https://example.com for details.\n"
html, err := RenderMarkdown(input)
require.NoError(t, err)
assert.Contains(t, html, `
`)
})
}
func TestRenderMarkdown_Good_Typographer(t *testing.T) {
// Typographer extension converts straight quotes to smart quotes
// and -- to en-dash, --- to em-dash.
input := "She said -- \"hello\" --- and left.\n"
html, err := RenderMarkdown(input)
require.NoError(t, err)
// Check that dashes are converted (en-dash or em-dash entities)
assert.NotContains(t, html, " -- ")
assert.NotContains(t, html, " --- ")
}