wiki.techinc.nl/tests/phpunit/mocks/MockBlockTrait.php
thiemowmde ba36bf46a1 tests: Make use of ??= and ?? operators in various tests
The main benefit is that this syntax avoids repeating the variable
name. It does the same as before.

Change-Id: I2040be889c749f4e2416ca9948ba261345858af2
2024-08-15 11:44:46 +02:00

132 lines
3.6 KiB
PHP

<?php
namespace MediaWiki\Tests\Unit;
use MediaWiki\Block\AbstractBlock;
use MediaWiki\Block\BlockManager;
use MediaWiki\Block\DatabaseBlock;
use MediaWiki\User\UserIdentity;
use MediaWiki\User\UserIdentityValue;
/**
* Creates and apply user blocks
* @stable to use since 1.42
*/
trait MockBlockTrait {
/**
* @param array $options Options as supported by AbstractBlock and
* DatabaseBlock. In addition, the 'target' field may contain a
* UserIdentity identifying the blocked user.
*
* @return AbstractBlock
*/
private function makeMockBlock( $options = [] ): AbstractBlock {
if ( isset( $options['target'] ) ) {
/** @var UserIdentity $user */
$user = $options['target'];
if ( !isset( $options['address'] ) ) {
$options['address'] = $user->getName();
}
if ( !isset( $options['wiki'] ) ) {
$options['wiki'] = $user->getWikiId();
}
unset( $options['target'] );
}
if ( !isset( $options['by'] ) ) {
$options['by'] = UserIdentityValue::newRegistered( 45622, 'Blocker' );
}
$block = new DatabaseBlock( $options );
return $block;
}
/**
* @param UserIdentity|AbstractBlock|array $block
* The Block to apply, or the user to block.
* If the block is given as an array,
* it supports the fields specified by the constructors
* of AbstractBlock and DatabaseBlock.
* @param UserIdentity|string|null $match The user to apply the
* block for. Will be determined automatically if not given.
*
* @return BlockManager
*/
private function makeMockBlockManager( $block, $match = null ) {
if ( is_array( $block ) ) {
if ( !isset( $block['target'] ) && $match !== null ) {
$target = $match instanceof UserIdentity ?
new UserIdentityValue( 0, $match ) :
$match;
$block['target'] = $target;
}
$block = $this->makeMockBlock( $block );
}
if ( $block instanceof UserIdentity ) {
$target = $block;
$block = $this->makeMockBlock( [ 'target' => $target ] );
}
$match ??= $block->getTargetUserIdentity();
$blockManager = $this->getMockBuilder( BlockManager::class )
->disableOriginalConstructor()
->onlyMethods( [
'getUserBlock', 'getBlock', 'getCreateAccountBlock', 'getIpBlock', 'clearUserCache'
] )
->getMock();
$callback = static function ( $user )
use ( $match, $block )
{
if ( is_string( $user ) && $user === $match->getName() ) {
return $block;
} elseif ( $user->equals( $match ) ) {
return $block;
}
return null;
};
$blockManager->method( 'getUserBlock' )
->willReturnCallback( $callback );
$blockManager->method( 'getBlock' )
->willReturnCallback( $callback );
$blockManager->method( 'getCreateAccountBlock' )
->willReturnCallback( $callback );
$blockManager->method( 'getIpBlock' )
->willReturnCallback( $callback );
return $blockManager;
}
/**
* @param UserIdentity|AbstractBlock|BlockManager|array $block
* The BlockManager to install, the Block to apply, or
* the user to block. If the block is given as an array,
* it supports the fields specified by the constructors
* of AbstractBlock and DatabaseBlock.
* @param UserIdentity|string|null $match The user to apply the
* block for. Will be determined automatically if not given.
*
* @return BlockManager
*/
private function installMockBlockManager( $block, $match = null ): BlockManager {
if ( $block instanceof BlockManager ) {
$blockManager = $block;
} else {
$blockManager = $this->makeMockBlockManager( $block, $match );
}
$this->setService( 'BlockManager', $blockManager );
return $blockManager;
}
}