Merge "Selenium: replace UserLoginPage with BlankPage where possible"
[lhc/web/wiklou.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::class )
86 ->disableOriginalConstructor()
87 ->getMock();
88 }
89
90 private function getMockUser() {
91 return $this->getMockBuilder( User::class )
92 ->disableOriginalConstructor()
93 ->getMock();
94 }
95
96 private function getMockParserOptions() {
97 return $this->getMockBuilder( ParserOptions::class )
98 ->disableOriginalConstructor()
99 ->getMock();
100 }
101
102 public static function provideDataAndParserText() {
103 return [
104 [
105 [],
106 '<table class="mw-json"><tbody><tr><td>' .
107 '<table class="mw-json"><tbody><tr><td class="mw-json-empty">Empty array</td></tr>'
108 . '</tbody></table></td></tr></tbody></table>'
109 ],
110 [
111 (object)[],
112 '<table class="mw-json"><tbody><tr><td class="mw-json-empty">Empty object</td></tr>' .
113 '</tbody></table>'
114 ],
115 [
116 (object)[ 'foo' ],
117 '<table class="mw-json"><tbody><tr><th>0</th><td class="mw-json-value">"foo"</td></tr>' .
118 '</tbody></table>'
119 ],
120 [
121 (object)[ 'foo', 'bar' ],
122 '<table class="mw-json"><tbody><tr><th>0</th><td class="mw-json-value">"foo"</td></tr>' .
123 '<tr><th>1</th><td class="mw-json-value">"bar"</td></tr></tbody></table>'
124 ],
125 [
126 (object)[ 'baz' => 'foo', 'bar' ],
127 '<table class="mw-json"><tbody><tr><th>baz</th><td class="mw-json-value">"foo"</td></tr>' .
128 '<tr><th>0</th><td class="mw-json-value">"bar"</td></tr></tbody></table>'
129 ],
130 [
131 (object)[ 'baz' => 1000, 'bar' ],
132 '<table class="mw-json"><tbody><tr><th>baz</th><td class="mw-json-value">1000</td></tr>' .
133 '<tr><th>0</th><td class="mw-json-value">"bar"</td></tr></tbody></table>'
134 ],
135 [
136 (object)[ '<script>alert("evil!")</script>' ],
137 '<table class="mw-json"><tbody><tr><th>0</th><td class="mw-json-value">"' .
138 '&lt;script>alert("evil!")&lt;/script>"' .
139 '</td></tr></tbody></table>',
140 ],
141 ];
142 }
143
144 /**
145 * @dataProvider provideDataAndParserText
146 */
147 public function testFillParserOutput( $data, $expected ) {
148 $obj = new JsonContent( FormatJson::encode( $data ) );
149 $parserOutput = $obj->getParserOutput( $this->getMockTitle(), null, null, true );
150 $this->assertInstanceOf( ParserOutput::class, $parserOutput );
151 $this->assertEquals( $expected, $parserOutput->getText() );
152 }
153 }