wiki.techinc.nl/tests/phpunit/includes/specials/SpecialUnblockTest.php
Alexander Vorwerk decbaf4f38 phpunit: use ->getServiceContainer() in integration tests
Change-Id: I38299cb65eeaadfdc0eb05db4e8c0b0119cfb37d
2022-01-27 22:04:16 +01:00

152 lines
3.7 KiB
PHP

<?php
use MediaWiki\Block\DatabaseBlock;
use Wikimedia\TestingAccessWrapper;
/**
* @group Blocking
* @group Database
* @coversDefaultClass SpecialUnblock
*/
class SpecialUnblockTest extends SpecialPageTestBase {
/**
* @inheritDoc
*/
protected function newSpecialPage() {
$services = $this->getServiceContainer();
return new SpecialUnblock(
$services->getUnblockUserFactory(),
$services->getBlockUtils(),
$services->getUserNameUtils(),
$services->getUserNamePrefixSearch(),
$services->getSpecialPageFactory()
);
}
protected function tearDown(): void {
$this->db->delete( 'ipblocks', '*', __METHOD__ );
parent::tearDown();
}
/**
* @dataProvider provideGetFields
* @covers ::getFields()
*/
public function testGetFields( $target, $expected ) {
$page = TestingAccessWrapper::newFromObject( $this->newSpecialPage() );
$page->target = $target;
$page->block = new DatabaseBlock( [
'address' => '1.2.3.4',
'by' => $this->getTestSysop()->getUser(),
] );
$fields = $page->getFields();
$this->assertIsArray( $fields );
foreach ( $expected as $fieldName ) {
$this->assertArrayHasKey( $fieldName, $fields );
}
}
public function provideGetFields() {
return [
'No target specified' => [
'',
[ 'Target', 'Reason' ],
],
'Target is not blocked' => [
'1.1.1.1',
[ 'Target', 'Reason' ],
],
'Target is blocked' => [
'1.2.3.4',
[ 'Target', 'Reason', 'Name' ],
],
];
}
/**
* @dataProvider provideProcessUnblockErrors
* @covers ::execute()
*/
public function testProcessUnblockErrors( $options, $expected ) {
$performer = $this->getTestSysop()->getUser();
$target = '1.1.1.1';
if ( !empty( $options['block'] ) ) {
$block = new DatabaseBlock( [
'address' => $target,
'by' => $performer,
'hideName' => true,
] );
$this->getServiceContainer()->getDatabaseBlockStore()->insertBlock( $block );
}
if ( !empty( $options['readOnly'] ) ) {
$this->setMwGlobals( [ 'wgReadOnly' => true ] );
$this->expectException( ReadOnlyError::class );
}
if ( isset( $options['permissions'] ) ) {
$this->overrideUserPermissions( $performer, $options['permissions'] );
}
$request = new FauxRequest( [
'wpTarget' => $target,
'wpReason' => '',
], true );
list( $html, ) = $this->executeSpecialPage( '', $request, 'qqx', $performer );
$this->assertStringContainsString( $expected, $html );
}
public function provideProcessUnblockErrors() {
return [
'Target is not blocked' => [
[
'permissions' => [ 'block', 'hideuser' => true ],
],
'ipb_cant_unblock',
],
'Wrong permissions for unhiding user' => [
[
'block' => true,
'permissions' => [ 'block', 'hideuser' => false ],
],
'unblock-hideuser',
],
'Delete block failed' => [
[
'block' => true,
'permissions' => [ 'block', 'hideuser' ],
'readOnly' => true,
],
'ipb_cant_unblock',
],
];
}
/**
* @covers ::execute()
*/
public function testProcessUnblockErrorsUnblockSelf() {
$performer = $this->getTestSysop()->getUser();
$this->overrideUserPermissions( $performer, [ 'block', 'unblockself' => false ] );
// Blocker must be different user for unblock self to be disallowed
$blocker = $this->getTestUser()->getUser();
$block = new DatabaseBlock( [
'by' => $blocker,
'address' => $performer,
] );
$this->getServiceContainer()->getDatabaseBlockStore()->insertBlock( $block );
$request = new FauxRequest( [
'wpTarget' => $performer->getName(),
'wpReason' => '',
], true );
list( $html, ) = $this->executeSpecialPage( '', $request, 'qqx', $performer );
$this->assertStringContainsString( 'ipbnounblockself', $html );
}
}