resourceloader: Add more concat test cases for makeModuleResponse
authorTimo Tijhof <krinklemail@gmail.com>
Wed, 28 Jun 2017 02:10:03 +0000 (19:10 -0700)
committerTimo Tijhof <krinklemail@gmail.com>
Wed, 28 Jun 2017 02:10:03 +0000 (19:10 -0700)
Bug: T162719
Change-Id: Ic8d4a022dbe8c7998924fb20d727936e68cb11d2

tests/phpunit/includes/resourceloader/ResourceLoaderTest.php

index f00253b..b7b2473 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
         */
@@ -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,88 @@ mw.example();
                );
        }
 
+       public static function provideMakeModuleResponseConcat() {
+               $testcases = [
+                       [
+                               'modules' => [
+                                       'foo' => 'foo()',
+                               ],
+                               'expected' => "foo();\n" . 'mw.loader.state( {
+    "foo": "ready"
+} );',
+                               'minified' => "foo();" . '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();bar();" . 'mw.loader.state({"foo":"ready","bar":"ready"});',
+                               'message' => 'Two scripts without semi-colon',
+                       ],
+                       [
+                               'modules' => [
+                                       'foo' => "foo()\n// bar();"
+                               ],
+                               // FIXME: Invalid code (T162719)
+                               'expected' => "foo()\n// bar();" . 'mw.loader.state( {
+    "foo": "ready"
+} );',
+                               // FIXME: Invalid code (T162719)
+                               'minified' => "foo()" . 'mw.loader.state({"foo":"ready"});',
+                               'message' => 'Script with semi-colon in comment',
+                       ],
+               ];
+               $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->assertCount( 0, $rl->getErrors(), 'Error count' );
+               $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