blob: 9830e764c2fee995ca514c09914b4802f8a58b10 [file] [log] [blame]
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package sanitizer
import (
"testing"
)
func TestSanitizeBytes(t *testing.T) {
var testCases = []struct {
input, want string
}{
{
"<script>body</script>",
"",
},
{
`<a href="%">body</a>`,
`<a>body</a>`,
},
{
`<a href="unrecognized://foo">body</a>`,
`<a>body</a>`,
},
{
`<p dir="RTL" lang="en" id="foo" title="a title"></p>`,
`<p dir="RTL" lang="en" id="foo" title="a title"></p>`,
},
{
`<p dir="ABC" lang="e" id="#foo" title="a title%"></p>`,
`<p></p>`,
},
{
`<a href="https://golang.org">body</a>`,
`<a href="https://golang.org" rel="nofollow">body</a>`,
},
{
`<script></script><a href="https://golang.org">body</a>`,
`<a href="https://golang.org" rel="nofollow">body</a>`,
},
{
`
<img src="file.jpeg" alt="alt text" usemap="#map" width="600", height="400">
<map name="map">
<area shape="rect" coords="1,2,3,4" alt="alt text" href="page.html">
</map>
`,
`
<img src="file.jpeg" alt="alt text" usemap="#map" width="600" height="400"/>
`,
},
{
`<area href="link" rel="value"/>`,
``,
},
{
`<p href="notonp">body</p>`,
`<p>body</p>`,
},
{
`<blockquote cite="valid_url">body</blockquote>`,
`<blockquote cite="valid_url">body</blockquote>`,
},
{
`<blockquote cite="invalid://url">body</blockquote>`,
`<blockquote>body</blockquote>`,
},
{
`<!DOCTYPE html>text<!-- comment --><p>`,
`text<p></p>`,
},
{
`<article badattr="bad"> <ol> <script> <li>hello</li> </script> <li>thi<wbr/>ng</li> </ol> <ul> </ul> </article>`,
`<article> <ol> <li>thi<wbr/>ng</li> </ol> <ul> </ul> </article>`,
},
{
`<details open="closed"></details>`,
`<details></details>`,
},
{
`<details open="open"></details>`,
`<details open="open"></details>`,
},
{
`<details open=""></details>`,
`<details open=""></details>`,
},
{
`<div align="center">`,
`<div align="center"></div>`,
},
{
`<p><bad>A</bad><bad>B</bad></p>`,
`<p></p>`,
},
{
`
<table height="40" width="30" summary="foo">
<caption>a caption</caption>
<colgroup align="left" valign="BOTTOM" span="4" height="30" width="20%">
<col align="justify" span="32" valign="baseline" height="40%" width="40"/>
</colgroup>
<thead align="LeFt" valign="MiDdLe">
<tr align="rIgHt" valign="tOp">
<th abbr="hello world" align="right" colspan="4" rowspan="3" headers="foo bar" height="30%" width="4" scope="rowgroup" valign="top" nowrap="">th</th>
<td abbr="goodbye world" align="left" colspan="3" rowspan="2" headers="baz quux" height="20" width="50%" scope="col" valign="baseline" nowrap="nowrap">td</td>
</tr>
</thead>
<tbody align="justify" valign="bottom">
</tbody>
<tfoot align="center" valign="middle">
</tfoot>
</table>
`, `
<table height="40" width="30" summary="foo">
<caption>a caption</caption>
<colgroup align="left" valign="BOTTOM" span="4" height="30" width="20%">
<col align="justify" span="32" valign="baseline" height="40%" width="40"/>
</colgroup>
<thead align="LeFt" valign="MiDdLe">
<tr align="rIgHt" valign="tOp">
<th abbr="hello world" align="right" colspan="4" rowspan="3" headers="foo bar" height="30%" width="4" scope="rowgroup" valign="top" nowrap="">th</th>
<td abbr="goodbye world" align="left" colspan="3" rowspan="2" headers="baz quux" height="20" width="50%" scope="col" valign="baseline" nowrap="nowrap">td</td>
</tr>
</thead>
<tbody align="justify" valign="bottom">
</tbody>
<tfoot align="center" valign="middle">
</tfoot>
</table>
`,
},
}
for _, tc := range testCases {
got := string(SanitizeBytes([]byte(tc.input)))
if got != tc.want {
t.Errorf("SanitizeBytes(%q): got %q, want %q", tc.input, got, tc.want)
}
}
}