Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
100.00% |
1 / 1 |
|
100.00% |
15 / 15 |
CRAP | |
100.00% |
74 / 74 |
| HTMLFilterTest | |
100.00% |
1 / 1 |
|
100.00% |
15 / 15 |
15 | |
100.00% |
74 / 74 |
| setUp() | |
100.00% |
1 / 1 |
1 | |
100.00% |
6 / 6 |
|||
| tearDown() | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
|||
| testPlainTextWithoutAnyHtmlRemainsUnchanged() | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
| assertFilteredHTML($expected_html, $html) | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
|||
| testDisallowedTagsAreRemoved() | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| testAllowedTagsAreKept() | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
| testDisallowedAttributesAreRemoved() | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
|||
| testAllowedAttributesAreKept() | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
|||
| testAllowedAttributesNotMatchingARegexpAreRemoved() | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
|||
| testHTMLEntitiesAreLeftUnchanged() | |
100.00% |
1 / 1 |
1 | |
100.00% |
7 / 7 |
|||
| testNodesAreCopiedRecursively() | |
100.00% |
1 / 1 |
1 | |
100.00% |
7 / 7 |
|||
| testHtmlCommentsArePreserved() | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
| testInvalidMarkupIsIgnored() | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
| testWorksWithCjkCharacters() | |
100.00% |
1 / 1 |
1 | |
100.00% |
8 / 8 |
|||
| testIgnoresInvalidUtf8() | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
|||
| <?php | |
| namespace AthosHun\HTMLFilter; | |
| class HTMLFilterTest extends \PHPUnit_Framework_TestCase | |
| { | |
| private $filter; | |
| private $filter_config; | |
| private $mb_substitute_character; | |
| public function setUp() | |
| { | |
| $this->filter_config = new Configuration(); | |
| $this->filter = new HTMLFilter(); | |
| $this->mbstring_substitute_character = ini_get( | |
| "mbstring.substitute_character" | |
| ); | |
| ini_set("mbstring.substitute_character", "none"); | |
| } | |
| public function tearDown() | |
| { | |
| ini_set( | |
| "mbstring.substitute_character", | |
| $this->mbstring_substitute_character | |
| ); | |
| } | |
| public function testPlainTextWithoutAnyHtmlRemainsUnchanged() | |
| { | |
| $this->assertFilteredHTML("", ""); | |
| $this->assertFilteredHTML("hello", "hello"); | |
| } | |
| private function assertFilteredHTML($expected_html, $html) | |
| { | |
| $this->assertSame( | |
| $expected_html, | |
| $this->filter->filter($this->filter_config, $html) | |
| ); | |
| } | |
| public function testDisallowedTagsAreRemoved() | |
| { | |
| $this->assertFilteredHTML("lorem ipsum", "lorem <a>ipsum</a>"); | |
| } | |
| public function testAllowedTagsAreKept() | |
| { | |
| $this->filter_config->allowTag("a"); | |
| $html = "lorem <a>ipsum</a>"; | |
| $this->assertFilteredHTML($html, $html); | |
| } | |
| public function testDisallowedAttributesAreRemoved() | |
| { | |
| $this->filter_config->allowTag("a"); | |
| $this->assertFilteredHTML( | |
| "lorem <a>ipsum</a>", | |
| "lorem <a href=\"hello\">ipsum</a>" | |
| ); | |
| } | |
| public function testAllowedAttributesAreKept() | |
| { | |
| $this->filter_config->allowTag("a") | |
| ->allowAttribute("a", "href"); | |
| $html = "lorem <a href=\"hello\">ipsum</a>"; | |
| $this->assertFilteredHTML($html, $html); | |
| } | |
| public function testAllowedAttributesNotMatchingARegexpAreRemoved() | |
| { | |
| $this->filter_config->allowAttribute("a", "href", "/^hello\$/"); | |
| $this->assertFilteredHTML( | |
| "lorem <a>ipsum</a>", | |
| "lorem <a href=\"world\">ipsum</a>" | |
| ); | |
| } | |
| public function testHTMLEntitiesAreLeftUnchanged() | |
| { | |
| $this->filter_config->allowAttribute("a", "href"); | |
| $quoted_special_chars_attr = "<"&>'"; | |
| $quoted_special_chars_text = "<\"&>'"; | |
| $quoted_html = "<a href=\"$quoted_special_chars_attr\">" | |
| . $quoted_special_chars_text | |
| . "</a>"; | |
| $this->assertFilteredHTML($quoted_html, $quoted_html); | |
| } | |
| public function testNodesAreCopiedRecursively() | |
| { | |
| $this->filter_config->allowTag("p") | |
| ->allowTag("b") | |
| ->allowAttribute("a", "href", "/^hello\$/"); | |
| $this->assertFilteredHTML( | |
| "Lorem <p><b><a>ipsum</a> dolor sit</b> amet</p>", | |
| "Lorem <p><b><a>ipsum</a> <em>dolor</em> <em>sit</em></b> amet</p>" | |
| ); | |
| } | |
| public function testHtmlCommentsArePreserved() | |
| { | |
| $html = "Lorem <!-- <Hello> --> Ipsum"; | |
| $this->assertFilteredHTML($html, $html); | |
| } | |
| public function testInvalidMarkupIsIgnored() | |
| { | |
| $this->assertFilteredHTML( | |
| "hello world", | |
| "<nosuchtag>hello world</x></nosuchtag>" | |
| ); | |
| } | |
| public function testWorksWithCjkCharacters() | |
| { | |
| $zh = "格萊美紅毯大戰誰是贏家"; | |
| $jp = "日本語です。"; | |
| $ko = "빛나리의 타잔 주제가"; | |
| $this->assertFilteredHTML( | |
| "$zh$jp$ko", | |
| "<p>$zh</p><p>$jp</p><p>$ko</p>" | |
| ); | |
| } | |
| public function testIgnoresInvalidUtf8() | |
| { | |
| $this->filter_config->allowTag("p"); | |
| $this->assertFilteredHTML( | |
| "prefix <p> onclick=alert(42)>infix\n\nsuffix</p>", | |
| "prefix <p\xe6> onclick=alert(42)>infix\xe6\xff\n\nsuffix" | |
| ); | |
| } | |
| } |