Merge "resourceloader: Use "\n" instead of ";" as separator for scripts"
[lhc/web/wiklou.git] / tests / phpunit / includes / resourceloader / ResourceLoaderTest.php
index c9d103d..1422adc 100644 (file)
@@ -165,6 +165,14 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                $this->assertSame( $expected, $rl->isFileModule( 'test' ) );
        }
 
+       /**
+        * @covers ResourceLoader::isFileModule
+        */
+       public function testIsFileModuleUnknown() {
+               $rl = TestingAccessWrapper::newFromObject( new EmptyResourceLoader() );
+               $this->assertSame( false, $rl->isFileModule( 'unknown' ) );
+       }
+
        /**
         * @covers ResourceLoader::isModuleRegistered
         */
@@ -199,7 +207,7 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
         * @covers ResourceLoader::getModule
         */
        public function testGetModuleFactory() {
-               $factory = function( array $info ) {
+               $factory = function ( array $info ) {
                        $this->assertArrayHasKey( 'kitten', $info );
                        return new ResourceLoaderTestModule( $info );
                };
@@ -588,6 +596,12 @@ mw.example();
                ] );
                $context = $this->getResourceLoaderContext( [], $rl );
 
+               $this->assertEquals(
+                       '',
+                       $rl->getCombinedVersion( $context, [] ),
+                       'empty list'
+               );
+
                $this->assertEquals(
                        ResourceLoader::makeHash( self::BLANK_VERSION ),
                        $rl->getCombinedVersion( $context, [ 'foo' ] ),
@@ -603,6 +617,86 @@ mw.example();
                );
        }
 
+       public static function provideMakeModuleResponseConcat() {
+               $testcases = [
+                       [
+                               'modules' => [
+                                       'foo' => 'foo()',
+                               ],
+                               'expected' => "foo()\n" . 'mw.loader.state( {
+    "foo": "ready"
+} );',
+                               'minified' => "foo()\n" . 'mw.loader.state({"foo":"ready"});',
+                               'message' => 'Script without semi-colon',
+                       ],
+                       [
+                               'modules' => [
+                                       'foo' => 'foo()',
+                                       'bar' => 'bar()',
+                               ],
+                               'expected' => "foo()\nbar()\n" . 'mw.loader.state( {
+    "foo": "ready",
+    "bar": "ready"
+} );',
+                               'minified' => "foo()\nbar()\n" . 'mw.loader.state({"foo":"ready","bar":"ready"});',
+                               'message' => 'Two scripts without semi-colon',
+                       ],
+                       [
+                               'modules' => [
+                                       'foo' => "foo()\n// bar();"
+                               ],
+                               'expected' => "foo()\n// bar();\n" . 'mw.loader.state( {
+    "foo": "ready"
+} );',
+                               'minified' => "foo()\n" . 'mw.loader.state({"foo":"ready"});',
+                               'message' => 'Script with semi-colon in comment (T162719)',
+                       ],
+               ];
+               $ret = [];
+               foreach ( $testcases as $i => $case ) {
+                       $ret["#$i"] = [
+                               $case['modules'],
+                               $case['expected'],
+                               true, // debug
+                               $case['message'],
+                       ];
+                       $ret["#$i (minified)"] = [
+                               $case['modules'],
+                               $case['minified'],
+                               false, // debug
+                               $case['message'],
+                       ];
+               }
+               return $ret;
+       }
+
+       /**
+        * Verify how multiple scripts and mw.loader.state() calls are concatenated.
+        *
+        * @dataProvider provideMakeModuleResponseConcat
+        * @covers ResourceLoader::makeModuleResponse
+        */
+       public function testMakeModuleResponseConcat( $scripts, $expected, $debug, $message = null ) {
+               $rl = new EmptyResourceLoader();
+               $modules = array_map( function ( $script ) {
+                       return self::getSimpleModuleMock( $script );
+               }, $scripts );
+               $rl->register( $modules );
+
+               $this->setMwGlobals( 'wgResourceLoaderDebug', $debug );
+               $context = $this->getResourceLoaderContext(
+                       [
+                               'modules' => implode( '|', array_keys( $modules ) ),
+                               'only' => 'scripts',
+                       ],
+                       $rl
+               );
+
+               $response = $rl->makeModuleResponse( $context, $modules );
+               $this->assertSame( [], $rl->getErrors(), 'Errors' );
+               $this->assertEquals( $expected, $response, $message ?: 'Response' );
+       }
+
        /**
         * Verify that when building module content in a load.php response,
         * an exception from one module will not break script output from
@@ -632,7 +726,7 @@ mw.example();
                $this->assertCount( 1, $errors );
                $this->assertRegExp( '/Ferry not found/', $errors[0] );
                $this->assertEquals(
-                       'foo();bar();mw.loader.state( {
+                       "foo();\nbar();\n" . 'mw.loader.state( {
     "ferry": "error",
     "foo": "ready",
     "bar": "ready"