wiki.techinc.nl/tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
jdlrobson ebeb297236 resourceloader: Add support for delivering templates
A base ResourceLoaderModule::getTemplates() exists for subclasses
to override. An implementation is provided for ResourceLoaderFileModule.

For file modules, templates can be specified in the following manner:

'example' => array(
	'templates' => array(
		'bar' => 'templates/foo.html',
	),
	'scripts' => 'example.js',
),

The delivery system is template language agnostic, and currently
only supports "compiling" plain HTML templates.

This also adds template support to the following modules as a POC:
* mediawiki.feedback
* mediawiki.action.view.postEdit
* mediawiki.special.upload

Works with $wgResourceLoaderStorageEnabled

Change-Id: Ia0c5c8ec960aa6dff12c9626cee41ae9a3286b76
2014-10-29 19:31:16 +00:00

155 lines
3.4 KiB
PHP

<?php
/**
* @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 () {
}
);
}
public static function getModules() {
$base = array(
'localBasePath' => realpath( dirname( __FILE__ ) ),
);
return array(
'noTemplateModule' => array(),
'htmlTemplateModule' => $base + array(
'templates' => array(
'templates/template.html',
'templates/template2.html',
)
),
'aliasedHtmlTemplateModule' => $base + array(
'templates' => array(
'foo.html' => 'templates/template.html',
'bar.html' => 'templates/template2.html',
)
),
'templateModuleHandlebars' => $base + array(
'templates' => array(
'templates/template_awesome.handlebars',
),
),
);
}
public static function providerGetTemplates() {
$modules = self::getModules();
return array(
array(
$modules['noTemplateModule'],
array(),
),
array(
$modules['templateModuleHandlebars'],
array(
'templates/template_awesome.handlebars' => "wow\n",
),
),
array(
$modules['htmlTemplateModule'],
array(
'templates/template.html' => "<strong>hello</strong>\n",
'templates/template2.html' => "<div>goodbye</div>\n",
),
),
array(
$modules['aliasedHtmlTemplateModule'],
array(
'foo.html' => "<strong>hello</strong>\n",
'bar.html' => "<div>goodbye</div>\n",
),
),
);
}
public static function providerGetModifiedTime() {
$modules = self::getModules();
return array(
// Check the default value when no templates present in module is 1
array( $modules['noTemplateModule'], 1 ),
);
}
/**
* @covers ResourceLoaderFileModule::getAllSkinStyleFiles
*/
public function testGetAllSkinStyleFiles() {
$baseParams = array(
'scripts' => array(
'foo.js',
'bar.js',
),
'styles' => array(
'foo.css',
'bar.css' => array( 'media' => 'print' ),
'screen.less' => array( 'media' => 'screen' ),
'screen-query.css' => array( 'media' => 'screen and (min-width: 400px)' ),
),
'skinStyles' => array(
'default' => 'quux-fallback.less',
'fakeskin' => array(
'baz-vector.css',
'quux-vector.less',
),
),
'messages' => array(
'hello',
'world',
),
);
$module = new ResourceLoaderFileModule( $baseParams );
$this->assertEquals(
array(
'foo.css',
'baz-vector.css',
'quux-vector.less',
'quux-fallback.less',
'bar.css',
'screen.less',
'screen-query.css',
),
array_map( 'basename', $module->getAllStyleFiles() )
);
}
/**
* @dataProvider providerGetTemplates
* @covers ResourceLoaderFileModule::getTemplates
*/
public function testGetTemplates( $module, $expected ) {
$rl = new ResourceLoaderFileModule( $module );
$this->assertEquals( $rl->getTemplates(), $expected );
}
/**
* @dataProvider providerGetModifiedTime
* @covers ResourceLoaderFileModule::getModifiedTime
*/
public function testGetModifiedTime( $module, $expected ) {
$rl = new ResourceLoaderFileModule( $module );
$ts = $rl->getModifiedTime( new ResourceLoaderContext(
new ResourceLoader, new FauxRequest() ) );
$this->assertEquals( $ts, $expected );
}
}