diff options
author | Tim Starling <tstarling@wikimedia.org> | 2022-05-06 19:09:56 +1000 |
---|---|---|
committer | Krinkle <krinkle@fastmail.com> | 2022-05-24 15:41:46 +0000 |
commit | 3e2653f83bc096889d8b69d1e01a52d7de42b247 (patch) | |
tree | 2b87e1d578790776fa139b89f561695666bf1591 /tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php | |
parent | 62c75f78f4e5b19a727571a6633b7091b84fc651 (diff) | |
download | mediawikicore-3e2653f83bc096889d8b69d1e01a52d7de42b247.tar.gz mediawikicore-3e2653f83bc096889d8b69d1e01a52d7de42b247.zip |
ResourceLoader namespace (attempt 2)
Move ResourceLoader classes to their own namespace. Strip the
"ResourceLoader" prefix from all except ResourceLoader itself.
Move the tests by analogy.
I used a namespace alias "RL" in some callers since RL\Module is less
ambiguous at the call site than just "Module".
I did not address DependencyStore which continues to have a non-standard
location and namespace.
Revert of a241d83e0a6dabedf.
Bug: T308718
Change-Id: Id08a220e1d6085e2b33f3f6c9d0e3935a4204659
Diffstat (limited to 'tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php')
-rw-r--r-- | tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php | 966 |
1 files changed, 0 insertions, 966 deletions
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php deleted file mode 100644 index 6aa1a8d31595..000000000000 --- a/tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php +++ /dev/null @@ -1,966 +0,0 @@ -<?php - -use Psr\Container\ContainerInterface; -use Wikimedia\ObjectFactory\ObjectFactory; - -/** - * @group ResourceLoader - */ -class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase { - - protected function setUp(): void { - parent::setUp(); - - $skinFactory = new SkinFactory( - new ObjectFactory( $this->createMock( ContainerInterface::class ) ), [] - ); - // The empty spec shouldn't matter since this test should never call it - $skinFactory->register( - 'fakeskin', - 'FakeSkin', - [] - ); - $this->setService( 'SkinFactory', $skinFactory ); - - // This test is not expected to query any database - MediaWiki\MediaWikiServices::disableStorageBackend(); - } - - private static function getModules() { - $base = [ - 'localBasePath' => __DIR__, - ]; - - return [ - 'noTemplateModule' => [], - - 'deprecatedModule' => $base + [ - 'deprecated' => true, - ], - 'deprecatedTomorrow' => $base + [ - 'deprecated' => 'Will be removed tomorrow.' - ], - - 'htmlTemplateModule' => $base + [ - 'templates' => [ - 'templates/template.html', - 'templates/template2.html', - ] - ], - - 'htmlTemplateUnknown' => $base + [ - 'templates' => [ - 'templates/notfound.html', - ] - ], - - 'aliasedHtmlTemplateModule' => $base + [ - 'templates' => [ - 'foo.html' => 'templates/template.html', - 'bar.html' => 'templates/template2.html', - ] - ], - - 'templateModuleHandlebars' => $base + [ - 'templates' => [ - 'templates/template_awesome.handlebars', - ], - ], - - 'aliasFooFromBar' => $base + [ - 'templates' => [ - 'foo.foo' => 'templates/template.bar', - ], - ], - ]; - } - - public static function providerTemplateDependencies() { - $modules = self::getModules(); - - return [ - [ - $modules['noTemplateModule'], - [], - ], - [ - $modules['htmlTemplateModule'], - [ - 'mediawiki.template', - ], - ], - [ - $modules['templateModuleHandlebars'], - [ - 'mediawiki.template', - 'mediawiki.template.handlebars', - ], - ], - [ - $modules['aliasFooFromBar'], - [ - 'mediawiki.template', - 'mediawiki.template.foo', - ], - ], - ]; - } - - /** - * @dataProvider providerTemplateDependencies - * @covers ResourceLoaderFileModule::__construct - * @covers ResourceLoaderFileModule::getDependencies - */ - public function testTemplateDependencies( $module, $expected ) { - $rl = new ResourceLoaderFileModule( $module ); - $rl->setName( 'testing' ); - $this->assertEquals( $expected, $rl->getDependencies() ); - } - - public static function providerDeprecatedModules() { - return [ - [ - 'deprecatedModule', - 'mw.log.warn("This page is using the deprecated ResourceLoader module \"deprecatedModule\".");', - ], - [ - 'deprecatedTomorrow', - 'mw.log.warn(' . - '"This page is using the deprecated ResourceLoader module \"deprecatedTomorrow\".\\n' . - "Will be removed tomorrow." . - '");' - ] - ]; - } - - /** - * @dataProvider providerDeprecatedModules - * @covers ResourceLoaderFileModule::getScript - */ - public function testDeprecatedModules( $name, $expected ) { - $modules = self::getModules(); - $module = new ResourceLoaderFileModule( $modules[$name] ); - $module->setName( $name ); - $ctx = $this->getResourceLoaderContext(); - $this->assertEquals( $expected, $module->getScript( $ctx ) ); - } - - /** - * @covers ResourceLoaderFileModule::getScript - * @covers ResourceLoaderFileModule::getScriptFiles - * @covers ResourceLoaderFileModule::readScriptFiles - */ - public function testGetScript() { - $module = new ResourceLoaderFileModule( [ - 'localBasePath' => __DIR__ . '/../../data/resourceloader', - 'scripts' => [ 'script-nosemi.js', 'script-comment.js' ], - ] ); - $module->setName( 'testing' ); - $ctx = $this->getResourceLoaderContext(); - $this->assertEquals( - "/* eslint-disable */\nmw.foo()\n" . - "/* eslint-disable */\nmw.foo()\n// mw.bar();\n", - $module->getScript( $ctx ), - 'scripts with newline at the end are concatenated without a newline' - ); - - $module = new ResourceLoaderFileModule( [ - 'localBasePath' => __DIR__ . '/../../data/resourceloader', - 'scripts' => [ 'script-nosemi-nonl.js', 'script-comment-nonl.js' ], - ] ); - $module->setName( 'testing' ); - $ctx = $this->getResourceLoaderContext(); - $this->assertEquals( - "/* eslint-disable */\nmw.foo()" . - "\n" . - "/* eslint-disable */\nmw.foo()\n// mw.bar();" . - "\n", - $module->getScript( $ctx ), - 'scripts without newline at the end are concatenated with a newline' - ); - } - - /** - * @covers ResourceLoaderFileModule - * @covers ResourceLoaderModule - * @covers ResourceLoader::createLoaderURL - * @covers ResourceLoader::expandUrl - */ - public function testGetURLsForDebug() { - $ctx = $this->getResourceLoaderContext(); - $module = new ResourceLoaderFileModule( [ - 'localBasePath' => __DIR__ . '/../../data/resourceloader', - 'remoteBasePath' => '/w/something', - 'styles' => [ 'simple.css' ], - 'scripts' => [ 'script-comment.js' ], - ] ); - $module->setName( 'testing' ); - $module->setConfig( $ctx->getResourceLoader()->getConfig() ); - - $this->assertEquals( - [ - 'https://example.org/w/something/script-comment.js' - ], - $module->getScriptURLsForDebug( $ctx ), - 'script urls' - ); - $this->assertEquals( - [ 'all' => [ - '/w/something/simple.css' - ] ], - $module->getStyleURLsForDebug( $ctx ), - 'style urls' - ); - } - - /** - * @covers ResourceLoaderFileModule - */ - public function testGetAllSkinStyleFiles() { - $baseParams = [ - 'scripts' => [ - 'foo.js', - 'bar.js', - ], - 'styles' => [ - 'foo.css', - 'bar.css' => [ 'media' => 'print' ], - 'screen.less' => [ 'media' => 'screen' ], - 'screen-query.css' => [ 'media' => 'screen and (min-width: 400px)' ], - ], - 'skinStyles' => [ - 'default' => 'quux-fallback.less', - 'fakeskin' => [ - 'baz-vector.css', - 'quux-vector.less', - ], - ], - 'messages' => [ - 'hello', - 'world', - ], - ]; - - $module = new ResourceLoaderFileModule( $baseParams ); - $module->setName( 'testing' ); - - $this->assertEquals( - [ - 'foo.css', - 'baz-vector.css', - 'quux-vector.less', - 'quux-fallback.less', - 'bar.css', - 'screen.less', - 'screen-query.css', - ], - array_map( 'basename', $module->getAllStyleFiles() ) - ); - } - - /** - * Strip @noflip annotations from CSS code. - * @param string $css - * @return string - */ - private static function stripNoflip( $css ) { - return str_replace( '/*@noflip*/ ', '', $css ); - } - - /** - * Confirm that 'ResourceModuleSkinStyles' skin attributes get injected - * into the module, and have their file contents read correctly from their - * own (out-of-module) directories. - * - * @covers ResourceLoader - * @covers ResourceLoaderFileModule - */ - public function testInjectSkinStyles() { - $moduleDir = __DIR__ . '/../../data/resourceloader'; - $skinDir = __DIR__ . '/../../data/resourceloader/myskin'; - $rl = new ResourceLoader( new HashConfig( self::getSettings() ) ); - $rl->setModuleSkinStyles( [ - 'fakeskin' => [ - 'localBasePath' => $skinDir, - 'testing' => [ - 'override.css', - ], - ], - ] ); - $rl->register( 'testing', [ - 'localBasePath' => $moduleDir, - 'styles' => [ 'simple.css' ], - ] ); - $ctx = $this->getResourceLoaderContext( [ 'skin' => 'fakeskin' ], $rl ); - - $module = $rl->getModule( 'testing' ); - $this->assertInstanceOf( ResourceLoaderFileModule::class, $module ); - $this->assertEquals( - [ 'all' => ".example { color: blue; }\n\n.override { line-height: 2; }\n" ], - $module->getStyles( $ctx ) - ); - } - - /** - * What happens when you mix @embed and @noflip? - * This really is an integration test, but oh well. - * - * @covers ResourceLoaderFileModule::getStyles - * @covers ResourceLoaderFileModule::getStyleFiles - * @covers ResourceLoaderFileModule::readStyleFiles - * @covers ResourceLoaderFileModule::readStyleFile - */ - public function testMixedCssAnnotations() { - $basePath = __DIR__ . '/../../data/css'; - $testModule = new ResourceLoaderFileTestModule( [ - 'localBasePath' => $basePath, - 'styles' => [ 'test.css' ], - ] ); - $testModule->setName( 'testing' ); - $expectedModule = new ResourceLoaderFileTestModule( [ - 'localBasePath' => $basePath, - 'styles' => [ 'expected.css' ], - ] ); - $expectedModule->setName( 'testing' ); - - $contextLtr = $this->getResourceLoaderContext( [ - 'lang' => 'en', - 'dir' => 'ltr', - ] ); - $contextRtl = $this->getResourceLoaderContext( [ - 'lang' => 'he', - 'dir' => 'rtl', - ] ); - - // Since we want to compare the effect of @noflip+@embed against the effect of just @embed, and - // the @noflip annotations are always preserved, we need to strip them first. - $this->assertEquals( - $expectedModule->getStyles( $contextLtr ), - self::stripNoflip( $testModule->getStyles( $contextLtr ) ), - "/*@noflip*/ with /*@embed*/ gives correct results in LTR mode" - ); - $this->assertEquals( - $expectedModule->getStyles( $contextLtr ), - self::stripNoflip( $testModule->getStyles( $contextRtl ) ), - "/*@noflip*/ with /*@embed*/ gives correct results in RTL mode" - ); - } - - /** - * @covers ResourceLoaderFileModule - */ - public function testCssFlipping() { - $plain = new ResourceLoaderFileTestModule( [ - 'localBasePath' => __DIR__ . '/../../data/resourceloader', - 'styles' => [ 'direction.css' ], - ] ); - $plain->setName( 'test' ); - - $context = $this->getResourceLoaderContext( [ 'lang' => 'en', 'dir' => 'ltr' ] ); - $this->assertEquals( - [ 'all' => ".example { text-align: left; }\n" ], - $plain->getStyles( $context ), - 'Unchanged styles in LTR mode' - ); - $context = $this->getResourceLoaderContext( [ 'lang' => 'he', 'dir' => 'rtl' ] ); - $this->assertEquals( - [ 'all' => ".example { text-align: right; }\n" ], - $plain->getStyles( $context ), - 'Flipped styles in RTL mode' - ); - - $noflip = new ResourceLoaderFileTestModule( [ - 'localBasePath' => __DIR__ . '/../../data/resourceloader', - 'styles' => [ 'direction.css' ], - 'noflip' => true, - ] ); - $noflip->setName( 'test' ); - $this->assertEquals( - [ 'all' => ".example { text-align: right; }\n" ], - $plain->getStyles( $context ), - 'Unchanged styles in RTL mode with noflip at module level' - ); - } - - /** - * Test reading files from elsewhere than localBasePath using ResourceLoaderFilePath. - * - * The use of ResourceLoaderFilePath objects resembles the way that ResourceLoader::getModule() - * injects additional files when 'ResourceModuleSkinStyles' or 'OOUIThemePaths' skin attributes - * apply to a given module. - * - * @covers ResourceLoaderFilePath::getLocalBasePath - * @covers ResourceLoaderFilePath::getRemoteBasePath - */ - public function testResourceLoaderFilePath() { - $basePath = __DIR__ . '/../../data/blahblah'; - $filePath = __DIR__ . '/../../data/rlfilepath'; - $testModule = new ResourceLoaderFileModule( [ - 'localBasePath' => $basePath, - 'remoteBasePath' => 'blahblah', - 'styles' => new ResourceLoaderFilePath( 'style.css', $filePath, 'rlfilepath' ), - 'skinStyles' => [ - 'vector' => new ResourceLoaderFilePath( 'skinStyle.css', $filePath, 'rlfilepath' ), - ], - 'scripts' => new ResourceLoaderFilePath( 'script.js', $filePath, 'rlfilepath' ), - 'templates' => new ResourceLoaderFilePath( 'template.html', $filePath, 'rlfilepath' ), - ] ); - $expectedModule = new ResourceLoaderFileModule( [ - 'localBasePath' => $filePath, - 'remoteBasePath' => 'rlfilepath', - 'styles' => 'style.css', - 'skinStyles' => [ - 'vector' => 'skinStyle.css', - ], - 'scripts' => 'script.js', - 'templates' => 'template.html', - ] ); - - $context = $this->getResourceLoaderContext(); - $this->assertEquals( - $expectedModule->getModuleContent( $context ), - $testModule->getModuleContent( $context ), - "Using ResourceLoaderFilePath works correctly" - ); - } - - public static function providerGetTemplates() { - $modules = self::getModules(); - - return [ - [ - $modules['noTemplateModule'], - [], - ], - [ - $modules['templateModuleHandlebars'], - [ - 'templates/template_awesome.handlebars' => "wow\n", - ], - ], - [ - $modules['htmlTemplateModule'], - [ - 'templates/template.html' => "<strong>hello</strong>\n", - 'templates/template2.html' => "<div>goodbye</div>\n", - ], - ], - [ - $modules['aliasedHtmlTemplateModule'], - [ - 'foo.html' => "<strong>hello</strong>\n", - 'bar.html' => "<div>goodbye</div>\n", - ], - ], - [ - $modules['htmlTemplateUnknown'], - false, - ], - ]; - } - - /** - * @dataProvider providerGetTemplates - * @covers ResourceLoaderFileModule::getTemplates - */ - public function testGetTemplates( $module, $expected ) { - $rl = new ResourceLoaderFileModule( $module ); - $rl->setName( 'testing' ); - - if ( $expected === false ) { - $this->expectException( RuntimeException::class ); - $rl->getTemplates(); - } else { - $this->assertEquals( $expected, $rl->getTemplates() ); - } - } - - /** - * @covers ResourceLoaderFileModule::stripBom - */ - public function testBomConcatenation() { - $basePath = __DIR__ . '/../../data/css'; - $testModule = new ResourceLoaderFileTestModule( [ - 'localBasePath' => $basePath, - 'styles' => [ 'bom.css' ], - ] ); - $testModule->setName( 'testing' ); - $this->assertEquals( - "\xef\xbb\xbf.efbbbf", - substr( file_get_contents( "$basePath/bom.css" ), 0, 10 ), - 'File has leading BOM' - ); - - $context = $this->getResourceLoaderContext(); - $this->assertEquals( - [ 'all' => ".efbbbf_bom_char_at_start_of_file {}\n" ], - $testModule->getStyles( $context ), - 'Leading BOM removed when concatenating files' - ); - } - - /** - * @covers ResourceLoaderFileModule - */ - public function testLessFileCompilation() { - $context = $this->getResourceLoaderContext(); - $basePath = __DIR__ . '/../../data/less/module'; - $module = new ResourceLoaderFileTestModule( [ - 'localBasePath' => $basePath, - 'styles' => [ 'styles.less' ], - 'lessVars' => [ 'foo' => '2px', 'Foo' => '#eeeeee' ] - ] ); - $module->setName( 'test.less' ); - $styles = $module->getStyles( $context ); - $this->assertStringEqualsFile( $basePath . '/styles.css', $styles['all'] ); - } - - public function provideGetVersionHash() { - $a = []; - $b = [ - 'lessVars' => [ 'key' => 'value' ], - ]; - yield 'with and without Less variables' => [ $a, $b, false ]; - - $a = [ - 'lessVars' => [ 'key' => 'value1' ], - ]; - $b = [ - 'lessVars' => [ 'key' => 'value2' ], - ]; - yield 'different Less variables' => [ $a, $b, false ]; - - $x = [ - 'lessVars' => [ 'key' => 'value' ], - ]; - yield 'identical Less variables' => [ $x, $x, true ]; - - $a = [ - 'packageFiles' => [ [ 'name' => 'data.json', 'callback' => static function () { - return [ 'aaa' ]; - } ] ] - ]; - $b = [ - 'packageFiles' => [ [ 'name' => 'data.json', 'callback' => static function () { - return [ 'bbb' ]; - } ] ] - ]; - yield 'packageFiles with different callback' => [ $a, $b, false ]; - - $a = [ - 'packageFiles' => [ [ 'name' => 'aaa.json', 'callback' => static function () { - return [ 'x' ]; - } ] ] - ]; - $b = [ - 'packageFiles' => [ [ 'name' => 'bbb.json', 'callback' => static function () { - return [ 'x' ]; - } ] ] - ]; - yield 'packageFiles with different file name and a callback' => [ $a, $b, false ]; - - $a = [ - 'packageFiles' => [ [ 'name' => 'data.json', 'versionCallback' => static function () { - return [ 'A-version' ]; - }, 'callback' => static function () { - throw new Exception( 'Unexpected computation' ); - } ] ] - ]; - $b = [ - 'packageFiles' => [ [ 'name' => 'data.json', 'versionCallback' => static function () { - return [ 'B-version' ]; - }, 'callback' => static function () { - throw new Exception( 'Unexpected computation' ); - } ] ] - ]; - yield 'packageFiles with different versionCallback' => [ $a, $b, false ]; - - $a = [ - 'packageFiles' => [ [ 'name' => 'aaa.json', - 'versionCallback' => static function () { - return [ 'X-version' ]; - }, - 'callback' => static function () { - throw new Exception( 'Unexpected computation' ); - } - ] ] - ]; - $b = [ - 'packageFiles' => [ [ 'name' => 'bbb.json', - 'versionCallback' => static function () { - return [ 'X-version' ]; - }, - 'callback' => static function () { - throw new Exception( 'Unexpected computation' ); - } - ] ] - ]; - yield 'packageFiles with different file name and a versionCallback' => [ $a, $b, false ]; - } - - /** - * @dataProvider provideGetVersionHash - * @covers ResourceLoaderFileModule::getDefinitionSummary - * @covers ResourceLoaderFileModule::getFileHashes - */ - public function testGetVersionHash( $a, $b, $isEqual ) { - $context = $this->getResourceLoaderContext( [ 'debug' => 'false' ] ); - - $moduleA = new ResourceLoaderFileTestModule( $a ); - $moduleA->setConfig( $context->getResourceLoader()->getConfig() ); - $versionA = $moduleA->getVersionHash( $context ); - $moduleB = new ResourceLoaderFileTestModule( $b ); - $moduleB->setConfig( $context->getResourceLoader()->getConfig() ); - $versionB = $moduleB->getVersionHash( $context ); - - $this->assertSame( - $isEqual, - ( $versionA === $versionB ), - 'Whether versions hashes are equal' - ); - } - - public function provideGetScriptPackageFiles() { - $basePath = __DIR__ . '/../../data/resourceloader'; - $base = [ 'localBasePath' => $basePath ]; - $commentScript = file_get_contents( "$basePath/script-comment.js" ); - $nosemiScript = file_get_contents( "$basePath/script-nosemi.js" ); - $vueComponentDebug = trim( file_get_contents( "$basePath/vue-component-output-debug.js.txt" ) ); - $vueComponentNonDebug = trim( file_get_contents( "$basePath/vue-component-output-nondebug.js.txt" ) ); - $config = RequestContext::getMain()->getConfig(); - return [ - [ - $base + [ - 'packageFiles' => [ - 'script-comment.js', - 'script-nosemi.js' - ] - ], - [ - 'files' => [ - 'script-comment.js' => [ - 'type' => 'script', - 'content' => $commentScript, - ], - 'script-nosemi.js' => [ - 'type' => 'script', - 'content' => $nosemiScript - ] - ], - 'main' => 'script-comment.js' - ] - ], - [ - $base + [ - 'packageFiles' => [ - 'script-comment.js', - [ 'name' => 'script-nosemi.js', 'main' => true ] - ], - 'deprecated' => 'Deprecation test', - 'name' => 'test-deprecated' - ], - [ - 'files' => [ - 'script-comment.js' => [ - 'type' => 'script', - 'content' => $commentScript, - ], - 'script-nosemi.js' => [ - 'type' => 'script', - 'content' => 'mw.log.warn(' . - '"This page is using the deprecated ResourceLoader module \"test-deprecated\".\\n' . - "Deprecation test" . - '");' . - $nosemiScript - ] - ], - 'main' => 'script-nosemi.js' - ] - ], - [ - $base + [ - 'packageFiles' => [ - [ 'name' => 'init.js', 'file' => 'script-comment.js', 'main' => true ], - [ 'name' => 'nosemi.js', 'file' => 'script-nosemi.js' ], - ] - ], - [ - 'files' => [ - 'init.js' => [ - 'type' => 'script', - 'content' => $commentScript, - ], - 'nosemi.js' => [ - 'type' => 'script', - 'content' => $nosemiScript - ] - ], - 'main' => 'init.js' - ] - ], - 'package file with callback' => [ - $base + [ - 'packageFiles' => [ - [ 'name' => 'foo.json', 'content' => [ 'Hello' => 'world' ] ], - 'sample.json', - [ 'name' => 'bar.js', 'content' => "console.log('Hello');" ], - [ - 'name' => 'data.json', - 'callback' => static function ( $context, $config, $extra ) { - return [ 'langCode' => $context->getLanguage(), 'extra' => $extra ]; - }, - 'callbackParam' => [ 'a' => 'b' ], - ], - [ 'name' => 'config.json', 'config' => [ - 'Sitename', - 'server' => 'ServerName', - ] ], - ] - ], - [ - 'files' => [ - 'foo.json' => [ - 'type' => 'data', - 'content' => [ 'Hello' => 'world' ], - ], - 'sample.json' => [ - 'type' => 'data', - 'content' => (object)[ 'foo' => 'bar', 'answer' => 42 ], - ], - 'bar.js' => [ - 'type' => 'script', - 'content' => "console.log('Hello');", - ], - 'data.json' => [ - 'type' => 'data', - 'content' => [ 'langCode' => 'fy', 'extra' => [ 'a' => 'b' ] ], - ], - 'config.json' => [ - 'type' => 'data', - 'content' => [ - 'Sitename' => $config->get( 'Sitename' ), - 'server' => $config->get( 'ServerName' ), - ] - ] - ], - 'main' => 'bar.js' - ], - [ - 'lang' => 'fy' - ] - ], - 'package file with callback and versionCallback' => [ - $base + [ - 'packageFiles' => [ - [ 'name' => 'bar.js', 'content' => "console.log('Hello');" ], - [ - 'name' => 'data.json', - 'versionCallback' => static function ( $context ) { - return 'x'; - }, - 'callback' => static function ( $context, $config, $extra ) { - return [ 'langCode' => $context->getLanguage(), 'extra' => $extra ]; - }, - 'callbackParam' => [ 'A', 'B' ] - ], - ] - ], - [ - 'files' => [ - 'bar.js' => [ - 'type' => 'script', - 'content' => "console.log('Hello');", - ], - 'data.json' => [ - 'type' => 'data', - 'content' => [ 'langCode' => 'fy', 'extra' => [ 'A', 'B' ] ], - ], - ], - 'main' => 'bar.js' - ], - [ - 'lang' => 'fy' - ] - ], - 'package file with callback that returns a file (1)' => [ - $base + [ - 'packageFiles' => [ - [ 'name' => 'dynamic.js', 'callback' => static function ( $context ) { - $file = $context->getLanguage() === 'fy' ? 'script-comment.js' : 'script-nosemi.js'; - return new ResourceLoaderFilePath( $file ); - } ] - ] - ], - [ - 'files' => [ - 'dynamic.js' => [ - 'type' => 'script', - 'content' => $commentScript, - ] - ], - 'main' => 'dynamic.js' - ], - [ - 'lang' => 'fy' - ] - ], - 'package file with callback that returns a file (2)' => [ - $base + [ - 'packageFiles' => [ - [ 'name' => 'dynamic.js', 'callback' => static function ( $context ) { - $file = $context->getLanguage() === 'fy' ? 'script-comment.js' : 'script-nosemi.js'; - return new ResourceLoaderFilePath( $file ); - } ] - ] - ], - [ - 'files' => [ - 'dynamic.js' => [ - 'type' => 'script', - 'content' => $nosemiScript, - ] - ], - 'main' => 'dynamic.js' - ], - [ - 'lang' => 'nl' - ] - ], - '.vue file in debug mode' => [ - $base + [ - 'packageFiles' => [ - 'vue-component.vue' - ] - ], - [ - 'files' => [ - 'vue-component.vue' => [ - 'type' => 'script', - 'content' => $vueComponentDebug - ] - ], - 'main' => 'vue-component.vue', - ], - [ - 'debug' => 'true' - ] - ], - '.vue file in non-debug mode' => [ - $base + [ - 'packageFiles' => [ - 'vue-component.vue' - ], - 'name' => 'nondebug', - ], - [ - 'files' => [ - 'vue-component.vue' => [ - 'type' => 'script', - 'content' => $vueComponentNonDebug - ] - ], - 'main' => 'vue-component.vue' - ], - [ - 'debug' => 'false' - ] - ], - [ - $base + [ - 'packageFiles' => [ - [ 'file' => 'script-comment.js' ] - ] - ], - LogicException::class - ], - 'package file with invalid callback' => [ - $base + [ - 'packageFiles' => [ - [ 'name' => 'foo.json', 'callback' => 'functionThatDoesNotExist142857' ] - ] - ], - LogicException::class - ], - [ - // 'config' not valid for 'script' type - $base + [ - 'packageFiles' => [ - 'foo.json' => [ 'type' => 'script', 'config' => [ 'Sitename' ] ] - ] - ], - LogicException::class - ], - [ - // 'config' not valid for '*.js' file - $base + [ - 'packageFiles' => [ - [ 'name' => 'foo.js', 'config' => 'Sitename' ] - ] - ], - LogicException::class - ], - [ - // missing type/name/file. - $base + [ - 'packageFiles' => [ - 'foo.js' => [ 'garbage' => 'data' ] - ] - ], - LogicException::class - ], - [ - $base + [ - 'packageFiles' => [ - 'filethatdoesnotexist142857.js' - ] - ], - RuntimeException::class - ], - [ - // JSON can't be a main file - $base + [ - 'packageFiles' => [ - 'script-nosemi.js', - [ 'name' => 'foo.json', 'content' => [ 'Hello' => 'world' ], 'main' => true ] - ] - ], - LogicException::class - ] - ]; - } - - /** - * @dataProvider provideGetScriptPackageFiles - * @covers ResourceLoaderFileModule::getScript - * @covers ResourceLoaderFileModule::getPackageFiles - * @covers ResourceLoaderFileModule::expandPackageFiles - */ - public function testGetScriptPackageFiles( $moduleDefinition, $expected, $contextOptions = [] ) { - $module = new ResourceLoaderFileModule( $moduleDefinition ); - $context = $this->getResourceLoaderContext( $contextOptions ); - $module->setConfig( $context->getResourceLoader()->getConfig() ); - if ( isset( $moduleDefinition['name'] ) ) { - $module->setName( $moduleDefinition['name'] ); - } - if ( is_string( $expected ) ) { - // Class name of expected exception - $this->expectException( $expected ); - $module->getScript( $context ); - } else { - // Array of expected return value - $this->assertEquals( $expected, $module->getScript( $context ) ); - } - } - - /** - * @covers ResourceLoaderFileModule::requiresES6 - */ - public function testRequiresES6() { - $module = new ResourceLoaderFileModule(); - $this->assertFalse( $module->requiresES6(), 'requiresES6 defaults to false' ); - $module = new ResourceLoaderFileModule( [ 'es6' => false ] ); - $this->assertFalse( $module->requiresES6(), 'requiresES6 is false when set to false' ); - $module = new ResourceLoaderFileModule( [ 'es6' => true ] ); - $this->assertTrue( $module->requiresES6(), 'requiresES6 is true when set to true' ); - } -} |