]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - tests/phpunit/includes/content/JsonContentTest.php
MediaWiki 1.30.2-scripts2
[autoinstalls/mediawiki.git] / tests / phpunit / includes / content / JsonContentTest.php
1 <?php
2
3 /**
4  * @author Addshore
5  * @covers JsonContent
6  */
7 class JsonContentTest extends MediaWikiLangTestCase {
8
9         public static function provideValidConstruction() {
10                 return [
11                         [ 'foo', false, null ],
12                         [ '[]', true, [] ],
13                         [ '{}', true, (object)[] ],
14                         [ '""', true, '' ],
15                         [ '"0"', true, '0' ],
16                         [ '"bar"', true, 'bar' ],
17                         [ '0', true, '0' ],
18                         [ '{ "0": "bar" }', true, (object)[ 'bar' ] ],
19                 ];
20         }
21
22         /**
23          * @dataProvider provideValidConstruction
24          */
25         public function testIsValid( $text, $isValid, $expected ) {
26                 $obj = new JsonContent( $text, CONTENT_MODEL_JSON );
27                 $this->assertEquals( $isValid, $obj->isValid() );
28                 $this->assertEquals( $expected, $obj->getData()->getValue() );
29         }
30
31         public static function provideDataToEncode() {
32                 return [
33                         [
34                                 // Round-trip empty array
35                                 '[]',
36                                 '[]',
37                         ],
38                         [
39                                 // Round-trip empty object
40                                 '{}',
41                                 '{}',
42                         ],
43                         [
44                                 // Round-trip empty array/object (nested)
45                                 '{ "foo": {}, "bar": [] }',
46                                 "{\n    \"foo\": {},\n    \"bar\": []\n}",
47                         ],
48                         [
49                                 '{ "foo": "bar" }',
50                                 "{\n    \"foo\": \"bar\"\n}",
51                         ],
52                         [
53                                 '{ "foo": 1000 }',
54                                 "{\n    \"foo\": 1000\n}",
55                         ],
56                         [
57                                 '{ "foo": 1000, "0": "bar" }',
58                                 "{\n    \"foo\": 1000,\n    \"0\": \"bar\"\n}",
59                         ],
60                 ];
61         }
62
63         /**
64          * @dataProvider provideDataToEncode
65          */
66         public function testBeautifyJson( $input, $beautified ) {
67                 $obj = new JsonContent( $input );
68                 $this->assertEquals( $beautified, $obj->beautifyJSON() );
69         }
70
71         /**
72          * @dataProvider provideDataToEncode
73          */
74         public function testPreSaveTransform( $input, $transformed ) {
75                 $obj = new JsonContent( $input );
76                 $newObj = $obj->preSaveTransform(
77                         $this->getMockTitle(),
78                         $this->getMockUser(),
79                         $this->getMockParserOptions()
80                 );
81                 $this->assertTrue( $newObj->equals( new JsonContent( $transformed ) ) );
82         }
83
84         private function getMockTitle() {
85                 return $this->getMockBuilder( 'Title' )
86                         ->disableOriginalConstructor()
87                         ->getMock();
88         }
89
90         private function getMockUser() {
91                 return $this->getMockBuilder( 'User' )
92                         ->disableOriginalConstructor()
93                         ->getMock();
94         }
95         private function getMockParserOptions() {
96                 return $this->getMockBuilder( 'ParserOptions' )
97                         ->disableOriginalConstructor()
98                         ->getMock();
99         }
100
101         public static function provideDataAndParserText() {
102                 return [
103                         [
104                                 [],
105                                 '<table class="mw-json"><tbody><tr><td>' .
106                                 '<table class="mw-json"><tbody><tr><td class="mw-json-empty">Empty array</td></tr>'
107                                 . '</tbody></table></td></tr></tbody></table>'
108                         ],
109                         [
110                                 (object)[],
111                                 '<table class="mw-json"><tbody><tr><td class="mw-json-empty">Empty object</td></tr>' .
112                                 '</tbody></table>'
113                         ],
114                         [
115                                 (object)[ 'foo' ],
116                                 '<table class="mw-json"><tbody><tr><th>0</th><td class="value">"foo"</td></tr>' .
117                                 '</tbody></table>'
118                         ],
119                         [
120                                 (object)[ 'foo', 'bar' ],
121                                 '<table class="mw-json"><tbody><tr><th>0</th><td class="value">"foo"</td></tr>' .
122                                 '<tr><th>1</th><td class="value">"bar"</td></tr></tbody></table>'
123                         ],
124                         [
125                                 (object)[ 'baz' => 'foo', 'bar' ],
126                                 '<table class="mw-json"><tbody><tr><th>baz</th><td class="value">"foo"</td></tr>' .
127                                 '<tr><th>0</th><td class="value">"bar"</td></tr></tbody></table>'
128                         ],
129                         [
130                                 (object)[ 'baz' => 1000, 'bar' ],
131                                 '<table class="mw-json"><tbody><tr><th>baz</th><td class="value">1000</td></tr>' .
132                                 '<tr><th>0</th><td class="value">"bar"</td></tr></tbody></table>'
133                         ],
134                         [
135                                 (object)[ '<script>alert("evil!")</script>' ],
136                                 '<table class="mw-json"><tbody><tr><th>0</th><td class="value">"' .
137                                 '&lt;script>alert("evil!")&lt;/script>"' .
138                                 '</td></tr></tbody></table>',
139                         ],
140                 ];
141         }
142
143         /**
144          * @dataProvider provideDataAndParserText
145          */
146         public function testFillParserOutput( $data, $expected ) {
147                 $obj = new JsonContent( FormatJson::encode( $data ) );
148                 $parserOutput = $obj->getParserOutput( $this->getMockTitle(), null, null, true );
149                 $this->assertInstanceOf( 'ParserOutput', $parserOutput );
150                 $this->assertEquals( $expected, $parserOutput->getText() );
151         }
152 }