createMock( BlockErrorFormatter::class ); $blockErrorFormatter->method( 'getMessage' ) ->willReturn( $this->getMockMessage( 'test' ) ); $this->setService( 'BlockErrorFormatter', $blockErrorFormatter ); // Make the permission tests pass so we can check that the user is denied access because of their block. $permissionManager = $this->createMock( PermissionManager::class ); $permissionManager->method( 'userHasRight' )->willReturn( true ); $this->setService( 'PermissionManager', $permissionManager ); $special = $this->newSpecialPage(); $checkExecutePermissions = $this->getMethod( $special, 'checkExecutePermissions' ); $user = $this->getMockBuilder( User::class ) ->onlyMethods( [ 'getBlock', 'getWikiId' ] ) ->getMock(); $user->method( 'getWikiId' )->willReturn( WikiAwareEntity::LOCAL ); $block = $this->createMock( DatabaseBlock::class ); $block->method( 'isSitewide' )->willReturn( true ); $block->method( 'getTargetUserIdentity' )->willReturn( $user ); $block->method( 'getExpiry' )->willReturn( MWTimestamp::convert( TS_MW, 10 ) ); $user->method( 'getBlock' )->willReturn( $block ); $this->expectException( UserBlockedError::class ); $checkExecutePermissions( $user ); } /** * @covers \MediaWiki\SpecialPage\FormSpecialPage::checkExecutePermissions */ public function testCheckExecutePermissionsPartialBlock() { $blockErrorFormatter = $this->createMock( BlockErrorFormatter::class ); $blockErrorFormatter->method( 'getMessage' ) ->willReturn( $this->getMockMessage( 'test' ) ); $this->setService( 'BlockErrorFormatter', $blockErrorFormatter ); $readOnlyMode = $this->createMock( ReadOnlyMode::class ); $readOnlyMode->method( 'isReadOnly' )->willReturn( false ); $this->setService( 'ReadOnlyMode', $readOnlyMode ); // Make the permission tests pass so we can check that the user is denied access because of their block. $permissionManager = $this->createMock( PermissionManager::class ); $permissionManager->method( 'userHasRight' )->willReturn( true ); $this->setService( 'PermissionManager', $permissionManager ); $special = $this->newSpecialPage(); $checkExecutePermissions = $this->getMethod( $special, 'checkExecutePermissions' ); $user = $this->getMockBuilder( User::class ) ->onlyMethods( [ 'getBlock', 'getWikiId' ] ) ->getMock(); $user->method( 'getWikiId' )->willReturn( WikiAwareEntity::LOCAL ); $block = $this->createMock( DatabaseBlock::class ); $block->method( 'isSitewide' )->willReturn( false ); $block->method( 'getTargetUserIdentity' )->willReturn( $user ); $block->method( 'getExpiry' )->willReturn( MWTimestamp::convert( TS_MW, 10 ) ); $user->method( 'getBlock' )->willReturn( $block ); $this->assertNull( $checkExecutePermissions( $user ) ); } /** * Get a protected/private method. * * @param FormSpecialPage $obj * @param string $name * @return callable */ protected function getMethod( FormSpecialPage $obj, $name ) { $method = new ReflectionMethod( $obj, $name ); $method->setAccessible( true ); return $method->getClosure( $obj ); } }