]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / tests / phpunit / includes / resourceloader / ResourceLoaderModuleTest.php
1 <?php
2
3 class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
4
5         /**
6          * @covers ResourceLoaderModule::getVersionHash
7          */
8         public function testGetVersionHash() {
9                 $context = $this->getResourceLoaderContext();
10
11                 $baseParams = [
12                         'scripts' => [ 'foo.js', 'bar.js' ],
13                         'dependencies' => [ 'jquery', 'mediawiki' ],
14                         'messages' => [ 'hello', 'world' ],
15                 ];
16
17                 $module = new ResourceLoaderFileModule( $baseParams );
18                 $version = json_encode( $module->getVersionHash( $context ) );
19
20                 // Exactly the same
21                 $module = new ResourceLoaderFileModule( $baseParams );
22                 $this->assertEquals(
23                         $version,
24                         json_encode( $module->getVersionHash( $context ) ),
25                         'Instance is insignificant'
26                 );
27
28                 // Re-order dependencies
29                 $module = new ResourceLoaderFileModule( [
30                         'dependencies' => [ 'mediawiki', 'jquery' ],
31                 ] + $baseParams );
32                 $this->assertEquals(
33                         $version,
34                         json_encode( $module->getVersionHash( $context ) ),
35                         'Order of dependencies is insignificant'
36                 );
37
38                 // Re-order messages
39                 $module = new ResourceLoaderFileModule( [
40                         'messages' => [ 'world', 'hello' ],
41                 ] + $baseParams );
42                 $this->assertEquals(
43                         $version,
44                         json_encode( $module->getVersionHash( $context ) ),
45                         'Order of messages is insignificant'
46                 );
47
48                 // Re-order scripts
49                 $module = new ResourceLoaderFileModule( [
50                         'scripts' => [ 'bar.js', 'foo.js' ],
51                 ] + $baseParams );
52                 $this->assertNotEquals(
53                         $version,
54                         json_encode( $module->getVersionHash( $context ) ),
55                         'Order of scripts is significant'
56                 );
57
58                 // Subclass
59                 $module = new ResourceLoaderFileModuleTestModule( $baseParams );
60                 $this->assertNotEquals(
61                         $version,
62                         json_encode( $module->getVersionHash( $context ) ),
63                         'Class is significant'
64                 );
65         }
66
67         /**
68          * @covers ResourceLoaderModule::validateScriptFile
69          */
70         public function testValidateScriptFile() {
71                 $this->setMwGlobals( 'wgResourceLoaderValidateJS', true );
72
73                 $context = $this->getResourceLoaderContext();
74
75                 $module = new ResourceLoaderTestModule( [
76                         'script' => "var a = 'this is';\n {\ninvalid"
77                 ] );
78                 $this->assertEquals(
79                         'mw.log.error(' .
80                                 '"JavaScript parse error: Parse error: Unexpected token; ' .
81                                 'token } expected in file \'input\' on line 3"' .
82                         ');',
83                         $module->getScript( $context ),
84                         'Replace invalid syntax with error logging'
85                 );
86
87                 $module = new ResourceLoaderTestModule( [
88                         'script' => "\n'valid';"
89                 ] );
90                 $this->assertEquals(
91                         "\n'valid';",
92                         $module->getScript( $context ),
93                         'Leave valid scripts as-is'
94                 );
95         }
96
97         public static function provideBuildContentScripts() {
98                 return [
99                         [
100                                 "mw.foo()",
101                                 "mw.foo()\n",
102                         ],
103                         [
104                                 "mw.foo();",
105                                 "mw.foo();\n",
106                         ],
107                         [
108                                 "mw.foo();\n",
109                                 "mw.foo();\n",
110                         ],
111                         [
112                                 "mw.foo()\n",
113                                 "mw.foo()\n",
114                         ],
115                         [
116                                 "mw.foo()\n// mw.bar();",
117                                 "mw.foo()\n// mw.bar();\n",
118                         ],
119                         [
120                                 "mw.foo()\n// mw.bar()",
121                                 "mw.foo()\n// mw.bar()\n",
122                         ],
123                         [
124                                 "mw.foo()// mw.bar();",
125                                 "mw.foo()// mw.bar();\n",
126                         ],
127                 ];
128         }
129
130         /**
131          * @dataProvider provideBuildContentScripts
132          * @covers ResourceLoaderModule::buildContent
133          */
134         public function testBuildContentScripts( $raw, $build, $message = null ) {
135                 $context = $this->getResourceLoaderContext();
136                 $module = new ResourceLoaderTestModule( [
137                         'script' => $raw
138                 ] );
139                 $this->assertEquals( $raw, $module->getScript( $context ), 'Raw script' );
140                 $this->assertEquals(
141                         [ 'scripts' => $build ],
142                         $module->getModuleContent( $context ),
143                         $message
144                 );
145         }
146
147         /**
148          * @covers ResourceLoaderModule::getRelativePaths
149          * @covers ResourceLoaderModule::expandRelativePaths
150          */
151         public function testPlaceholderize() {
152                 $getRelativePaths = new ReflectionMethod( 'ResourceLoaderModule', 'getRelativePaths' );
153                 $getRelativePaths->setAccessible( true );
154                 $expandRelativePaths = new ReflectionMethod( 'ResourceLoaderModule', 'expandRelativePaths' );
155                 $expandRelativePaths->setAccessible( true );
156
157                 $this->setMwGlobals( [
158                         'IP' => '/srv/example/mediawiki/core',
159                 ] );
160                 $raw = [
161                                 '/srv/example/mediawiki/core/resources/foo.js',
162                                 '/srv/example/mediawiki/core/extensions/Example/modules/bar.js',
163                                 '/srv/example/mediawiki/skins/Example/baz.css',
164                                 '/srv/example/mediawiki/skins/Example/images/quux.png',
165                 ];
166                 $canonical = [
167                                 'resources/foo.js',
168                                 'extensions/Example/modules/bar.js',
169                                 '../skins/Example/baz.css',
170                                 '../skins/Example/images/quux.png',
171                 ];
172                 $this->assertEquals(
173                         $canonical,
174                         $getRelativePaths->invoke( null, $raw ),
175                         'Insert placeholders'
176                 );
177                 $this->assertEquals(
178                         $raw,
179                         $expandRelativePaths->invoke( null, $canonical ),
180                         'Substitute placeholders'
181                 );
182         }
183
184         /**
185          * @covers ResourceLoaderModule::getHeaders
186          * @covers ResourceLoaderModule::getPreloadLinks
187          */
188         public function testGetHeaders() {
189                 $context = $this->getResourceLoaderContext();
190
191                 $module = new ResourceLoaderTestModule();
192                 $this->assertSame( [], $module->getHeaders( $context ), 'Default' );
193
194                 $module = $this->getMockBuilder( ResourceLoaderTestModule::class )
195                         ->setMethods( [ 'getPreloadLinks' ] )->getMock();
196                 $module->method( 'getPreloadLinks' )->willReturn( [
197                          'https://example.org/script.js' => [ 'as' => 'script' ],
198                 ] );
199                 $this->assertSame(
200                         [
201                                 'Link: <https://example.org/script.js>;rel=preload;as=script'
202                         ],
203                         $module->getHeaders( $context ),
204                         'Preload one resource'
205                 );
206
207                 $module = $this->getMockBuilder( ResourceLoaderTestModule::class )
208                         ->setMethods( [ 'getPreloadLinks' ] )->getMock();
209                 $module->method( 'getPreloadLinks' )->willReturn( [
210                          'https://example.org/script.js' => [ 'as' => 'script' ],
211                          '/example.png' => [ 'as' => 'image' ],
212                 ] );
213                 $this->assertSame(
214                         [
215                                 'Link: <https://example.org/script.js>;rel=preload;as=script,' .
216                                         '</example.png>;rel=preload;as=image'
217                         ],
218                         $module->getHeaders( $context ),
219                         'Preload two resources'
220                 );
221         }
222 }