summaryrefslogtreecommitdiff
path: root/www/wiki/tests/phpunit/includes/content/JsonContentTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/tests/phpunit/includes/content/JsonContentTest.php')
-rw-r--r--www/wiki/tests/phpunit/includes/content/JsonContentTest.php152
1 files changed, 152 insertions, 0 deletions
diff --git a/www/wiki/tests/phpunit/includes/content/JsonContentTest.php b/www/wiki/tests/phpunit/includes/content/JsonContentTest.php
new file mode 100644
index 00000000..7cddbad2
--- /dev/null
+++ b/www/wiki/tests/phpunit/includes/content/JsonContentTest.php
@@ -0,0 +1,152 @@
+<?php
+
+/**
+ * @author Addshore
+ * @covers JsonContent
+ */
+class JsonContentTest extends MediaWikiLangTestCase {
+
+ public static function provideValidConstruction() {
+ return [
+ [ 'foo', false, null ],
+ [ '[]', true, [] ],
+ [ '{}', true, (object)[] ],
+ [ '""', true, '' ],
+ [ '"0"', true, '0' ],
+ [ '"bar"', true, 'bar' ],
+ [ '0', true, '0' ],
+ [ '{ "0": "bar" }', true, (object)[ 'bar' ] ],
+ ];
+ }
+
+ /**
+ * @dataProvider provideValidConstruction
+ */
+ public function testIsValid( $text, $isValid, $expected ) {
+ $obj = new JsonContent( $text, CONTENT_MODEL_JSON );
+ $this->assertEquals( $isValid, $obj->isValid() );
+ $this->assertEquals( $expected, $obj->getData()->getValue() );
+ }
+
+ public static function provideDataToEncode() {
+ return [
+ [
+ // Round-trip empty array
+ '[]',
+ '[]',
+ ],
+ [
+ // Round-trip empty object
+ '{}',
+ '{}',
+ ],
+ [
+ // Round-trip empty array/object (nested)
+ '{ "foo": {}, "bar": [] }',
+ "{\n \"foo\": {},\n \"bar\": []\n}",
+ ],
+ [
+ '{ "foo": "bar" }',
+ "{\n \"foo\": \"bar\"\n}",
+ ],
+ [
+ '{ "foo": 1000 }',
+ "{\n \"foo\": 1000\n}",
+ ],
+ [
+ '{ "foo": 1000, "0": "bar" }',
+ "{\n \"foo\": 1000,\n \"0\": \"bar\"\n}",
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider provideDataToEncode
+ */
+ public function testBeautifyJson( $input, $beautified ) {
+ $obj = new JsonContent( $input );
+ $this->assertEquals( $beautified, $obj->beautifyJSON() );
+ }
+
+ /**
+ * @dataProvider provideDataToEncode
+ */
+ public function testPreSaveTransform( $input, $transformed ) {
+ $obj = new JsonContent( $input );
+ $newObj = $obj->preSaveTransform(
+ $this->getMockTitle(),
+ $this->getMockUser(),
+ $this->getMockParserOptions()
+ );
+ $this->assertTrue( $newObj->equals( new JsonContent( $transformed ) ) );
+ }
+
+ private function getMockTitle() {
+ return $this->getMockBuilder( Title::class )
+ ->disableOriginalConstructor()
+ ->getMock();
+ }
+
+ private function getMockUser() {
+ return $this->getMockBuilder( User::class )
+ ->disableOriginalConstructor()
+ ->getMock();
+ }
+ private function getMockParserOptions() {
+ return $this->getMockBuilder( ParserOptions::class )
+ ->disableOriginalConstructor()
+ ->getMock();
+ }
+
+ public static function provideDataAndParserText() {
+ return [
+ [
+ [],
+ '<table class="mw-json"><tbody><tr><td>' .
+ '<table class="mw-json"><tbody><tr><td class="mw-json-empty">Empty array</td></tr>'
+ . '</tbody></table></td></tr></tbody></table>'
+ ],
+ [
+ (object)[],
+ '<table class="mw-json"><tbody><tr><td class="mw-json-empty">Empty object</td></tr>' .
+ '</tbody></table>'
+ ],
+ [
+ (object)[ 'foo' ],
+ '<table class="mw-json"><tbody><tr><th>0</th><td class="value">"foo"</td></tr>' .
+ '</tbody></table>'
+ ],
+ [
+ (object)[ 'foo', 'bar' ],
+ '<table class="mw-json"><tbody><tr><th>0</th><td class="value">"foo"</td></tr>' .
+ '<tr><th>1</th><td class="value">"bar"</td></tr></tbody></table>'
+ ],
+ [
+ (object)[ 'baz' => 'foo', 'bar' ],
+ '<table class="mw-json"><tbody><tr><th>baz</th><td class="value">"foo"</td></tr>' .
+ '<tr><th>0</th><td class="value">"bar"</td></tr></tbody></table>'
+ ],
+ [
+ (object)[ 'baz' => 1000, 'bar' ],
+ '<table class="mw-json"><tbody><tr><th>baz</th><td class="value">1000</td></tr>' .
+ '<tr><th>0</th><td class="value">"bar"</td></tr></tbody></table>'
+ ],
+ [
+ (object)[ '<script>alert("evil!")</script>' ],
+ '<table class="mw-json"><tbody><tr><th>0</th><td class="value">"' .
+ '&lt;script>alert("evil!")&lt;/script>"' .
+ '</td></tr></tbody></table>',
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider provideDataAndParserText
+ */
+ public function testFillParserOutput( $data, $expected ) {
+ $obj = new JsonContent( FormatJson::encode( $data ) );
+ $parserOutput = $obj->getParserOutput( $this->getMockTitle(), null, null, true );
+ $this->assertInstanceOf( ParserOutput::class, $parserOutput );
+ $this->assertEquals( $expected, $parserOutput->getText() );
+ }
+}