From: Kunal Mehta Date: Sun, 27 May 2018 06:38:28 +0000 (-0700) Subject: Complete test coverage of Hooks class X-Git-Tag: 1.34.0-rc.0~5282^2 X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=commitdiff_plain;h=cac3ce56680dfa531fbc44ece4cb66f4ef302301 Complete test coverage of Hooks class Change-Id: I9e720c44e6d6c9c5d726a8a147e07ee9b638913f --- diff --git a/includes/Hooks.php b/includes/Hooks.php index c22dc97f46..3a33c2d29f 100644 --- a/includes/Hooks.php +++ b/includes/Hooks.php @@ -62,6 +62,7 @@ class Hooks { * * @since 1.21 * @throws MWException If not in testing mode. + * @codeCoverageIgnore */ public static function clear( $name ) { if ( !defined( 'MW_PHPUNIT_TEST' ) && !defined( 'MW_PARSER_TEST' ) ) { diff --git a/tests/phpunit/includes/HooksTest.php b/tests/phpunit/includes/HooksTest.php index efe92ec4e9..c1efc7ffec 100644 --- a/tests/phpunit/includes/HooksTest.php +++ b/tests/phpunit/includes/HooksTest.php @@ -33,6 +33,12 @@ class HooksTest extends MediaWikiTestCase { 'changed-static', 'original' ], + [ + 'Class::method static call as array', + [ [ 'NothingClass::someStatic' ] ], + 'changed-static', + 'original' + ], [ 'Global function', [ 'NothingFunction' ], 'changed-func', 'original' ], [ 'Global function with data', [ 'NothingFunctionData', 'data' ], 'data', 'original' ], [ 'Closure', [ function ( &$foo, $bar ) { @@ -81,10 +87,50 @@ class HooksTest extends MediaWikiTestCase { $this->assertSame( $expectedBar, $bar, $msg ); } + /** + * @covers Hooks::getHandlers + */ + public function testGetHandlers() { + global $wgHooks; + + $this->assertSame( + [], + Hooks::getHandlers( 'MediaWikiHooksTest001' ), + 'No hooks registered' + ); + + $a = new NothingClass(); + $b = new NothingClass(); + + $wgHooks['MediaWikiHooksTest001'][] = $a; + + $this->assertSame( + [ $a ], + Hooks::getHandlers( 'MediaWikiHooksTest001' ), + 'Hook registered by $wgHooks' + ); + + Hooks::register( 'MediaWikiHooksTest001', $b ); + $this->assertSame( + [ $b, $a ], + Hooks::getHandlers( 'MediaWikiHooksTest001' ), + 'Hooks::getHandlers() should return hooks registered via wgHooks as well as Hooks::register' + ); + + Hooks::clear( 'MediaWikiHooksTest001' ); + unset( $wgHooks['MediaWikiHooksTest001'] ); + + Hooks::register( 'MediaWikiHooksTest001', $b ); + $this->assertSame( + [ $b ], + Hooks::getHandlers( 'MediaWikiHooksTest001' ), + 'Hook registered by Hook::register' + ); + } + /** * @covers Hooks::isRegistered * @covers Hooks::register - * @covers Hooks::getHandlers * @covers Hooks::run * @covers Hooks::callHook */ @@ -151,6 +197,56 @@ class HooksTest extends MediaWikiTestCase { $this->assertSame( 'original', $foo, 'Hooks abort after a false return.' ); } + /** + * @covers Hooks::run + */ + public function testNullReturn() { + Hooks::register( 'MediaWikiHooksTest001', function ( &$foo ) { + return; + } ); + Hooks::register( 'MediaWikiHooksTest001', function ( &$foo ) { + $foo = 'test'; + + return true; + } ); + $foo = 'original'; + Hooks::run( 'MediaWikiHooksTest001', [ &$foo ] ); + $this->assertSame( 'test', $foo, 'Hooks continue after a null return.' ); + } + + /** + * @covers Hooks::callHook + */ + public function testCallHook_FalseHook() { + Hooks::register( 'MediaWikiHooksTest001', false ); + Hooks::register( 'MediaWikiHooksTest001', function ( &$foo ) { + $foo = 'test'; + + return true; + } ); + $foo = 'original'; + Hooks::run( 'MediaWikiHooksTest001', [ &$foo ] ); + $this->assertSame( 'test', $foo, 'Hooks that are falsey are skipped.' ); + } + + /** + * @covers Hooks::callHook + * @expectedException MWException + */ + public function testCallHook_UnknownDatatype() { + Hooks::register( 'MediaWikiHooksTest001', 12345 ); + Hooks::run( 'MediaWikiHooksTest001' ); + } + + /** + * @covers Hooks::callHook + * @expectedException PHPUnit_Framework_Error_Deprecated + */ + public function testCallHook_Deprecated() { + Hooks::register( 'MediaWikiHooksTest001', 'NothingClass::someStatic' ); + Hooks::run( 'MediaWikiHooksTest001', [], '1.31' ); + } + /** * @covers Hooks::runWithoutAbort * @covers Hooks::callHook