loofah 1.0.0 → 2.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +489 -0
  3. data/MIT-LICENSE.txt +3 -1
  4. data/README.md +364 -0
  5. data/SECURITY.md +18 -0
  6. data/lib/loofah/elements.rb +88 -11
  7. data/lib/loofah/helpers.rb +76 -2
  8. data/lib/loofah/html/document.rb +1 -0
  9. data/lib/loofah/html/document_fragment.rb +9 -2
  10. data/lib/loofah/html5/libxml2_workarounds.rb +27 -0
  11. data/lib/loofah/html5/safelist.rb +1042 -0
  12. data/lib/loofah/html5/scrub.rb +198 -40
  13. data/lib/loofah/instance_methods.rb +16 -10
  14. data/lib/loofah/metahelpers.rb +9 -10
  15. data/lib/loofah/scrubber.rb +22 -6
  16. data/lib/loofah/scrubbers.rb +96 -16
  17. data/lib/loofah/version.rb +5 -0
  18. data/lib/loofah/xml/document.rb +1 -0
  19. data/lib/loofah/xml/document_fragment.rb +5 -2
  20. data/lib/loofah.rb +38 -25
  21. metadata +159 -172
  22. data/CHANGELOG.rdoc +0 -134
  23. data/Gemfile +0 -1
  24. data/Manifest.txt +0 -34
  25. data/README.rdoc +0 -312
  26. data/Rakefile +0 -53
  27. data/benchmark/benchmark.rb +0 -149
  28. data/benchmark/fragment.html +0 -96
  29. data/benchmark/helper.rb +0 -73
  30. data/benchmark/www.slashdot.com.html +0 -2560
  31. data/lib/loofah/html5/whitelist.rb +0 -168
  32. data/test/helper.rb +0 -7
  33. data/test/html5/test_sanitizer.rb +0 -248
  34. data/test/integration/test_ad_hoc.rb +0 -176
  35. data/test/integration/test_helpers.rb +0 -33
  36. data/test/integration/test_html.rb +0 -51
  37. data/test/integration/test_scrubbers.rb +0 -331
  38. data/test/integration/test_xml.rb +0 -55
  39. data/test/unit/test_api.rb +0 -138
  40. data/test/unit/test_helpers.rb +0 -27
  41. data/test/unit/test_scrubber.rb +0 -229
  42. data/test/unit/test_scrubbers.rb +0 -14
@@ -1,51 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helper'))
2
-
3
- class TestHtml < Test::Unit::TestCase
4
- context "html fragment" do
5
- context "#to_s" do
6
- should "not include head tags (like style)" do
7
- html = Loofah.fragment "<style>foo</style><div>bar</div>"
8
- assert_equal "<div>bar</div>", html.to_s
9
- end
10
- end
11
-
12
- context "#text" do
13
- should "not include head tags (like style)" do
14
- html = Loofah.fragment "<style>foo</style><div>bar</div>"
15
- assert_equal "bar", html.text
16
- end
17
- end
18
-
19
- context "#to_text" do
20
- should "add newlines before and after block elements" do
21
- html = Loofah.fragment "<div>tweedle<h1>beetle</h1>bottle<span>puddle</span>paddle<div>battle</div>muddle</div>"
22
- assert_equal "\ntweedle\nbeetle\nbottlepuddlepaddle\nbattle\nmuddle\n", html.to_text
23
- end
24
-
25
- should "remove extraneous whitespace" do
26
- html = Loofah.fragment "<div>tweedle\n\n\t\n\s\nbeetle</div>"
27
- assert_equal "\ntweedle\n\nbeetle\n", html.to_text
28
- end
29
- end
30
- end
31
-
32
- context "html document" do
33
- should "not include head tags (like style)" do
34
- html = Loofah.document "<style>foo</style><div>bar</div>"
35
- assert_equal "bar", html.text
36
- end
37
-
38
- context "#to_text" do
39
- should "add newlines before and after block elements" do
40
- html = Loofah.document "<div>tweedle<h1>beetle</h1>bottle<span>puddle</span>paddle<div>battle</div>muddle</div>"
41
- assert_equal "\ntweedle\nbeetle\nbottlepuddlepaddle\nbattle\nmuddle\n", html.to_text
42
- end
43
-
44
- should "remove extraneous whitespace" do
45
- html = Loofah.document "<div>tweedle\n\n\t\n\s\nbeetle</div>"
46
- assert_equal "\ntweedle\n\nbeetle\n", html.to_text
47
- end
48
- end
49
- end
50
- end
51
-
@@ -1,331 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helper'))
2
-
3
- class TestScrubbers < Test::Unit::TestCase
4
-
5
- INVALID_FRAGMENT = "<invalid>foo<p>bar</p>bazz</invalid><div>quux</div>"
6
- INVALID_ESCAPED = "&lt;invalid&gt;foo&lt;p&gt;bar&lt;/p&gt;bazz&lt;/invalid&gt;<div>quux</div>"
7
- INVALID_PRUNED = "<div>quux</div>"
8
- INVALID_STRIPPED = "foo<p>bar</p>bazz<div>quux</div>"
9
-
10
- WHITEWASH_FRAGMENT = "<o:div>no</o:div><div id='no'>foo</div><invalid>bar</invalid><!--[if gts mso9]><div>microsofty stuff</div><![endif]-->"
11
- WHITEWASH_RESULT = "<div>foo</div>"
12
-
13
- NOFOLLOW_FRAGMENT = '<a href="http://www.example.com/">Click here</a>'
14
- NOFOLLOW_RESULT = '<a href="http://www.example.com/" rel="nofollow">Click here</a>'
15
-
16
- ENTITY_FRAGMENT = "<p>this is &lt; that &quot;&amp;&quot; the other &gt; boo&apos;ya</p><div>w00t</div>"
17
- ENTITY_TEXT = %Q(this is < that "&" the other > boo\'yaw00t)
18
-
19
- ENTITY_HACK_ATTACK = "<div><div>Hack attack!</div><div>&lt;script&gt;alert('evil')&lt;/script&gt;</div></div>"
20
- ENTITY_HACK_ATTACK_TEXT_SCRUB = "Hack attack!&lt;script&gt;alert('evil')&lt;/script&gt;"
21
- ENTITY_HACK_ATTACK_TEXT_SCRUB_UNESC = "Hack attack!<script>alert('evil')</script>"
22
-
23
- context "Document" do
24
- context "#scrub!" do
25
- context ":escape" do
26
- should "escape bad tags" do
27
- doc = Loofah::HTML::Document.parse "<html><body>#{INVALID_FRAGMENT}</body></html>"
28
- result = doc.scrub! :escape
29
-
30
- assert_equal INVALID_ESCAPED, doc.xpath('/html/body').inner_html
31
- assert_equal doc, result
32
- end
33
- end
34
-
35
- context ":prune" do
36
- should "prune bad tags" do
37
- doc = Loofah::HTML::Document.parse "<html><body>#{INVALID_FRAGMENT}</body></html>"
38
- result = doc.scrub! :prune
39
-
40
- assert_equal INVALID_PRUNED, doc.xpath('/html/body').inner_html
41
- assert_equal doc, result
42
- end
43
- end
44
-
45
- context ":strip" do
46
- should "strip bad tags" do
47
- doc = Loofah::HTML::Document.parse "<html><body>#{INVALID_FRAGMENT}</body></html>"
48
- result = doc.scrub! :strip
49
-
50
- assert_equal INVALID_STRIPPED, doc.xpath('/html/body').inner_html
51
- assert_equal doc, result
52
- end
53
- end
54
-
55
- context ":whitewash" do
56
- should "whitewash the markup" do
57
- doc = Loofah::HTML::Document.parse "<html><body>#{WHITEWASH_FRAGMENT}</body></html>"
58
- result = doc.scrub! :whitewash
59
-
60
- assert_equal WHITEWASH_RESULT, doc.xpath('/html/body').inner_html
61
- assert_equal doc, result
62
- end
63
- end
64
-
65
- context ":nofollow" do
66
- should "add a 'nofollow' attribute to hyperlinks" do
67
- doc = Loofah::HTML::Document.parse "<html><body>#{NOFOLLOW_FRAGMENT}</body></html>"
68
- result = doc.scrub! :nofollow
69
-
70
- assert_equal NOFOLLOW_RESULT, doc.xpath('/html/body').inner_html
71
- assert_equal doc, result
72
- end
73
- end
74
- end
75
-
76
- context "#scrub_document" do
77
- should "be a shortcut for parse-and-scrub" do
78
- mock_doc = mock
79
- Loofah.expects(:document).with(:string_or_io).returns(mock_doc)
80
- mock_doc.expects(:scrub!).with(:method)
81
-
82
- Loofah.scrub_document(:string_or_io, :method)
83
- end
84
- end
85
-
86
- context "#text" do
87
- should "leave behind only inner text with html entities still escaped" do
88
- doc = Loofah::HTML::Document.parse "<html><body>#{ENTITY_HACK_ATTACK}</body></html>"
89
- result = doc.text
90
-
91
- assert_equal ENTITY_HACK_ATTACK_TEXT_SCRUB, result
92
- end
93
-
94
- context "with encode_special_chars => false" do
95
- should "leave behind only inner text with html entities unescaped" do
96
- doc = Loofah::HTML::Document.parse "<html><body>#{ENTITY_HACK_ATTACK}</body></html>"
97
- result = doc.text(:encode_special_chars => false)
98
-
99
- assert_equal ENTITY_HACK_ATTACK_TEXT_SCRUB_UNESC, result
100
- end
101
- end
102
-
103
- context "with encode_special_chars => true" do
104
- should "leave behind only inner text with html entities still escaped" do
105
- doc = Loofah::HTML::Document.parse "<html><body>#{ENTITY_HACK_ATTACK}</body></html>"
106
- result = doc.text(:encode_special_chars => true)
107
-
108
- assert_equal ENTITY_HACK_ATTACK_TEXT_SCRUB, result
109
- end
110
- end
111
- end
112
-
113
- context "#to_s" do
114
- should "generate HTML" do
115
- doc = Loofah.scrub_document "<html><head><title>quux</title></head><body><div>foo</div></body></html>", :prune
116
- assert_not_nil doc.xpath("/html").first
117
- assert_not_nil doc.xpath("/html/head").first
118
- assert_not_nil doc.xpath("/html/body").first
119
-
120
- string = doc.to_s
121
- assert_contains string, /<!DOCTYPE/
122
- assert_contains string, /<html>/
123
- assert_contains string, /<head>/
124
- assert_contains string, /<body>/
125
- end
126
- end
127
-
128
- context "#serialize" do
129
- should "generate HTML" do
130
- doc = Loofah.scrub_document "<html><head><title>quux</title></head><body><div>foo</div></body></html>", :prune
131
- assert_not_nil doc.xpath("/html").first
132
- assert_not_nil doc.xpath("/html/head").first
133
- assert_not_nil doc.xpath("/html/body").first
134
-
135
- string = doc.serialize
136
- assert_contains string, /<!DOCTYPE/
137
- assert_contains string, /<html>/
138
- assert_contains string, /<head>/
139
- assert_contains string, /<body>/
140
- end
141
- end
142
-
143
- context "Node" do
144
- context "#scrub!" do
145
- should "only scrub subtree" do
146
- xml = Loofah.document <<-EOHTML
147
- <html><body>
148
- <div class='scrub'>
149
- <script>I should be removed</script>
150
- </div>
151
- <div class='noscrub'>
152
- <script>I should remain</script>
153
- </div>
154
- </body></html>
155
- EOHTML
156
- node = xml.at_css "div.scrub"
157
- node.scrub!(:prune)
158
- assert_contains xml.to_s, /I should remain/
159
- assert_does_not_contain xml.to_s, /I should be removed/
160
- end
161
- end
162
- end
163
-
164
- context "NodeSet" do
165
- context "#scrub!" do
166
- should "only scrub subtrees" do
167
- xml = Loofah.document <<-EOHTML
168
- <html><body>
169
- <div class='scrub'>
170
- <script>I should be removed</script>
171
- </div>
172
- <div class='noscrub'>
173
- <script>I should remain</script>
174
- </div>
175
- <div class='scrub'>
176
- <script>I should also be removed</script>
177
- </div>
178
- </body></html>
179
- EOHTML
180
- node_set = xml.css "div.scrub"
181
- assert_equal 2, node_set.length
182
- node_set.scrub!(:prune)
183
- assert_contains xml.to_s, /I should remain/
184
- assert_does_not_contain xml.to_s, /I should be removed/
185
- assert_does_not_contain xml.to_s, /I should also be removed/
186
- end
187
- end
188
- end
189
- end
190
-
191
- context "DocumentFragment" do
192
- context "#scrub!" do
193
- context ":escape" do
194
- should "escape bad tags" do
195
- doc = Loofah::HTML::DocumentFragment.parse "<div>#{INVALID_FRAGMENT}</div>"
196
- result = doc.scrub! :escape
197
-
198
- assert_equal INVALID_ESCAPED, doc.xpath("./div").inner_html
199
- assert_equal doc, result
200
- end
201
- end
202
-
203
- context ":prune" do
204
- should "prune bad tags" do
205
- doc = Loofah::HTML::DocumentFragment.parse "<div>#{INVALID_FRAGMENT}</div>"
206
- result = doc.scrub! :prune
207
-
208
- assert_equal INVALID_PRUNED, doc.xpath("./div").inner_html
209
- assert_equal doc, result
210
- end
211
- end
212
-
213
- context ":strip" do
214
- should "strip bad tags" do
215
- doc = Loofah::HTML::DocumentFragment.parse "<div>#{INVALID_FRAGMENT}</div>"
216
- result = doc.scrub! :strip
217
-
218
- assert_equal INVALID_STRIPPED, doc.xpath("./div").inner_html
219
- assert_equal doc, result
220
- end
221
- end
222
-
223
- context ":whitewash" do
224
- should "whitewash the markup" do
225
- doc = Loofah::HTML::DocumentFragment.parse "<div>#{WHITEWASH_FRAGMENT}</div>"
226
- result = doc.scrub! :whitewash
227
-
228
- assert_equal WHITEWASH_RESULT, doc.xpath("./div").inner_html
229
- assert_equal doc, result
230
- end
231
- end
232
-
233
- context ":nofollow" do
234
- should "add a 'nofollow' attribute to hyperlinks" do
235
- doc = Loofah::HTML::DocumentFragment.parse "<div>#{NOFOLLOW_FRAGMENT}</div>"
236
- result = doc.scrub! :nofollow
237
-
238
- assert_equal NOFOLLOW_RESULT, doc.xpath("./div").inner_html
239
- assert_equal doc, result
240
- end
241
- end
242
- end
243
-
244
- context "#scrub_fragment" do
245
- should "be a shortcut for parse-and-scrub" do
246
- mock_doc = mock
247
- Loofah.expects(:fragment).with(:string_or_io).returns(mock_doc)
248
- mock_doc.expects(:scrub!).with(:method)
249
-
250
- Loofah.scrub_fragment(:string_or_io, :method)
251
- end
252
- end
253
-
254
- context "#text" do
255
- should "leave behind only inner text with html entities still escaped" do
256
- doc = Loofah::HTML::DocumentFragment.parse "<div>#{ENTITY_HACK_ATTACK}</div>"
257
- result = doc.text
258
-
259
- assert_equal ENTITY_HACK_ATTACK_TEXT_SCRUB, result
260
- end
261
-
262
- context "with encode_special_chars => false" do
263
- should "leave behind only inner text with html entities unescaped" do
264
- doc = Loofah::HTML::DocumentFragment.parse "<div>#{ENTITY_HACK_ATTACK}</div>"
265
- result = doc.text(:encode_special_chars => false)
266
-
267
- assert_equal ENTITY_HACK_ATTACK_TEXT_SCRUB_UNESC, result
268
- end
269
- end
270
-
271
- context "with encode_special_chars => true" do
272
- should "leave behind only inner text with html entities still escaped" do
273
- doc = Loofah::HTML::DocumentFragment.parse "<div>#{ENTITY_HACK_ATTACK}</div>"
274
- result = doc.text(:encode_special_chars => true)
275
-
276
- assert_equal ENTITY_HACK_ATTACK_TEXT_SCRUB, result
277
- end
278
- end
279
- end
280
-
281
- context "#to_s" do
282
- should "not remove entities" do
283
- string = Loofah.scrub_fragment(ENTITY_FRAGMENT, :prune).to_s
284
- assert_contains string, /this is &lt;/
285
- end
286
- end
287
-
288
- context "Node" do
289
- context "#scrub!" do
290
- should "only scrub subtree" do
291
- xml = Loofah.fragment <<-EOHTML
292
- <div class='scrub'>
293
- <script>I should be removed</script>
294
- </div>
295
- <div class='noscrub'>
296
- <script>I should remain</script>
297
- </div>
298
- EOHTML
299
- node = xml.at_css "div.scrub"
300
- node.scrub!(:prune)
301
- assert_contains xml.to_s, /I should remain/
302
- assert_does_not_contain xml.to_s, /I should be removed/
303
- end
304
- end
305
- end
306
-
307
- context "NodeSet" do
308
- context "#scrub!" do
309
- should "only scrub subtrees" do
310
- xml = Loofah.fragment <<-EOHTML
311
- <div class='scrub'>
312
- <script>I should be removed</script>
313
- </div>
314
- <div class='noscrub'>
315
- <script>I should remain</script>
316
- </div>
317
- <div class='scrub'>
318
- <script>I should also be removed</script>
319
- </div>
320
- EOHTML
321
- node_set = xml.css "div.scrub"
322
- assert_equal 2, node_set.length
323
- node_set.scrub!(:prune)
324
- assert_contains xml.to_s, /I should remain/
325
- assert_does_not_contain xml.to_s, /I should be removed/
326
- assert_does_not_contain xml.to_s, /I should also be removed/
327
- end
328
- end
329
- end
330
- end
331
- end
@@ -1,55 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helper'))
2
-
3
- class TestXml < Test::Unit::TestCase
4
- context "integration test" do
5
- context "xml document" do
6
- context "custom scrubber" do
7
- should "act as expected" do
8
- xml = Loofah.xml_document <<-EOXML
9
- <root>
10
- <employee deceased='true'>Abraham Lincoln</employee>
11
- <employee deceased='false'>Abe Vigoda</employee>
12
- </root>
13
- EOXML
14
- bring_out_your_dead = Loofah::Scrubber.new do |node|
15
- if node.name == "employee" and node["deceased"] == "true"
16
- node.remove
17
- Loofah::Scrubber::STOP # don't bother with the rest of the subtree
18
- end
19
- end
20
- assert_equal 2, xml.css("employee").length
21
-
22
- xml.scrub!(bring_out_your_dead)
23
-
24
- employees = xml.css "employee"
25
- assert_equal 1, employees.length
26
- assert_equal "Abe Vigoda", employees.first.inner_text
27
- end
28
- end
29
- end
30
-
31
- context "xml fragment" do
32
- context "custom scrubber" do
33
- should "act as expected" do
34
- xml = Loofah.xml_fragment <<-EOXML
35
- <employee deceased='true'>Abraham Lincoln</employee>
36
- <employee deceased='false'>Abe Vigoda</employee>
37
- EOXML
38
- bring_out_your_dead = Loofah::Scrubber.new do |node|
39
- if node.name == "employee" and node["deceased"] == "true"
40
- node.remove
41
- Loofah::Scrubber::STOP # don't bother with the rest of the subtree
42
- end
43
- end
44
- assert_equal 2, xml.css("employee").length
45
-
46
- xml.scrub!(bring_out_your_dead)
47
-
48
- employees = xml.css "employee"
49
- assert_equal 1, employees.length
50
- assert_equal "Abe Vigoda", employees.first.inner_text
51
- end
52
- end
53
- end
54
- end
55
- end
@@ -1,138 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helper'))
2
-
3
- class TestApi < Test::Unit::TestCase
4
-
5
- HTML = "<div>a</div>\n<div>b</div>"
6
- XML_FRAGMENT = "<div>a</div>\n<div>b</div>"
7
- XML = "<root>#{XML_FRAGMENT}</root>"
8
-
9
- def test_loofah_document
10
- doc = Loofah.document(HTML)
11
- assert_html_documentish doc
12
- end
13
-
14
- def test_loofah_fragment
15
- doc = Loofah.fragment(HTML)
16
- assert_html_fragmentish doc
17
- end
18
-
19
- def test_loofah_xml_document
20
- doc = Loofah.xml_document(XML)
21
- assert_xml_documentish doc
22
- end
23
-
24
- def test_loofah_xml_fragment
25
- doc = Loofah.xml_fragment(XML_FRAGMENT)
26
- assert_xml_fragmentish doc
27
- end
28
-
29
- def test_loofah_html_document_parse_method
30
- doc = Loofah::HTML::Document.parse(HTML)
31
- assert_html_documentish doc
32
- end
33
-
34
- def test_loofah_xml_document_parse_method
35
- doc = Loofah::XML::Document.parse(XML)
36
- assert_xml_documentish doc
37
- end
38
-
39
- def test_loofah_html_document_fragment_parse_method
40
- doc = Loofah::HTML::DocumentFragment.parse(HTML)
41
- assert_html_fragmentish doc
42
- end
43
-
44
- def test_loofah_xml_document_fragment_parse_method
45
- doc = Loofah::XML::DocumentFragment.parse(XML_FRAGMENT)
46
- assert_xml_fragmentish doc
47
- end
48
-
49
- def test_loofah_document_scrub!
50
- doc = Loofah.document(HTML).scrub!(:strip)
51
- assert_html_documentish doc
52
- end
53
-
54
- def test_loofah_fragment_scrub!
55
- doc = Loofah.fragment(HTML).scrub!(:strip)
56
- assert_html_fragmentish doc
57
- end
58
-
59
- def test_loofah_xml_document_scrub!
60
- scrubber = Loofah::Scrubber.new { |node| }
61
- doc = Loofah.xml_document(XML).scrub!(scrubber)
62
- assert_xml_documentish doc
63
- end
64
-
65
- def test_loofah_xml_fragment_scrub!
66
- scrubber = Loofah::Scrubber.new { |node| }
67
- doc = Loofah.xml_fragment(XML_FRAGMENT).scrub!(scrubber)
68
- assert_xml_fragmentish doc
69
- end
70
-
71
- def test_loofah_html_document_node_scrub!
72
- doc = Loofah.document(HTML)
73
- assert(node = doc.at_css("div"))
74
- node.scrub!(:strip)
75
- end
76
-
77
- def test_loofah_html_fragment_node_scrub!
78
- doc = Loofah.fragment(HTML)
79
- assert(node = doc.at_css("div"))
80
- node.scrub!(:strip)
81
- end
82
-
83
- def test_loofah_xml_document_node_scrub!
84
- doc = Loofah.xml_document(XML)
85
- assert(node = doc.at_css("div"))
86
- node.scrub!(:strip)
87
- end
88
-
89
- def test_loofah_xml_fragment_node_scrub!
90
- doc = Loofah.xml_fragment(XML)
91
- assert(node = doc.at_css("div"))
92
- node.scrub!(:strip)
93
- end
94
-
95
- def test_loofah_nodeset_scrub!
96
- doc = Loofah.document(HTML)
97
- assert(node_set = doc.css("div"))
98
- assert_instance_of Nokogiri::XML::NodeSet, node_set
99
- node_set.scrub!(:strip)
100
- end
101
-
102
- should "HTML::DocumentFragment exposes serialize_root" do
103
- doc = Loofah.fragment(HTML)
104
- assert_equal HTML, doc.serialize_root.to_html
105
- end
106
-
107
- should "HTML::Document exposes serialize_root" do
108
- doc = Loofah.document(HTML)
109
- assert_equal HTML, doc.serialize_root.children.to_html
110
- end
111
-
112
- private
113
-
114
- def assert_html_documentish(doc)
115
- assert_kind_of Nokogiri::HTML::Document, doc
116
- assert_kind_of Loofah::HTML::Document, doc
117
- assert_equal HTML, doc.xpath("/html/body").inner_html
118
- end
119
-
120
- def assert_html_fragmentish(doc)
121
- assert_kind_of Nokogiri::HTML::DocumentFragment, doc
122
- assert_kind_of Loofah::HTML::DocumentFragment, doc
123
- assert_equal HTML, doc.inner_html
124
- end
125
-
126
- def assert_xml_documentish(doc)
127
- assert_kind_of Nokogiri::XML::Document, doc
128
- assert_kind_of Loofah::XML::Document, doc
129
- assert_equal XML, doc.root.to_xml
130
- end
131
-
132
- def assert_xml_fragmentish(doc)
133
- assert_kind_of Nokogiri::XML::DocumentFragment, doc
134
- assert_kind_of Loofah::XML::DocumentFragment, doc
135
- assert_equal XML_FRAGMENT, doc.children.to_xml
136
- end
137
-
138
- end
@@ -1,27 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helper'))
2
-
3
- class TestHelpers < Test::Unit::TestCase
4
-
5
- HTML_STRING = "<div>omgwtfbbq</div>"
6
-
7
- context "#strip_tags" do
8
- should "invoke Loofah.fragment.text" do
9
- mock_doc = mock
10
- Loofah.expects(:fragment).with(HTML_STRING).returns(mock_doc)
11
- mock_doc.expects(:text)
12
-
13
- Loofah::Helpers.strip_tags HTML_STRING
14
- end
15
- end
16
-
17
- context "#sanitize" do
18
- should "invoke Loofah.scrub_fragment(:strip).to_s" do
19
- mock_doc = mock
20
- Loofah.expects(:fragment).with(HTML_STRING).returns(mock_doc)
21
- mock_doc.expects(:scrub!).with(:strip).returns(mock_doc)
22
- mock_doc.expects(:to_s)
23
-
24
- Loofah::Helpers.sanitize HTML_STRING
25
- end
26
- end
27
- end