File: ResetUserEmailTest.php

package info (click to toggle)
mediawiki 1%3A1.43.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 417,464 kB
  • sloc: php: 1,062,949; javascript: 664,290; sql: 9,714; python: 5,458; xml: 3,489; sh: 1,131; makefile: 64
file content (137 lines) | stat: -rw-r--r-- 5,384 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php

use MediaWiki\MainConfigNames;
use MediaWiki\Tests\Maintenance\MaintenanceBaseTestCase;
use Wikimedia\Timestamp\ConvertibleTimestamp;

/**
 * @covers \ResetUserEmail
 * @group Database
 * @author Dreamy Jazz
 */
class ResetUserEmailTest extends MaintenanceBaseTestCase {
	public function getMaintenanceClass() {
		return ResetUserEmail::class;
	}

	private function commonTestEmailReset( $userArg, $options, $userName, $oldEmail ) {
		ConvertibleTimestamp::setFakeTime( '20240506070809' );
		// Execute the maintenance script
		$this->maintenance->loadWithArgv( [ $userArg, 'new@mediawiki.test' ] );
		foreach ( $options as $name => $value ) {
			$this->maintenance->setOption( $name, $value );
		}
		$this->maintenance->execute();

		// Check that the email address was changed and invalidated
		$userFactory = $this->getServiceContainer()->getUserFactory();
		$testUserAfterExecution = $userFactory->newFromName( $userName );
		$this->assertNotEquals( $oldEmail, $testUserAfterExecution->getEmail() );
		$this->assertSame( 'new@mediawiki.test', $testUserAfterExecution->getEmail() );
		$this->assertSame(
			'20240506070809',
			$testUserAfterExecution->getEmailAuthenticationTimestamp()
		);

		// Check that the script returns the right output
		$this->expectOutputRegex( '/Done!/' );
	}

	public function testEmailResetWithNoPasswordResetWhenProvidingName() {
		// Target an existing user with an email attached
		$testUserBeforeExecution = $this->getTestSysop()->getUser();
		$oldEmail = $testUserBeforeExecution->getEmail();
		$this->assertNotNull( $oldEmail );
		// Test providing the maintenance script with a username.
		$this->commonTestEmailReset(
			$testUserBeforeExecution->getName(), [ 'no-reset-password' => 1 ], $testUserBeforeExecution->getName(),
			$oldEmail
		);
	}

	public function testEmailResetWithNoPasswordResetWhenProvidingId() {
		// Target an existing user with an email attached
		$testUserBeforeExecution = $this->getTestSysop()->getUser();
		$oldEmail = $testUserBeforeExecution->getEmail();
		$this->assertNotNull( $oldEmail );
		$passwordHashBeforeExecution = $this->newSelectQueryBuilder()
			->select( 'user_password' )
			->from( 'user' )
			->where( [ 'user_id' => $testUserBeforeExecution->getId() ] )
			->fetchField();
		// Test providing the maintenance script with a user ID.
		$this->commonTestEmailReset(
			"#" . $testUserBeforeExecution->getId(), [ 'no-reset-password' => 1 ],
			$testUserBeforeExecution->getName(), $oldEmail
		);
		// Check that the password hash for the user has not changed
		$passwordAfterExecution = $this->newSelectQueryBuilder()
			->select( 'user_password' )
			->from( 'user' )
			->where( [ 'user_id' => $testUserBeforeExecution->getId() ] )
			->fetchField();
		$this->assertSame( $passwordHashBeforeExecution, $passwordAfterExecution );
	}

	public function testEmailReset() {
		// Target an existing user with an email attached
		$testUserBeforeExecution = $this->getTestSysop()->getUser();
		$oldEmail = $testUserBeforeExecution->getEmail();
		$this->assertNotNull( $oldEmail );
		$passwordHashBeforeExecution = $this->newSelectQueryBuilder()
			->select( 'user_password' )
			->from( 'user' )
			->where( [ 'user_id' => $testUserBeforeExecution->getId() ] )
			->fetchField();
		// Test providing the maintenance script with a user ID.
		$this->commonTestEmailReset(
			"#" . $testUserBeforeExecution->getId(), [],
			$testUserBeforeExecution->getName(), $oldEmail
		);
		// Check that the password hash for the user has changed
		$passwordAfterExecution = $this->newSelectQueryBuilder()
			->select( 'user_password' )
			->from( 'user' )
			->where( [ 'user_id' => $testUserBeforeExecution->getId() ] )
			->fetchField();
		$this->assertNotSame( $passwordHashBeforeExecution, $passwordAfterExecution );
	}

	public function testEmailResetWithNoPasswordResetAndEmailPasswordOnFailure() {
		$this->overrideConfigValue( MainConfigNames::EnableEmail, true );
		// Abort all password reset submissions for the test
		$this->setTemporaryHook( 'SpecialPasswordResetOnSubmit', static function ( $users, $data, &$error ) {
			$error = 'test';
			return false;
		} );
		// Target an existing user with an email attached
		$testUserBeforeExecution = $this->getTestSysop()->getUser();
		$oldEmail = $testUserBeforeExecution->getEmail();
		$this->assertNotNull( $oldEmail );
		// Test providing the maintenance script with a username.
		$this->commonTestEmailReset(
			$testUserBeforeExecution->getName(), [ 'no-reset-password' => 1, 'email-password' => 1 ],
			$testUserBeforeExecution->getName(),
			$oldEmail
		);
		$this->expectOutputRegex( "/Email couldn't be sent because[\s\S]*Done/" );
	}

	public function testEmailResetOnInvalidNewEmail() {
		$this->expectCallToFatalError();
		$this->expectOutputRegex( "/testemail.*is not valid/" );
		// Execute the maintenance script
		$this->maintenance->setArg( 0, $this->getTestUser()->getUserIdentity()->getName() );
		$this->maintenance->setArg( 1, 'testemail' );
		$this->maintenance->execute();
	}

	public function testEmailResetOnInvalidUsername() {
		$this->expectCallToFatalError();
		$this->expectOutputRegex( "/Non-existent-test-user.*does not exist/" );
		// Execute the maintenance script
		$this->maintenance->setArg( 0, 'Non-existent-test-user' );
		$this->maintenance->setArg( 1, 'new@mediawiki.test' );
		$this->maintenance->execute();
	}
}