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}