wiki.techinc.nl/tests/phpunit/includes/block/CompositeBlockTest.php
Umherirrender 16a436ce6c tests: Remove cleanup of blocks, done by ChangedTablesTracker
In DatabaseBlockTest changed from addDBDataOnce() to addDBData() as
ChangedTablesTracker cannot reset tables changed by addDBDataOnce()
between each test run.

Remove also User::clearInstanceCache done together with the deletion as
the TestUser class is calling this already between tests.

Change-Id: Ibd5e544138a2a9b554abc2dea54a5db38f9a828f
2024-01-20 11:41:15 +01:00

299 lines
8.5 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\MainConfigNames;
/**
* @group Database
* @group Blocking
* @covers \MediaWiki\Block\CompositeBlock
*/
class CompositeBlockTest extends MediaWikiLangTestCase {
private function getPartialBlocks() {
$sysopUser = $this->getTestSysop()->getUser();
$userBlock = new DatabaseBlock( [
'address' => $this->getTestUser()->getUser(),
'by' => $sysopUser,
'sitewide' => false,
] );
$ipBlock = new DatabaseBlock( [
'address' => '127.0.0.1',
'by' => $sysopUser,
'sitewide' => false,
] );
$blockStore = $this->getServiceContainer()->getDatabaseBlockStore();
$blockStore->insertBlock( $userBlock );
$blockStore->insertBlock( $ipBlock );
return [
'user' => $userBlock,
'ip' => $ipBlock,
];
}
/**
* @dataProvider provideTestStrictestParametersApplied
*/
public function testStrictestParametersApplied( $blocks, $expected ) {
$this->overrideConfigValues( [
MainConfigNames::BlockDisablesLogin => false,
MainConfigNames::BlockAllowsUTEdit => 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,
],
],
];
}
public function testBlockAppliesToTitle() {
$this->overrideConfigValue( MainConfigNames::BlockDisablesLogin, 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() ) );
}
public function testBlockAppliesToUsertalk() {
$this->overrideConfigValues( [
MainConfigNames::BlockAllowsUTEdit => true,
MainConfigNames::BlockDisablesLogin => false,
] );
$blocks = $this->getPartialBlocks();
$block = new CompositeBlock( [
'originalBlocks' => $blocks,
] );
$userFactory = $this->getServiceContainer()->getUserFactory();
$targetIdentity = $userFactory->newFromUserIdentity( $blocks[ 'user' ]->getTargetUserIdentity() );
$title = $targetIdentity->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( $title ) );
}
/**
* @dataProvider provideTestBlockAppliesToRight
*/
public function testBlockAppliesToRight( $applies, $expected ) {
$this->overrideConfigValue( MainConfigNames::BlockDisablesLogin, false );
$block = new CompositeBlock( [
'originalBlocks' => [
$this->getMockBlockForTestAppliesToRight( $applies[ 0 ] ),
$this->getMockBlockForTestAppliesToRight( $applies[ 1 ] ),
],
] );
$this->assertSame( $expected, $block->appliesToRight( 'right' ) );
}
private function getMockBlockForTestAppliesToRight( $applies ) {
$mockBlock = $this->getMockBuilder( DatabaseBlock::class )
->onlyMethods( [ 'appliesToRight' ] )
->getMock();
$mockBlock->method( 'appliesToRight' )
->willReturn( $applies );
return $mockBlock;
}
public static 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,
],
];
}
public function testTimestamp() {
$timestamp = 20000101000000;
$firstBlock = $this->createMock( DatabaseBlock::class );
$firstBlock->method( 'getTimestamp' )
->willReturn( (string)$timestamp );
$secondBlock = $this->createMock( DatabaseBlock::class );
$secondBlock->method( 'getTimestamp' )
->willReturn( (string)( $timestamp + 10 ) );
$thirdBlock = $this->createMock( DatabaseBlock::class );
$thirdBlock->method( 'getTimestamp' )
->willReturn( (string)( $timestamp + 100 ) );
$block = new CompositeBlock( [
'originalBlocks' => [ $thirdBlock, $firstBlock, $secondBlock ],
] );
$this->assertSame( (string)$timestamp, $block->getTimestamp() );
}
public function testCreateFromBlocks() {
$block1 = new SystemBlock( [
'address' => '127.0.0.1',
'systemBlock' => 'test1',
] );
$block2 = new SystemBlock( [
'address' => '127.0.0.1',
'systemBlock' => 'test2',
] );
$block3 = new SystemBlock( [
'address' => '127.0.0.1',
'systemBlock' => 'test3',
] );
$compositeBlock = CompositeBlock::createFromBlocks( $block1, $block2 );
$this->assertInstanceOf( CompositeBlock::class, $compositeBlock );
$this->assertCount( 2, $compositeBlock->getOriginalBlocks() );
[ $actualBlock1, $actualBlock2 ] = $compositeBlock->getOriginalBlocks();
$this->assertSame( $block1->getSystemBlockType(), $actualBlock1->getSystemBlockType() );
$this->assertSame( $block2->getSystemBlockType(), $actualBlock2->getSystemBlockType() );
$this->assertSame( 'blockedtext-composite-reason',
$compositeBlock->getReasonComment()->message->getKey() );
$this->assertSame( '127.0.0.1', $compositeBlock->getTargetName() );
$compositeBlock2 = CompositeBlock::createFromBlocks( $compositeBlock, $block3 );
$this->assertCount( 3, $compositeBlock2->getOriginalBlocks() );
[ $actualBlock1, $actualBlock2, $actualBlock3 ] = $compositeBlock2->getOriginalBlocks();
$this->assertSame( $block1->getSystemBlockType(), $actualBlock1->getSystemBlockType() );
$this->assertSame( $block2->getSystemBlockType(), $actualBlock2->getSystemBlockType() );
$this->assertSame( $block3->getSystemBlockType(), $actualBlock3->getSystemBlockType() );
}
/**
* Get an instance of BlockRestrictionStore
*
* @return BlockRestrictionStore
*/
protected function getBlockRestrictionStore(): BlockRestrictionStore {
return $this->getServiceContainer()->getBlockRestrictionStore();
}
}