2024-03-31 21:01:47 +02:00
package markdown_test
import (
"testing"
2025-02-25 16:51:04 +01:00
"git.urbach.dev/go/assert"
"git.urbach.dev/go/markdown"
2024-03-31 21:01:47 +02:00
)
2024-03-31 23:08:01 +02:00
func TestEmpty ( t * testing . T ) {
assert . Equal ( t , markdown . Render ( "" ) , "" )
}
2024-04-01 11:54:14 +02:00
func TestParagraph ( t * testing . T ) {
2024-03-31 23:08:01 +02:00
assert . Equal ( t , markdown . Render ( "Text" ) , "<p>Text</p>" )
assert . Equal ( t , markdown . Render ( "Text\n" ) , "<p>Text</p>" )
assert . Equal ( t , markdown . Render ( "Text\n\n" ) , "<p>Text</p>" )
assert . Equal ( t , markdown . Render ( "Text\n\n\n" ) , "<p>Text</p>" )
assert . Equal ( t , markdown . Render ( "Line 1\nLine 2" ) , "<p>Line 1 Line 2</p>" )
2024-04-01 12:43:36 +02:00
assert . Equal ( t , markdown . Render ( "Line 1\n\nLine 2" ) , "<p>Line 1</p><p>Line 2</p>" )
2024-03-31 23:08:01 +02:00
}
func TestHeader ( t * testing . T ) {
assert . Equal ( t , markdown . Render ( "# Header" ) , "<h1>Header</h1>" )
assert . Equal ( t , markdown . Render ( "## Header" ) , "<h2>Header</h2>" )
assert . Equal ( t , markdown . Render ( "### Header" ) , "<h3>Header</h3>" )
assert . Equal ( t , markdown . Render ( "#### Header" ) , "<h4>Header</h4>" )
assert . Equal ( t , markdown . Render ( "##### Header" ) , "<h5>Header</h5>" )
assert . Equal ( t , markdown . Render ( "###### Header" ) , "<h6>Header</h6>" )
}
2024-04-02 19:48:35 +02:00
func TestItalic ( t * testing . T ) {
assert . Equal ( t , markdown . Render ( "*italic*" ) , "<p><em>italic</em></p>" )
assert . Equal ( t , markdown . Render ( "_italic_" ) , "<p><em>italic</em></p>" )
}
func TestBold ( t * testing . T ) {
assert . Equal ( t , markdown . Render ( "**bold**" ) , "<p><strong>bold</strong></p>" )
assert . Equal ( t , markdown . Render ( "__bold__" ) , "<p><strong>bold</strong></p>" )
}
2024-04-02 20:50:33 +02:00
func TestStrike ( t * testing . T ) {
assert . Equal ( t , markdown . Render ( "~normal text~" ) , "<p>~normal text~</p>" )
assert . Equal ( t , markdown . Render ( "~~deleted text~~" ) , "<p><del>deleted text</del></p>" )
}
2024-04-01 11:54:14 +02:00
func TestLink ( t * testing . T ) {
2024-04-03 21:13:59 +02:00
assert . Equal ( t , markdown . Render ( "[text](https://example.com/)" ) , ` <p><a href="https://example.com/">text</a></p> ` )
assert . Equal ( t , markdown . Render ( "[text](https://example.com/" ) , ` <p>[text](https://example.com/</p> ` )
assert . Equal ( t , markdown . Render ( "[text]https://example.com/)" ) , ` <p>[text]https://example.com/)</p> ` )
assert . Equal ( t , markdown . Render ( "[text(https://example.com/)" ) , ` <p>[text(https://example.com/)</p> ` )
assert . Equal ( t , markdown . Render ( "text](https://example.com/)" ) , ` <p>text](https://example.com/)</p> ` )
assert . Equal ( t , markdown . Render ( "[text](https://example.com/_test_)" ) , ` <p><a href="https://example.com/_test_">text</a></p> ` )
assert . Equal ( t , markdown . Render ( "Prefix [text](https://example.com/) suffix." ) , ` <p>Prefix <a href="https://example.com/">text</a> suffix.</p> ` )
}
func TestImage ( t * testing . T ) {
assert . Equal ( t , markdown . Render ( "!" ) , ` <p>!</p> ` )
assert . Equal ( t , markdown . Render ( "![" ) , ` <p>![</p> ` )
assert . Equal ( t , markdown . Render ( "![]" ) , ` <p>![]</p> ` )
assert . Equal ( t , markdown . Render ( " , ` <p>
assert . Equal ( t , markdown . Render ( "![]()" ) , ` <p><img src="" alt=""></p> ` )
assert . Equal ( t , markdown . Render ( "" ) , ` <p><img src="https://example.com/image.png" alt="title"></p> ` )
2024-04-01 18:10:52 +02:00
}
2024-04-01 20:04:20 +02:00
func TestList ( t * testing . T ) {
2024-04-03 09:23:52 +02:00
assert . Equal ( t , markdown . Render ( "-" ) , "<p>-</p>" )
assert . Equal ( t , markdown . Render ( "- " ) , "<ul><li></li></ul>" )
2024-04-01 20:04:20 +02:00
assert . Equal ( t , markdown . Render ( "- Entry" ) , "<ul><li>Entry</li></ul>" )
assert . Equal ( t , markdown . Render ( "- Entry 1\n- Entry 2" ) , "<ul><li>Entry 1</li><li>Entry 2</li></ul>" )
2024-04-03 09:23:52 +02:00
}
func TestOrderedList ( t * testing . T ) {
assert . Equal ( t , markdown . Render ( "1" ) , "<p>1</p>" )
assert . Equal ( t , markdown . Render ( "1." ) , "<ol><li></li></ol>" )
assert . Equal ( t , markdown . Render ( "1. " ) , "<ol><li></li></ol>" )
assert . Equal ( t , markdown . Render ( "1. Entry" ) , "<ol><li>Entry</li></ol>" )
assert . Equal ( t , markdown . Render ( "999) Entry" ) , "<ol><li>Entry</li></ol>" )
assert . Equal ( t , markdown . Render ( "1. Entry\n2. Entry" ) , "<ol><li>Entry</li><li>Entry</li></ol>" )
2024-04-01 20:04:20 +02:00
}
2024-04-01 20:59:32 +02:00
func TestTables ( t * testing . T ) {
assert . Equal ( t , markdown . Render ( "| Head |\n| --- |\n| Body |" ) , "<table><thead><tr><th>Head</th></tr></thead><tbody><tr><td>Body</td></tr></tbody></table>" )
assert . Equal ( t , markdown . Render ( "| 1 | 2 |\n| --- | --- |\n| 1 | 2 |" ) , "<table><thead><tr><th>1</th><th>2</th></tr></thead><tbody><tr><td>1</td><td>2</td></tr></tbody></table>" )
}
2024-04-01 21:27:10 +02:00
func TestCode ( t * testing . T ) {
assert . Equal ( t , markdown . Render ( "```\nText\n```" ) , "<pre><code>Text</code></pre>" )
assert . Equal ( t , markdown . Render ( "```go\ntype A struct {\n\t\n}\n```" ) , "<pre><code class=\"language-go\">type A struct {\n\t\n}</code></pre>" )
2024-04-02 19:13:28 +02:00
assert . Equal ( t , markdown . Render ( "`monospace`" ) , "<p><code>monospace</code></p>" )
2024-04-02 21:46:23 +02:00
assert . Equal ( t , markdown . Render ( "`unfinished" ) , "<p>`unfinished</p>" )
2024-04-02 19:13:28 +02:00
assert . Equal ( t , markdown . Render ( "Inline `monospace` text." ) , "<p>Inline <code>monospace</code> text.</p>" )
2024-04-01 21:27:10 +02:00
}
2024-04-01 18:10:52 +02:00
func TestQuote ( t * testing . T ) {
assert . Equal ( t , markdown . Render ( "> Line" ) , "<blockquote><p>Line</p></blockquote>" )
assert . Equal ( t , markdown . Render ( "> Line 1\n> Line 2" ) , "<blockquote><p>Line 1 Line 2</p></blockquote>" )
assert . Equal ( t , markdown . Render ( "> Line 1\n\nLine 2" ) , "<blockquote><p>Line 1</p></blockquote><p>Line 2</p>" )
assert . Equal ( t , markdown . Render ( "> Line 1\n>>Line 2" ) , "<blockquote><p>Line 1</p><blockquote><p>Line 2</p></blockquote></blockquote>" )
assert . Equal ( t , markdown . Render ( "Line 1\n> Line 2\n> Line 3\nLine 4" ) , "<p>Line 1</p><blockquote><p>Line 2 Line 3</p></blockquote><p>Line 4</p>" )
2024-04-01 11:54:14 +02:00
}
2024-04-02 19:25:42 +02:00
func TestSeparator ( t * testing . T ) {
assert . Equal ( t , markdown . Render ( "---" ) , "<hr>" )
assert . Equal ( t , markdown . Render ( "Line 1\n\n---\n\nLine 2" ) , "<p>Line 1</p><hr><p>Line 2</p>" )
}
2024-03-31 23:08:01 +02:00
func TestCombined ( t * testing . T ) {
2024-04-03 21:13:59 +02:00
assert . Equal ( t , markdown . Render ( "# Header\n\nLine 1." ) , ` <h1>Header</h1><p>Line 1.</p> ` )
assert . Equal ( t , markdown . Render ( "# Header\nLine 1.\nLine 2.\nLine 3." ) , ` <h1>Header</h1><p>Line 1. Line 2. Line 3.</p> ` )
assert . Equal ( t , markdown . Render ( "# Header 1\nLine 1.\n# Header 2\nLine 2." ) , ` <h1>Header 1</h1><p>Line 1.</p><h1>Header 2</h1><p>Line 2.</p> ` )
assert . Equal ( t , markdown . Render ( "# [Header Link](https://example.com/)" ) , ` <h1><a href="https://example.com/">Header Link</a></h1> ` )
assert . Equal ( t , markdown . Render ( "# Title\n\n- Entry 1\n- Entry 2\n\nText." ) , ` <h1>Title</h1><ul><li>Entry 1</li><li>Entry 2</li></ul><p>Text.</p> ` )
assert . Equal ( t , markdown . Render ( "- Entry\n# Header" ) , ` <ul><li>Entry</li></ul><h1>Header</h1> ` )
assert . Equal ( t , markdown . Render ( "> - Entry\n> # Header" ) , ` <blockquote><ul><li>Entry</li></ul><h1>Header</h1></blockquote> ` )
assert . Equal ( t , markdown . Render ( "> **bold** and *italic* text." ) , ` <blockquote><p><strong>bold</strong> and <em>italic</em> text.</p></blockquote> ` )
assert . Equal ( t , markdown . Render ( "> __bold__ and _italic_ text." ) , ` <blockquote><p><strong>bold</strong> and <em>italic</em> text.</p></blockquote> ` )
2024-04-01 11:54:14 +02:00
}
func TestSecurity ( t * testing . T ) {
2024-04-03 21:13:59 +02:00
assert . Equal ( t , markdown . Render ( ` [text](javascript:alert("xss")) ` ) , ` <p><a href="">text</a></p> ` )
assert . Equal ( t , markdown . Render ( ` [text](javAscRipt:alert("xss")) ` ) , ` <p><a href="">text</a></p> ` )
assert . Equal ( t , markdown . Render ( ` [text]( javascript:alert("xss")) ` ) , ` <p><a href="">text</a></p> ` )
assert . Equal ( t , markdown . Render ( ` [text]('javAscRipt:alert("xss")') ` ) , ` <p><a href="'javAscRipt:alert("xss")'">text</a></p> ` )
assert . Equal ( t , markdown . Render ( ` [text]("><script>alert(123)</script>) ` ) , ` <p><a href=""><script>alert(123)</script>">text</a></p> ` )
assert . Equal ( t , markdown . Render ( ` [<script>alert(123)</script>]() ` ) , ` <p><a href=""><script>alert(123)</script></a></p> ` )
2024-03-31 21:01:47 +02:00
}