3 use MediaWiki\Block\DatabaseBlock
;
4 use MediaWiki\MainConfigNames
;
5 use MediaWiki\Request\FauxRequest
;
6 use MediaWiki\Specials\SpecialUnblock
;
7 use MediaWiki\Title\Title
;
8 use Wikimedia\TestingAccessWrapper
;
13 * @coversDefaultClass \MediaWiki\Specials\SpecialUnblock
15 class SpecialUnblockTest
extends SpecialPageTestBase
{
19 protected function newSpecialPage() {
20 $services = $this->getServiceContainer();
21 return new SpecialUnblock(
22 $services->getUnblockUserFactory(),
23 $services->getBlockUtils(),
24 $services->getDatabaseBlockStore(),
25 $services->getUserNameUtils(),
26 $services->getUserNamePrefixSearch(),
27 $services->getWatchlistManager()
32 * @dataProvider provideGetFields
35 public function testGetFields( $target, $expected ) {
36 $page = TestingAccessWrapper
::newFromObject( $this->newSpecialPage() );
37 $page->target
= $target;
38 $page->block
= new DatabaseBlock( [
39 'address' => '1.2.3.4',
40 'by' => $this->getTestSysop()->getUser(),
43 $fields = $page->getFields();
44 $this->assertIsArray( $fields );
45 foreach ( $expected as $fieldName ) {
46 $this->assertArrayHasKey( $fieldName, $fields );
50 public static function provideGetFields() {
52 'No target specified' => [
54 [ 'Target', 'Reason' ],
56 'Target is not blocked' => [
58 [ 'Target', 'Reason' ],
60 'Target is blocked' => [
62 [ 'Target', 'Reason', 'Name' ],
68 * @dataProvider provideProcessUnblockErrors
71 public function testProcessUnblockErrors( $options, $expected ) {
72 $performer = $this->getTestSysop()->getUser();
75 if ( !empty( $options['block'] ) ) {
76 $block = new DatabaseBlock( [
81 $this->getServiceContainer()->getDatabaseBlockStore()->insertBlock( $block );
84 if ( !empty( $options['readOnly'] ) ) {
85 $this->overrideConfigValue( MainConfigNames
::ReadOnly
, true );
86 $this->expectException( ReadOnlyError
::class );
89 if ( isset( $options['permissions'] ) ) {
90 $this->overrideUserPermissions( $performer, $options['permissions'] );
93 $request = new FauxRequest( [
94 'wpTarget' => $target,
97 [ $html, ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
99 $this->assertStringContainsString( $expected, $html );
102 public static function provideProcessUnblockErrors() {
104 'Target is not blocked' => [
106 'permissions' => [ 'block', 'hideuser' => true ],
110 'Wrong permissions for unhiding user' => [
113 'permissions' => [ 'block', 'hideuser' => false ],
117 'Delete block failed' => [
120 'permissions' => [ 'block', 'hideuser' ],
131 public function testProcessUnblockErrorsUnblockSelf() {
132 $performer = $this->getTestSysop()->getUser();
134 $this->overrideUserPermissions( $performer, [ 'block', 'unblockself' => false ] );
136 // Blocker must be different user for unblock self to be disallowed
137 $blocker = $this->getTestUser()->getUser();
138 $block = new DatabaseBlock( [
140 'address' => $performer,
142 $this->getServiceContainer()->getDatabaseBlockStore()->insertBlock( $block );
144 $request = new FauxRequest( [
145 'wpTarget' => $performer->getName(),
148 [ $html, ] = $this->executeSpecialPage( '', $request, 'qqx', $performer );
150 $this->assertStringContainsString( 'ipbnounblockself', $html );
156 public function testWatched() {
157 $performer = $this->getTestSysop()->getUser();
160 $block = new DatabaseBlock( [
162 'address' => $target,
164 $this->getServiceContainer()->getDatabaseBlockStore()->insertBlock( $block );
166 $request = new FauxRequest( [
167 'wpTarget' => $target,
171 $this->executeSpecialPage( '', $request, 'qqx', $performer );
173 $userPage = Title
::makeTitle( NS_USER
, $target );
174 $this->assertTrue( $this->getServiceContainer()->getWatchlistManager()
175 ->isWatched( $performer, $userPage ) );