wiki.techinc.nl/tests/phpunit/includes/block/CompositeBlockTest.php
James D. Forrester 4f2d1efdda Coding style: Auto-fix MediaWiki.Classes.UnsortedUseStatements.UnsortedUse
Change-Id: I94a0ae83c65e8ee419bbd1ae1e86ab21ed4d8210
2020-01-10 09:32:25 -08:00

320 lines
7.7 KiB
PHP

<?php
use MediaWiki\Block\BlockRestrictionStore;
use MediaWiki\Block\CompositeBlock;
use MediaWiki\Block\DatabaseBlock;
use MediaWiki\Block\Restriction\NamespaceRestriction;
use MediaWiki\Block\Restriction\PageRestriction;
use MediaWiki\Block\SystemBlock;
use MediaWiki\MediaWikiServices;
/**
* @group Database
* @group Blocking
* @coversDefaultClass \MediaWiki\Block\CompositeBlock
*/
class CompositeBlockTest extends MediaWikiLangTestCase {
private function getPartialBlocks() {
$sysopId = $this->getTestSysop()->getUser()->getId();
$userBlock = new DatabaseBlock( [
'address' => $this->getTestUser()->getUser(),
'by' => $sysopId,
'sitewide' => false,
] );
$ipBlock = new DatabaseBlock( [
'address' => '127.0.0.1',
'by' => $sysopId,
'sitewide' => false,
] );
$userBlock->insert();
$ipBlock->insert();
return [
'user' => $userBlock,
'ip' => $ipBlock,
];
}
private function deleteBlocks( $blocks ) {
foreach ( $blocks as $block ) {
$block->delete();
}
}
/**
* @covers ::__construct
* @dataProvider provideTestStrictestParametersApplied
*/
public function testStrictestParametersApplied( $blocks, $expected ) {
$this->setMwGlobals( [
'wgBlockDisablesLogin' => false,
'wgBlockAllowsUTEdit' => true,
] );
$block = new CompositeBlock( [
'originalBlocks' => $blocks,
] );
$this->assertSame( $expected[ 'hideName' ], $block->getHideName() );
$this->assertSame( $expected[ 'sitewide' ], $block->isSitewide() );
$this->assertSame( $expected[ 'blockEmail' ], $block->isEmailBlocked() );
$this->assertSame( $expected[ 'allowUsertalk' ], $block->isUsertalkEditAllowed() );
}
public static function provideTestStrictestParametersApplied() {
return [
'Sitewide block and partial block' => [
[
new DatabaseBlock( [
'sitewide' => false,
'blockEmail' => true,
'allowUsertalk' => true,
] ),
new DatabaseBlock( [
'sitewide' => true,
'blockEmail' => false,
'allowUsertalk' => false,
] ),
],
[
'hideName' => false,
'sitewide' => true,
'blockEmail' => true,
'allowUsertalk' => false,
],
],
'Partial block and system block' => [
[
new DatabaseBlock( [
'sitewide' => false,
'blockEmail' => true,
'allowUsertalk' => false,
] ),
new SystemBlock( [
'systemBlock' => 'proxy',
] ),
],
[
'hideName' => false,
'sitewide' => true,
'blockEmail' => true,
'allowUsertalk' => false,
],
],
'System block and user name hiding block' => [
[
new DatabaseBlock( [
'hideName' => true,
'sitewide' => true,
'blockEmail' => true,
'allowUsertalk' => false,
] ),
new SystemBlock( [
'systemBlock' => 'proxy',
] ),
],
[
'hideName' => true,
'sitewide' => true,
'blockEmail' => true,
'allowUsertalk' => false,
],
],
'Two lenient partial blocks' => [
[
new DatabaseBlock( [
'sitewide' => false,
'blockEmail' => false,
'allowUsertalk' => true,
] ),
new DatabaseBlock( [
'sitewide' => false,
'blockEmail' => false,
'allowUsertalk' => true,
] ),
],
[
'hideName' => false,
'sitewide' => false,
'blockEmail' => false,
'allowUsertalk' => true,
],
],
];
}
/**
* @covers ::appliesToTitle
*/
public function testBlockAppliesToTitle() {
$this->setMwGlobals( [
'wgBlockDisablesLogin' => false,
] );
$blocks = $this->getPartialBlocks();
$block = new CompositeBlock( [
'originalBlocks' => $blocks,
] );
$pageFoo = $this->getExistingTestPage( 'Foo' );
$pageBar = $this->getExistingTestPage( 'User:Bar' );
$this->getBlockRestrictionStore()->insert( [
new PageRestriction( $blocks[ 'user' ]->getId(), $pageFoo->getId() ),
new NamespaceRestriction( $blocks[ 'ip' ]->getId(), NS_USER ),
] );
$this->assertTrue( $block->appliesToTitle( $pageFoo->getTitle() ) );
$this->assertTrue( $block->appliesToTitle( $pageBar->getTitle() ) );
$this->deleteBlocks( $blocks );
}
/**
* @covers ::appliesToUsertalk
* @covers ::appliesToPage
* @covers ::appliesToNamespace
*/
public function testBlockAppliesToUsertalk() {
$this->setMwGlobals( [
'wgBlockAllowsUTEdit' => true,
'wgBlockDisablesLogin' => false,
] );
$blocks = $this->getPartialBlocks();
$block = new CompositeBlock( [
'originalBlocks' => $blocks,
] );
$title = $blocks[ 'user' ]->getTarget()->getTalkPage();
$page = $this->getExistingTestPage( 'User talk:' . $title->getText() );
$this->getBlockRestrictionStore()->insert( [
new PageRestriction( $blocks[ 'user' ]->getId(), $page->getId() ),
new NamespaceRestriction( $blocks[ 'ip' ]->getId(), NS_USER ),
] );
$this->assertTrue( $block->appliesToUsertalk( $blocks[ 'user' ]->getTarget()->getTalkPage() ) );
$this->deleteBlocks( $blocks );
}
/**
* @covers ::appliesToRight
* @dataProvider provideTestBlockAppliesToRight
*/
public function testBlockAppliesToRight( $applies, $expected ) {
$this->setMwGlobals( [
'wgBlockDisablesLogin' => false,
] );
$block = new CompositeBlock( [
'originalBlocks' => [
$this->getMockBlockForTestAppliesToRight( $applies[ 0 ] ),
$this->getMockBlockForTestAppliesToRight( $applies[ 1 ] ),
],
] );
$this->assertSame( $block->appliesToRight( 'right' ), $expected );
}
private function getMockBlockForTestAppliesToRight( $applies ) {
$mockBlock = $this->getMockBuilder( DatabaseBlock::class )
->setMethods( [ 'appliesToRight' ] )
->getMock();
$mockBlock->method( 'appliesToRight' )
->willReturn( $applies );
return $mockBlock;
}
public function provideTestBlockAppliesToRight() {
return [
'Block does not apply if no original blocks apply' => [
[ false, false ],
false,
],
'Block applies if any original block applies (second block doesn\'t apply)' => [
[ true, false ],
true,
],
'Block applies if any original block applies (second block unsure)' => [
[ true, null ],
true,
],
'Block is unsure if all original blocks are unsure' => [
[ null, null ],
null,
],
'Block is unsure if any original block is unsure, and no others apply' => [
[ null, false ],
null,
],
];
}
/**
* AbstractBlock::getPermissionsError is deprecated. Block errors are tested
* properly in BlockErrorFormatterTest::testGetMessage.
*
* @covers ::getPermissionsError
*/
public function testGetPermissionsError() {
$timestamp = '20000101000000';
$compositeBlock = new CompositeBlock( [
'timestamp' => $timestamp,
'originalBlocks' => [
new SystemBlock( [
'systemBlock' => 'test1',
] ),
new SystemBlock( [
'systemBlock' => 'test2',
] )
]
] );
$context = new DerivativeContext( RequestContext::getMain() );
$request = $this->getMockBuilder( FauxRequest::class )
->setMethods( [ 'getIP' ] )
->getMock();
$request->method( 'getIP' )
->willReturn( '1.2.3.4' );
$context->setRequest( $request );
$formatter = MediaWikiServices::getInstance()->getBlockErrorFormatter();
$message = $formatter->getMessage(
$compositeBlock,
$context->getUser(),
$context->getLanguage(),
$context->getRequest()->getIP()
);
$this->assertSame( 'blockedtext-composite', $message->getKey() );
$this->assertSame(
[
'',
'no reason given',
'1.2.3.4',
'',
'Your IP address appears in multiple blacklists',
'infinite',
'',
'00:00, 1 January 2000',
],
$message->getParams()
);
}
/**
* Get an instance of BlockRestrictionStore
*
* @return BlockRestrictionStore
*/
protected function getBlockRestrictionStore() : BlockRestrictionStore {
return MediaWikiServices::getInstance()->getBlockRestrictionStore();
}
}