// 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, "") }) 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, "
  1. First
  2. ") assert.Contains(t, html, "
  3. Second
  4. ") assert.Contains(t, html, "
  5. Third
  6. ") assert.Contains(t, html, "
") }) t.Run("links and images", func(t *testing.T) { input := "[Example](https://example.com)\n\n![Alt text](image.png)\n" html, err := RenderMarkdown(input) require.NoError(t, err) assert.Contains(t, html, `Example`) assert.Contains(t, html, `Alt text") 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, " --- ") }