summaryrefslogtreecommitdiff
path: root/tests/phpunit/includes/HtmlFormatterTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/phpunit/includes/HtmlFormatterTest.php')
-rw-r--r--tests/phpunit/includes/HtmlFormatterTest.php127
1 files changed, 127 insertions, 0 deletions
diff --git a/tests/phpunit/includes/HtmlFormatterTest.php b/tests/phpunit/includes/HtmlFormatterTest.php
new file mode 100644
index 00000000..9dbfa452
--- /dev/null
+++ b/tests/phpunit/includes/HtmlFormatterTest.php
@@ -0,0 +1,127 @@
+<?php
+
+/**
+ * @group HtmlFormatter
+ */
+class HtmlFormatterTest extends MediaWikiTestCase {
+ /**
+ * @dataProvider getHtmlData
+ *
+ * @param string $input
+ * @param string $expectedText
+ * @param array $expectedRemoved
+ * @param callable|bool $callback
+ */
+ public function testTransform( $input, $expectedText,
+ $expectedRemoved = array(), $callback = false
+ ) {
+ $input = self::normalize( $input );
+ $formatter = new HtmlFormatter( HtmlFormatter::wrapHTML( $input ) );
+ if ( $callback ) {
+ $callback( $formatter );
+ }
+ $removedElements = $formatter->filterContent();
+ $html = $formatter->getText();
+ $removed = array();
+ foreach ( $removedElements as $removedElement ) {
+ $removed[] = self::normalize( $formatter->getText( $removedElement ) );
+ }
+ $expectedRemoved = array_map( 'self::normalize', $expectedRemoved );
+
+ $this->assertValidHtmlSnippet( $html );
+ $this->assertEquals( self::normalize( $expectedText ), self::normalize( $html ) );
+ $this->assertEquals( asort( $expectedRemoved ), asort( $removed ) );
+ }
+
+ private static function normalize( $s ) {
+ return str_replace( "\n", '',
+ str_replace( "\r", '', $s ) // "yay" to Windows!
+ );
+ }
+
+ public function getHtmlData() {
+ $removeImages = function ( HtmlFormatter $f ) {
+ $f->setRemoveMedia();
+ };
+ $removeTags = function ( HtmlFormatter $f ) {
+ $f->remove( array( 'table', '.foo', '#bar', 'div.baz' ) );
+ };
+ $flattenSomeStuff = function ( HtmlFormatter $f ) {
+ $f->flatten( array( 's', 'div' ) );
+ };
+ $flattenEverything = function ( HtmlFormatter $f ) {
+ $f->flattenAllTags();
+ };
+ return array(
+ // remove images if asked
+ array(
+ '<img src="/foo/bar.jpg" alt="Blah"/>',
+ '',
+ array( '<img src="/foo/bar.jpg" alt="Blah">' ),
+ $removeImages,
+ ),
+ // basic tag removal
+ array(
+ // @codingStandardsIgnoreStart Ignore long line warnings.
+ '<table><tr><td>foo</td></tr></table><div class="foo">foo</div><div class="foo quux">foo</div><span id="bar">bar</span>
+<strong class="foo" id="bar">foobar</strong><div class="notfoo">test</div><div class="baz"/>
+<span class="baz">baz</span>',
+ // @codingStandardsIgnoreEnd
+ '<div class="notfoo">test</div>
+<span class="baz">baz</span>',
+ array(
+ '<table><tr><td>foo</td></tr></table>',
+ '<div class="foo">foo</div>',
+ '<div class="foo quux">foo</div>',
+ '<span id="bar">bar</span>',
+ '<strong class="foo" id="bar">foobar</strong>',
+ '<div class="baz"/>',
+ ),
+ $removeTags,
+ ),
+ // don't flatten tags that start like chosen ones
+ array(
+ '<div><s>foo</s> <span>bar</span></div>',
+ 'foo <span>bar</span>',
+ array(),
+ $flattenSomeStuff,
+ ),
+ // total flattening
+ array(
+ '<div style="foo">bar<sup>2</sup></div>',
+ 'bar2',
+ array(),
+ $flattenEverything,
+ ),
+ // UTF-8 preservation and security
+ array(
+ '<span title="&quot; \' &amp;">&lt;Тест!&gt;</span> &amp;&lt;&#38;&#0038;&#x26;&#x026;',
+ '<span title="&quot; \' &amp;">&lt;Тест!&gt;</span> &amp;&lt;&amp;&amp;&amp;&amp;',
+ array(),
+ $removeTags, // Have some rules to trigger a DOM parse
+ ),
+ // https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
+ array(
+ 'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>'
+ . ' <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
+ 'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>'
+ . ' <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
+ ),
+ );
+ }
+
+ public function testQuickProcessing() {
+ $f = new MockHtmlFormatter( 'foo' );
+ $f->filterContent();
+ $this->assertFalse( $f->hasDoc, 'HtmlFormatter should not needlessly parse HTML' );
+ }
+}
+
+class MockHtmlFormatter extends HtmlFormatter {
+ public $hasDoc = false;
+
+ public function getDoc() {
+ $this->hasDoc = true;
+ return parent::getDoc();
+ }
+}