wiki.techinc.nl/tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
Kunal Mehta 3dd369cea2 Fix @covers tag
Trying to @cover or @use not existing method
"ResourceLoaderFileModule::getScripts"

Change-Id: Ifc4d2c98f5129f0d205e12081dfb48568d8250cb
2016-08-06 01:04:21 -07:00

286 lines
6.7 KiB
PHP

<?php
/**
* @group Database
* @group ResourceLoader
*/
class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
protected function setUp() {
parent::setUp();
// The return value of the closure shouldn't matter since this test should
// never call it
SkinFactory::getDefaultInstance()->register(
'fakeskin',
'FakeSkin',
function () {
}
);
}
private static function getModules() {
$base = [
'localBasePath' => realpath( __DIR__ ),
];
return [
'noTemplateModule' => [],
'deprecatedModule' => $base + [
'deprecated' => true,
],
'deprecatedTomorrow' => $base + [
'deprecated' => [
'message' => 'Will be removed tomorrow.'
],
],
'htmlTemplateModule' => $base + [
'templates' => [
'templates/template.html',
'templates/template2.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 );
$this->assertEquals( $rl->getDependencies(), $expected );
}
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();
$rl = new ResourceLoaderFileModule( $modules[$name] );
$rl->setName( $name );
$ctx = $this->getResourceLoaderContext( 'en', 'ltr' );
$this->assertEquals( $rl->getScript( $ctx ), $expected );
}
/**
* @covers ResourceLoaderFileModule::getAllStyleFiles
* @covers ResourceLoaderFileModule::getAllSkinStyleFiles
* @covers ResourceLoaderFileModule::getSkinStyleFiles
*/
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 );
$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 );
}
/**
* What happens when you mix @embed and @noflip?
* This really is an integration test, but oh well.
*
* @covers ResourceLoaderFileModule::getStyles
* @covers ResourceLoaderFileModule::getStyleFiles
*/
public function testMixedCssAnnotations() {
$basePath = __DIR__ . '/../../data/css';
$testModule = new ResourceLoaderFileModule( [
'localBasePath' => $basePath,
'styles' => [ 'test.css' ],
] );
$expectedModule = new ResourceLoaderFileModule( [
'localBasePath' => $basePath,
'styles' => [ 'expected.css' ],
] );
$contextLtr = $this->getResourceLoaderContext( 'en', 'ltr' );
$contextRtl = $this->getResourceLoaderContext( 'he', '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"
);
}
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",
],
],
];
}
/**
* @dataProvider providerGetTemplates
* @covers ResourceLoaderFileModule::getTemplates
*/
public function testGetTemplates( $module, $expected ) {
$rl = new ResourceLoaderFileModule( $module );
$this->assertEquals( $rl->getTemplates(), $expected );
}
public function testBomConcatenation() {
$basePath = __DIR__ . '/../../data/css';
$testModule = new ResourceLoaderFileModule( [
'localBasePath' => $basePath,
'styles' => [ 'bom.css' ],
] );
$this->assertEquals(
substr( file_get_contents( "$basePath/bom.css" ), 0, 10 ),
"\xef\xbb\xbf.efbbbf",
'File has leading BOM'
);
$contextLtr = $this->getResourceLoaderContext( 'en', 'ltr' );
$this->assertEquals(
$testModule->getStyles( $contextLtr ),
[ 'all' => ".efbbbf_bom_char_at_start_of_file {}\n" ],
'Leading BOM removed when concatenating files'
);
}
}