this repo has no description
1package markup 2 3import ( 4 "bytes" 5 "testing" 6) 7 8func TestAtExtension_Rendering(t *testing.T) { 9 tests := []struct { 10 name string 11 markdown string 12 expected string 13 }{ 14 { 15 name: "renders simple at mention", 16 markdown: "Hello @user.tngl.sh!", 17 expected: `<p>Hello <a href="/user.tngl.sh" class="mention">@user.tngl.sh</a>!</p>`, 18 }, 19 { 20 name: "renders multiple at mentions", 21 markdown: "Hi @alice.tngl.sh and @bob.example.com", 22 expected: `<p>Hi <a href="/alice.tngl.sh" class="mention">@alice.tngl.sh</a> and <a href="/bob.example.com" class="mention">@bob.example.com</a></p>`, 23 }, 24 { 25 name: "renders at mention in parentheses", 26 markdown: "Check this out (@user.tngl.sh)", 27 expected: `<p>Check this out (<a href="/user.tngl.sh" class="mention">@user.tngl.sh</a>)</p>`, 28 }, 29 { 30 name: "does not render email", 31 markdown: "Contact me at test@example.com", 32 expected: `<p>Contact me at <a href="mailto:test@example.com">test@example.com</a></p>`, 33 }, 34 { 35 name: "renders at mention with hyphen", 36 markdown: "Follow @user-name.tngl.sh", 37 expected: `<p>Follow <a href="/user-name.tngl.sh" class="mention">@user-name.tngl.sh</a></p>`, 38 }, 39 { 40 name: "renders at mention with numbers", 41 markdown: "@user123.test456.social", 42 expected: `<p><a href="/user123.test456.social" class="mention">@user123.test456.social</a></p>`, 43 }, 44 { 45 name: "at mention at start of line", 46 markdown: "@user.tngl.sh is cool", 47 expected: `<p><a href="/user.tngl.sh" class="mention">@user.tngl.sh</a> is cool</p>`, 48 }, 49 } 50 51 for _, tt := range tests { 52 t.Run(tt.name, func(t *testing.T) { 53 md := NewMarkdown() 54 55 var buf bytes.Buffer 56 if err := md.Convert([]byte(tt.markdown), &buf); err != nil { 57 t.Fatalf("failed to convert markdown: %v", err) 58 } 59 60 result := buf.String() 61 if result != tt.expected+"\n" { 62 t.Errorf("expected:\n%s\ngot:\n%s", tt.expected, result) 63 } 64 }) 65 } 66} 67 68func TestAtExtension_WithOtherMarkdown(t *testing.T) { 69 tests := []struct { 70 name string 71 markdown string 72 contains string 73 }{ 74 { 75 name: "at mention with bold", 76 markdown: "**Hello @user.tngl.sh**", 77 contains: `<strong>Hello <a href="/user.tngl.sh" class="mention">@user.tngl.sh</a></strong>`, 78 }, 79 { 80 name: "at mention with italic", 81 markdown: "*Check @user.tngl.sh*", 82 contains: `<em>Check <a href="/user.tngl.sh" class="mention">@user.tngl.sh</a></em>`, 83 }, 84 { 85 name: "at mention in list", 86 markdown: "- Item 1\n- @user.tngl.sh\n- Item 3", 87 contains: `<a href="/user.tngl.sh" class="mention">@user.tngl.sh</a>`, 88 }, 89 { 90 name: "at mention in link", 91 markdown: "[@regnault.dev](https://regnault.dev)", 92 contains: `<a href="https://regnault.dev">@regnault.dev</a>`, 93 }, 94 { 95 name: "at mention in link again", 96 markdown: "[check out @regnault.dev](https://regnault.dev)", 97 contains: `<a href="https://regnault.dev">check out @regnault.dev</a>`, 98 }, 99 { 100 name: "at mention in link again, multiline", 101 markdown: "[\ncheck out @regnault.dev](https://regnault.dev)", 102 contains: "<a href=\"https://regnault.dev\">\ncheck out @regnault.dev</a>", 103 }, 104 } 105 106 for _, tt := range tests { 107 t.Run(tt.name, func(t *testing.T) { 108 md := NewMarkdown() 109 110 var buf bytes.Buffer 111 if err := md.Convert([]byte(tt.markdown), &buf); err != nil { 112 t.Fatalf("failed to convert markdown: %v", err) 113 } 114 115 result := buf.String() 116 if !bytes.Contains([]byte(result), []byte(tt.contains)) { 117 t.Errorf("expected output to contain:\n%s\ngot:\n%s", tt.contains, result) 118 } 119 }) 120 } 121}