3 use MediaWiki\HookContainer\HookContainer
;
4 use MediaWiki\MainConfigNames
;
5 use MediaWiki\Request\FauxRequest
;
6 use MediaWiki\Specials\SpecialMute
;
7 use MediaWiki\User\Options\UserOptionsManager
;
12 * @covers \MediaWiki\Specials\SpecialMute
14 class SpecialMuteTest
extends SpecialPageTestBase
{
16 /** @var UserOptionsManager */
17 private $userOptionsManager;
19 protected function setUp(): void
{
22 $this->userOptionsManager
= $this->getServiceContainer()->getUserOptionsManager();
23 $this->overrideConfigValue( MainConfigNames
::EnableUserEmailMuteList
, true );
29 protected function newSpecialPage() {
30 return new SpecialMute(
31 $this->getServiceContainer()->getCentralIdLookupFactory()->getLookup( 'local' ),
32 $this->userOptionsManager
,
33 $this->getServiceContainer()->getUserIdentityLookup(),
34 $this->getServiceContainer()->getUserIdentityUtils()
39 * @covers \MediaWiki\Specials\SpecialMute::execute
41 public function testInvalidTarget() {
42 $user = $this->getTestUser()->getUser();
43 $this->expectException( ErrorPageError
::class );
44 $this->expectExceptionMessage( "username requested could not be found" );
45 $this->executeSpecialPage(
46 'InvalidUser', null, 'qqx', $user
51 * @covers \MediaWiki\Specials\SpecialMute::execute
53 public function testEmailBlacklistNotEnabled() {
54 $this->setTemporaryHook(
55 'SpecialMuteModifyFormFields',
59 $this->overrideConfigValue( MainConfigNames
::EnableUserEmailMuteList
, false );
61 $user = $this->getTestUser()->getUser();
62 $this->expectException( ErrorPageError
::class );
63 $this->expectExceptionMessage( "Mute features are unavailable" );
64 $this->executeSpecialPage(
65 $user->getName(), null, 'qqx', $user
70 * @covers \MediaWiki\Specials\SpecialMute::execute
72 public function testUserNotLoggedIn() {
73 $this->expectException( UserNotLoggedIn
::class );
74 $this->executeSpecialPage( 'TestUser' );
77 public function testUserEmailNotConfirmed() {
78 $targetUser = $this->getTestUser()->getUser();
80 $loggedInUser = $this->getMutableTestUser()->getUser();
81 $this->userOptionsManager
->setOption( $loggedInUser, 'email-blacklist', "999" );
82 $loggedInUser->invalidateEmail();
83 $loggedInUser->saveSettings();
85 $this->expectExceptionMessage( wfMessage( 'specialmute-error-no-email-set' ) );
87 $fauxRequest = new FauxRequest( [ 'wpemail-blacklist' => true ], true );
88 $this->executeSpecialPage( $targetUser->getName(), $fauxRequest, 'qqx', $loggedInUser );
92 * @covers \MediaWiki\Specials\SpecialMute::execute
94 public function testMuteAddsUserToEmailBlacklist() {
95 $targetUser = $this->getTestUser()->getUser();
97 $loggedInUser = $this->getMutableTestUser()->getUser();
98 $this->userOptionsManager
->setOption( $loggedInUser, 'email-blacklist', "999" );
99 $loggedInUser->confirmEmail();
100 $loggedInUser->saveSettings();
102 $fauxRequest = new FauxRequest( [ 'wpemail-blacklist' => true ], true );
103 [ $html, ] = $this->executeSpecialPage(
104 $targetUser->getName(), $fauxRequest, 'qqx', $loggedInUser
107 $this->assertStringContainsString( 'specialmute-success', $html );
109 "999\n" . $targetUser->getId(),
110 $this->userOptionsManager
->getOption( $loggedInUser, 'email-blacklist' )
115 * @covers \MediaWiki\Specials\SpecialMute::execute
117 public function testUnmuteRemovesUserFromEmailBlacklist() {
118 $targetUser = $this->getTestUser()->getUser();
120 $loggedInUser = $this->getMutableTestUser()->getUser();
121 $this->userOptionsManager
->setOption( $loggedInUser, 'email-blacklist', "999\n" . $targetUser->getId() );
122 $loggedInUser->confirmEmail();
123 $loggedInUser->saveSettings();
125 $fauxRequest = new FauxRequest( [ 'wpemail-blacklist' => false ], true );
126 [ $html, ] = $this->executeSpecialPage(
127 $targetUser->getName(), $fauxRequest, 'qqx', $loggedInUser
130 $this->assertStringContainsString( 'specialmute-success', $html );
131 $this->assertSame( "999", $this->userOptionsManager
->getOption( $loggedInUser, 'email-blacklist' ) );