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