File: ChangePasswordTest.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 (71 lines) | stat: -rw-r--r-- 2,577 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
<?php

namespace MediaWiki\Tests\Maintenance;

use ChangePassword;
use MediaWiki\Maintenance\MaintenanceFatalError;
use MediaWiki\Password\PasswordFactory;

/**
 * @covers \ChangePassword
 * @group Database
 * @author Dreamy Jazz
 */
class ChangePasswordTest extends MaintenanceBaseTestCase {

	protected function getMaintenanceClass() {
		return ChangePassword::class;
	}

	public function testExecuteWithoutProvidedUserOrUserId() {
		$this->maintenance->setOption( 'password', 'abc' );
		$this->expectCallToFatalError();
		$this->expectOutputRegex( '/A "user" or "userid" must be set to change the password for/' );
		$this->maintenance->execute();
	}

	public function testExecuteForTooShortPassword() {
		$testUser = $this->getTestUser()->getUserIdentity();
		// Get the current password for the user, and assert later that it does not change
		$oldPasswordHash = $this->newSelectQueryBuilder()
			->select( 'user_password' )
			->from( 'user' )
			->where( [ 'user_id' => $testUser->getId() ] )
			->fetchField();
		// Use a password which is too short and common, so will fail to be set
		$this->maintenance->setOption( 'password', 'abc' );
		$this->maintenance->setOption( 'userid', $testUser->getId() );
		// Run the maintenance script in a try block, because we want to do assertions that can only be run after
		// we have called execute.
		$threwFatalError = false;
		try {
			$this->maintenance->execute();
		} catch ( MaintenanceFatalError $e ) {
			$threwFatalError = true;
		}
		$this->assertTrue( $threwFatalError );
		// Check that the password hash has not changed.
		$this->newSelectQueryBuilder()
			->select( 'user_password' )
			->from( 'user' )
			->where( [ 'user_id' => $testUser->getId() ] )
			->assertFieldValue( $oldPasswordHash );
		$this->expectOutputRegex( '/Error: Passwords must be at least.*characters/' );
	}

	public function testExecute() {
		$testUser = $this->getTestUser()->getUserIdentity();
		$newPasswordPlaintext = PasswordFactory::generateRandomPasswordString();
		$this->maintenance->setOption( 'password', $newPasswordPlaintext );
		$this->maintenance->setOption( 'userid', $testUser->getId() );
		$this->maintenance->execute();
		// Check that the password hash has not changed.
		$newPasswordHash = $this->newSelectQueryBuilder()
			->select( 'user_password' )
			->from( 'user' )
			->where( [ 'user_id' => $testUser->getId() ] )
			->fetchField();
		$password = $this->getServiceContainer()->getPasswordFactory()->newFromCiphertext( $newPasswordHash );
		$this->assertTrue( $password->verify( $newPasswordPlaintext ) );
	}
}