wiki.techinc.nl/tests/phpunit/includes/HookContainer/HookContainerIntegrationTest.php

106 lines
3.3 KiB
PHP
Raw Normal View History

<?php
namespace MediaWiki\HookContainer {
use ExtensionRegistry;
use MediaWiki\MediaWikiServices;
use Wikimedia\ScopedCallback;
class HookContainerIntegrationTest extends \MediaWikiIntegrationTestCase {
/**
* @covers \MediaWiki\HookContainer\HookContainer::run
*/
public function testHookRunsWhenExtensionRegistered() {
$hookContainer = MediaWikiServices::getInstance()->getHookContainer();
$extensionRegistry = ExtensionRegistry::getInstance();
$numHandlersExecuted = 0;
$handlers = [ 'FooHook' => [ [
'handler' => [
'class' => 'FooExtension\\FooExtensionHooks',
'name' => 'FooExtension-FooHandler',
] ] ]
];
$reset = $extensionRegistry->setAttributeForTest( 'Hooks', $handlers );
$this->assertEquals( $numHandlersExecuted, 0 );
$hookContainer->run( 'FooHook', [ &$numHandlersExecuted ] );
$this->assertEquals( $numHandlersExecuted, 1 );
ScopedCallback::consume( $reset );
}
/**
* @covers \MediaWiki\HookContainer\HookContainer::run
* @covers \MediaWiki\HookContainer\HookContainer::scopedRegister
*/
public function testPreviouslyRegisteredHooksAreReAppliedAfterScopedRegisterRemovesThem() {
$hookContainer = MediaWikiServices::getInstance()->getHookContainer();
// Some handlers for FooHook have been previously set
$reset = $hookContainer->register( 'FooHook', function () {
return true;
} );
$reset1 = $hookContainer->register( 'FooHook', function () {
return true;
} );
$handlersBeforeScopedRegister = $hookContainer->getLegacyHandlers( 'FooHook' );
$this->assertCount( 2, $handlersBeforeScopedRegister );
// Wipe out the 2 existing handlers and add a new scoped handler
$reset2 = $hookContainer->scopedRegister( 'FooHook', function () {
return true;
}, true );
$handlersAfterScopedRegister = $hookContainer->getLegacyHandlers( 'FooHook' );
$this->assertCount( 1, $handlersAfterScopedRegister );
ScopedCallback::consume( $reset2 );
// Teardown causes the original handlers to be re-applied
$this->mediaWikiTearDown();
$handlersAfterTearDown = $hookContainer->getLegacyHandlers( 'FooHook' );
$this->assertCount( 2, $handlersAfterTearDown );
}
/**
* @covers \MediaWiki\HookContainer\HookContainer::run
* @covers \MediaWiki\HookContainer\HookContainer::scopedRegister
*/
public function testHookRunsWithMultipleMixedHandlerTypes() {
$hookContainer = MediaWikiServices::getInstance()->getHookContainer();
$numHandlersExecuted = 0;
$reset = $hookContainer->scopedRegister( 'FooHook', function ( &$numHandlersRun ) {
$numHandlersRun++;
}, false );
$reset2 = $hookContainer->scopedRegister( 'FooHook', function ( &$numHandlersRun ) {
$numHandlersRun++;
}, false );
$handlerThree = [
'FooHook' => [
[ 'handler' => [
'class' => 'FooExtension\\FooExtensionHooks',
'name' => 'FooExtension-FooHandler',
]
]
]
];
$reset3 = ExtensionRegistry::getInstance()->setAttributeForTest( 'Hooks', $handlerThree );
$hookContainer->run( 'FooHook', [ &$numHandlersExecuted ] );
$this->assertEquals( $numHandlersExecuted, 3 );
ScopedCallback::consume( $reset );
ScopedCallback::consume( $reset2 );
ScopedCallback::consume( $reset3 );
}
}
}
namespace FooExtension {
class FooExtensionHooks {
public function onFooHook( &$numHandlersRun ) {
$numHandlersRun++;
}
}
}