1
+ package filtering
2
+
3
+ import (
4
+ "testing"
5
+ )
6
+
7
+ func TestFilterContent (t * testing.T ) {
8
+ tests := []struct {
9
+ name string
10
+ input string
11
+ expected string
12
+ cfg * Config
13
+ }{
14
+ {
15
+ name :"Empty string" ,
16
+ input :"" ,
17
+ expected :"" ,
18
+ cfg :DefaultConfig (),
19
+ },
20
+ {
21
+ name :"Normal text without hidden content" ,
22
+ input :"This is normal text without any hidden content." ,
23
+ expected :"This is normal text without any hidden content." ,
24
+ cfg :DefaultConfig (),
25
+ },
26
+ {
27
+ name :"Text with invisible characters" ,
28
+ input :"Hidden\u200B characters\u200B in\u200B this\u200B text" ,
29
+ expected :"Hiddencharactersinthistext" ,
30
+ cfg :DefaultConfig (),
31
+ },
32
+ {
33
+ name :"Text with HTML comments" ,
34
+ input :"This has a <!-- hidden comment --> in it." ,
35
+ expected :"This has a [HTML_COMMENT] in it." ,
36
+ cfg :DefaultConfig (),
37
+ },
38
+ {
39
+ name :"Text with HTML elements" ,
40
+ input :"This has <script>alert('hidden')</script> scripts." ,
41
+ expected :"This has [HTML_ELEMENT] scripts." ,
42
+ cfg :DefaultConfig (),
43
+ },
44
+ {
45
+ name :"Text with details/summary" ,
46
+ input :"Collapsed content: <details><summary>Click me</summary>Hidden content</details>" ,
47
+ expected :"Collapsed content:\n \n **Click me:**\n Hidden content\n \n " ,
48
+ cfg :DefaultConfig (),
49
+ },
50
+ {
51
+ name :"Text with small font" ,
52
+ input :"This has <span style=\" font-size:1px\" >hidden tiny text</span> in it." ,
53
+ expected :"This has <span>hidden tiny text</span> in it." ,
54
+ cfg :DefaultConfig (),
55
+ },
56
+ {
57
+ name :"Text with excessive whitespace" ,
58
+ input :"Line 1\n \n \n \n \n \n Line 2" ,
59
+ expected :"Line 1\n \n \n Line 2" ,
60
+ cfg :DefaultConfig (),
61
+ },
62
+ {
63
+ name :"Text with HTML attributes" ,
64
+ input :"<p data-hidden=\" true\" style=\" display:none\" >Hidden paragraph</p>" ,
65
+ expected :"<p>Hidden paragraph</p>" ,
66
+ cfg :DefaultConfig (),
67
+ },
68
+ {
69
+ name :"Filtering disabled" ,
70
+ input :"Hidden\u200B characters and <!-- comments -->" ,
71
+ expected :"Hidden\u200B characters and <!-- comments -->" ,
72
+ cfg :& Config {DisableContentFiltering :true },
73
+ },
74
+ {
75
+ name :"Nil config uses default (filtering enabled)" ,
76
+ input :"Hidden\u200B characters" ,
77
+ expected :"Hiddencharacters" ,
78
+ cfg :nil ,
79
+ },
80
+ {
81
+ name :"Normal markdown with code blocks" ,
82
+ input :"# Title\n \n ```go\n func main() {\n fmt.Println(\" Hello, world!\" )\n }\n ```" ,
83
+ expected :"# Title\n \n ```go\n func main() {\n fmt.Println(\" Hello, world!\" )\n }\n ```" ,
84
+ cfg :DefaultConfig (),
85
+ },
86
+ {
87
+ name :"GitHub flavored markdown with tables" ,
88
+ input :"| Header 1 | Header 2 |\n | -------- | -------- |\n | Cell 1 | Cell 2 |" ,
89
+ expected :"| Header 1 | Header 2 |\n | -------- | -------- |\n | Cell 1 | Cell 2 |" ,
90
+ cfg :DefaultConfig (),
91
+ },
92
+ }
93
+
94
+ for _ ,tc := range tests {
95
+ t .Run (tc .name ,func (t * testing.T ) {
96
+ result := FilterContent (tc .input ,tc .cfg )
97
+ if result != tc .expected {
98
+ t .Errorf ("FilterContent() = %q, want %q" ,result ,tc .expected )
99
+ }
100
+ })
101
+ }
102
+ }
103
+
104
+ func TestMakeCollapsedSectionVisible (t * testing.T ) {
105
+ tests := []struct {
106
+ name string
107
+ input string
108
+ expected string
109
+ }{
110
+ {
111
+ name :"Simple details/summary" ,
112
+ input :"<details><summary>Click me</summary>Hidden content</details>" ,
113
+ expected :"\n \n **Click me:**\n Hidden content\n \n " ,
114
+ },
115
+ {
116
+ name :"Details without summary" ,
117
+ input :"<details>Hidden content</details>" ,
118
+ expected :"\n \n **Collapsed section:**\n Hidden content\n \n " ,
119
+ },
120
+ {
121
+ name :"Nested content" ,
122
+ input :"<details><summary>Outer</summary>Content<details><summary>Inner</summary>Nested</details></details>" ,
123
+ expected :"\n \n **Outer:**\n Content<details><summary>Inner</summary>Nested</details>\n \n " ,
124
+ },
125
+ }
126
+
127
+ for _ ,tc := range tests {
128
+ t .Run (tc .name ,func (t * testing.T ) {
129
+ result := makeCollapsedSectionVisible (tc .input )
130
+ if result != tc .expected {
131
+ t .Errorf ("makeCollapsedSectionVisible() = %q, want %q" ,result ,tc .expected )
132
+ }
133
+ })
134
+ }
135
+ }
136
+
137
+ func TestCleanHTMLAttributes (t * testing.T ) {
138
+ tests := []struct {
139
+ name string
140
+ input string
141
+ expected string
142
+ }{
143
+ {
144
+ name :"Tag with style attribute" ,
145
+ input :"<p style=\" display:none\" >Hidden</p>" ,
146
+ expected :"<p>Hidden</p>" ,
147
+ },
148
+ {
149
+ name :"Tag with data attribute" ,
150
+ input :"<p data-hidden=\" true\" >Hidden</p>" ,
151
+ expected :"<p>Hidden</p>" ,
152
+ },
153
+ {
154
+ name :"Tag with multiple attributes" ,
155
+ input :"<p id=\" para\" style=\" display:none\" data-test=\" value\" >Hidden</p>" ,
156
+ expected :"<p id=\" para\" >Hidden</p>" ,
157
+ },
158
+ {
159
+ name :"Tag with allowed attributes" ,
160
+ input :"<a href=\" https://example.com\" target=\" _blank\" >Link</a>" ,
161
+ expected :"<a href=\" https://example.com\" target=\" _blank\" >Link</a>" ,
162
+ },
163
+ }
164
+
165
+ for _ ,tc := range tests {
166
+ t .Run (tc .name ,func (t * testing.T ) {
167
+ result := cleanHTMLAttributes (tc .input )
168
+ if result != tc .expected {
169
+ t .Errorf ("cleanHTMLAttributes() = %q, want %q" ,result ,tc .expected )
170
+ }
171
+ })
172
+ }
173
+ }