From c4e5cc2957e76ed36bf6b7b5fb71670fc40feb1d Mon Sep 17 00:00:00 2001 From: Timo Tijhof Date: Mon, 29 Aug 2016 16:35:55 -0700 Subject: [PATCH] resourceloader: Create unit tests for ResourceLoaderContext * Fix up one last use of global config vars in this class. Other places in this class already used $rl->getConfig(). This way we don't inherit all of MediaWikiTestCase. * Add unit tests covering all of ResourceLoaderContext except expandModuleNames and getImageObj (tested in better places already with the right @covers). * Increase coverage for expandModuleNames(), add missing case of when modules are not in alphabetical order. Change-Id: Id19b084d37a6c3a77b36e03509adffb6b156fee1 --- .../resourceloader/ResourceLoaderContext.php | 3 +- .../ResourceLoaderContextTest.php | 107 ++++++++++++++++++ .../ResourceLoaderImageModuleTest.php | 43 +++++++ .../resourceloader/ResourceLoaderTest.php | 14 ++- 4 files changed, 163 insertions(+), 4 deletions(-) create mode 100644 tests/phpunit/includes/resourceloader/ResourceLoaderContextTest.php diff --git a/includes/resourceloader/ResourceLoaderContext.php b/includes/resourceloader/ResourceLoaderContext.php index 79b71df18b..30fe3ae4ac 100644 --- a/includes/resourceloader/ResourceLoaderContext.php +++ b/includes/resourceloader/ResourceLoaderContext.php @@ -175,8 +175,7 @@ class ResourceLoaderContext { // Stricter version of RequestContext::sanitizeLangCode() if ( !Language::isValidBuiltInCode( $lang ) ) { wfDebug( "Invalid user language code\n" ); - global $wgLanguageCode; - $lang = $wgLanguageCode; + $lang = $this->getResourceLoader()->getConfig()->get( 'LanguageCode' ); } $this->language = $lang; } diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderContextTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderContextTest.php new file mode 100644 index 0000000000..1093039f88 --- /dev/null +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderContextTest.php @@ -0,0 +1,107 @@ + false, + 'DefaultSkin' => 'fallback', + 'LanguageCode' => 'nl', + ] ) ); + } + + public function testEmpty() { + $ctx = new ResourceLoaderContext( $this->getResourceLoader(), new FauxRequest( [] ) ); + + // Request parameters + $this->assertEquals( [], $ctx->getModules() ); + $this->assertEquals( 'nl', $ctx->getLanguage() ); + $this->assertEquals( false, $ctx->getDebug() ); + $this->assertEquals( null, $ctx->getOnly() ); + $this->assertEquals( 'fallback', $ctx->getSkin() ); + $this->assertEquals( null, $ctx->getUser() ); + + // Misc + $this->assertEquals( 'ltr', $ctx->getDirection() ); + $this->assertEquals( 'nl|fallback||||||||', $ctx->getHash() ); + $this->assertInstanceOf( User::class, $ctx->getUserObj() ); + } + + public function testDummy() { + $this->assertInstanceOf( + ResourceLoaderContext::class, + ResourceLoaderContext::newDummyContext() + ); + } + + public function testAccessors() { + $ctx = new ResourceLoaderContext( $this->getResourceLoader(), new FauxRequest( [] ) ); + $this->assertInstanceOf( WebRequest::class, $ctx->getRequest() ); + $this->assertInstanceOf( \Psr\Log\LoggerInterface::class, $ctx->getLogger() ); + } + + public function testTypicalRequest() { + $ctx = new ResourceLoaderContext( $this->getResourceLoader(), new FauxRequest( [ + 'debug' => 'false', + 'lang' => 'zh', + 'modules' => 'foo|foo.quux,baz,bar|baz.quux', + 'only' => 'styles', + 'skin' => 'fallback', + ] ) ); + + // Request parameters + $this->assertEquals( + $ctx->getModules(), + [ 'foo', 'foo.quux', 'foo.baz', 'foo.bar', 'baz.quux' ] + ); + $this->assertEquals( false, $ctx->getDebug() ); + $this->assertEquals( 'zh', $ctx->getLanguage() ); + $this->assertEquals( 'styles', $ctx->getOnly() ); + $this->assertEquals( 'fallback', $ctx->getSkin() ); + $this->assertEquals( null, $ctx->getUser() ); + + // Misc + $this->assertEquals( 'ltr', $ctx->getDirection() ); + $this->assertEquals( 'zh|fallback|||styles|||||', $ctx->getHash() ); + } + + public function testShouldInclude() { + $ctx = new ResourceLoaderContext( $this->getResourceLoader(), new FauxRequest( [] ) ); + $this->assertTrue( $ctx->shouldIncludeScripts(), 'Scripts in combined' ); + $this->assertTrue( $ctx->shouldIncludeStyles(), 'Styles in combined' ); + $this->assertTrue( $ctx->shouldIncludeMessages(), 'Messages in combined' ); + + $ctx = new ResourceLoaderContext( $this->getResourceLoader(), new FauxRequest( [ + 'only' => 'styles' + ] ) ); + $this->assertFalse( $ctx->shouldIncludeScripts(), 'Scripts not in styles-only' ); + $this->assertTrue( $ctx->shouldIncludeStyles(), 'Styles in styles-only' ); + $this->assertFalse( $ctx->shouldIncludeMessages(), 'Messages not in styles-only' ); + + $ctx = new ResourceLoaderContext( $this->getResourceLoader(), new FauxRequest( [ + 'only' => 'scripts' + ] ) ); + $this->assertTrue( $ctx->shouldIncludeScripts(), 'Scripts in scripts-only' ); + $this->assertFalse( $ctx->shouldIncludeStyles(), 'Styles not in scripts-only' ); + $this->assertFalse( $ctx->shouldIncludeMessages(), 'Messages not in scripts-only' ); + } + + public function testGetUser() { + $ctx = new ResourceLoaderContext( $this->getResourceLoader(), new FauxRequest( [] ) ); + $this->assertSame( null, $ctx->getUser() ); + $this->assertTrue( $ctx->getUserObj()->isAnon() ); + + $ctx = new ResourceLoaderContext( $this->getResourceLoader(), new FauxRequest( [ + 'user' => 'Example' + ] ) ); + $this->assertSame( 'Example', $ctx->getUser() ); + $this->assertEquals( 'Example', $ctx->getUserObj()->getName() ); + } +} diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php index f61540d8ab..aeb82d14ff 100644 --- a/tests/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php @@ -154,6 +154,49 @@ class ResourceLoaderImageModuleTest extends ResourceLoaderTestCase { $styles = $module->getStyles( $this->getResourceLoaderContext() ); $this->assertEquals( $expected, $styles['all'] ); } + + /** + * @covers ResourceLoaderContext::getImageObj + */ + public function testContext() { + $context = new ResourceLoaderContext( new EmptyResourceLoader(), new FauxRequest() ); + $this->assertFalse( $context->getImageObj(), 'Missing image parameter' ); + + $context = new ResourceLoaderContext( new EmptyResourceLoader(), new FauxRequest( [ + 'image' => 'example', + ] ) ); + $this->assertFalse( $context->getImageObj(), 'Missing module parameter' ); + + $context = new ResourceLoaderContext( new EmptyResourceLoader(), new FauxRequest( [ + 'modules' => 'unknown', + 'image' => 'example', + ] ) ); + $this->assertFalse( $context->getImageObj(), 'Not an image module' ); + + $rl = new EmptyResourceLoader(); + $rl->register( 'test', [ + 'class' => ResourceLoaderImageModule::class, + 'prefix' => 'test', + 'images' => [ 'example' => 'example.png' ], + ] ); + $context = new ResourceLoaderContext( $rl, new FauxRequest( [ + 'modules' => 'test', + 'image' => 'unknown', + ] ) ); + $this->assertFalse( $context->getImageObj(), 'Unknown image' ); + + $rl = new EmptyResourceLoader(); + $rl->register( 'test', [ + 'class' => ResourceLoaderImageModule::class, + 'prefix' => 'test', + 'images' => [ 'example' => 'example.png' ], + ] ); + $context = new ResourceLoaderContext( $rl, new FauxRequest( [ + 'modules' => 'test', + 'image' => 'example', + ] ) ); + $this->assertInstanceOf( ResourceLoaderImage::class, $context->getImageObj() ); + } } class ResourceLoaderImageModuleTestable extends ResourceLoaderImageModule { diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php index 53c99265f8..9a3e222622 100644 --- a/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php @@ -163,6 +163,12 @@ class ResourceLoaderTest extends ResourceLoaderTestCase { [ 'single.module', 'foobar', 'foobaz' ], 'single.module|foobar,foobaz', ], + [ + 'Ordering', + [ 'foo', 'foo.baz', 'baz.quux', 'foo.bar' ], + 'foo|foo.baz,bar|baz.quux', + [ 'foo', 'foo.baz', 'foo.bar', 'baz.quux' ], + ] ]; } @@ -178,8 +184,12 @@ class ResourceLoaderTest extends ResourceLoaderTestCase { * @dataProvider providePackedModules * @covers ResourceLoaderContext::expandModuleNames */ - public function testexpandModuleNames( $desc, $modules, $packed ) { - $this->assertEquals( $modules, ResourceLoaderContext::expandModuleNames( $packed ), $desc ); + public function testExpandModuleNames( $desc, $modules, $packed, $unpacked = null ) { + $this->assertEquals( + $unpacked ?: $modules, + ResourceLoaderContext::expandModuleNames( $packed ), + $desc + ); } public static function provideAddSource() { -- 2.20.1