1<?php 2 3use MediaWiki\User\UserOptionsManager; 4 5/** 6 * @group SpecialPage 7 * @covers SpecialMute 8 */ 9class SpecialMuteTest extends SpecialPageTestBase { 10 11 /** @var UserOptionsManager */ 12 private $userOptionsManager; 13 14 protected function setUp(): void { 15 parent::setUp(); 16 17 $this->userOptionsManager = $this->getServiceContainer()->getUserOptionsManager(); 18 $this->setMwGlobals( [ 19 'wgEnableUserEmailMuteList' => true 20 ] ); 21 } 22 23 /** 24 * @inheritDoc 25 */ 26 protected function newSpecialPage() { 27 return new SpecialMute( 28 $this->getServiceContainer()->getCentralIdLookupFactory()->getLookup( 'local' ), 29 $this->userOptionsManager, 30 $this->getServiceContainer()->getUserIdentityLookup() 31 ); 32 } 33 34 /** 35 * @covers SpecialMute::execute 36 */ 37 public function testInvalidTarget() { 38 $user = $this->getTestUser()->getUser(); 39 $this->expectException( ErrorPageError::class ); 40 $this->expectExceptionMessage( "username requested could not be found" ); 41 $this->executeSpecialPage( 42 'InvalidUser', null, 'qqx', $user 43 ); 44 } 45 46 /** 47 * @covers SpecialMute::execute 48 */ 49 public function testEmailBlacklistNotEnabled() { 50 $this->setTemporaryHook( 51 'SpecialMuteModifyFormFields', 52 null 53 ); 54 55 $this->setMwGlobals( [ 56 'wgEnableUserEmailMuteList' => false 57 ] ); 58 59 $user = $this->getTestUser()->getUser(); 60 $this->expectException( ErrorPageError::class ); 61 $this->expectExceptionMessage( "Mute features are unavailable" ); 62 $this->executeSpecialPage( 63 $user->getName(), null, 'qqx', $user 64 ); 65 } 66 67 /** 68 * @covers SpecialMute::execute 69 */ 70 public function testUserNotLoggedIn() { 71 $this->expectException( UserNotLoggedIn::class ); 72 $this->executeSpecialPage( 'TestUser' ); 73 } 74 75 /** 76 * @covers SpecialMute::execute 77 */ 78 public function testMuteAddsUserToEmailBlacklist() { 79 $targetUser = $this->getTestUser()->getUser(); 80 81 $loggedInUser = $this->getMutableTestUser()->getUser(); 82 $this->userOptionsManager->setOption( $loggedInUser, 'email-blacklist', "999" ); 83 $loggedInUser->confirmEmail(); 84 $loggedInUser->saveSettings(); 85 86 $fauxRequest = new FauxRequest( [ 'wpemail-blacklist' => true ], true ); 87 list( $html, ) = $this->executeSpecialPage( 88 $targetUser->getName(), $fauxRequest, 'qqx', $loggedInUser 89 ); 90 91 $this->assertStringContainsString( 'specialmute-success', $html ); 92 $this->assertEquals( 93 "999\n" . $targetUser->getId(), 94 $this->userOptionsManager->getOption( $loggedInUser, 'email-blacklist' ) 95 ); 96 } 97 98 /** 99 * @covers SpecialMute::execute 100 */ 101 public function testUnmuteRemovesUserFromEmailBlacklist() { 102 $targetUser = $this->getTestUser()->getUser(); 103 104 $loggedInUser = $this->getMutableTestUser()->getUser(); 105 $this->userOptionsManager->setOption( $loggedInUser, 'email-blacklist', "999\n" . $targetUser->getId() ); 106 $loggedInUser->confirmEmail(); 107 $loggedInUser->saveSettings(); 108 109 $fauxRequest = new FauxRequest( [ 'wpemail-blacklist' => false ], true ); 110 list( $html, ) = $this->executeSpecialPage( 111 $targetUser->getName(), $fauxRequest, 'qqx', $loggedInUser 112 ); 113 114 $this->assertStringContainsString( 'specialmute-success', $html ); 115 $this->assertSame( "999", $this->userOptionsManager->getOption( $loggedInUser, 'email-blacklist' ) ); 116 } 117} 118