Skin: Make skins aware of their registered skin name
[lhc/web/wiklou.git] / tests / phpunit / includes / TestUserRegistry.php
1 <?php
2
3 /**
4 * @since 1.28
5 */
6 class TestUserRegistry {
7
8 /** @var TestUser[] (group key => TestUser) */
9 private static $testUsers = [];
10
11 /** @var int Count of users that have been generated */
12 private static $counter = 0;
13
14 /** @var int Random int, included in IDs */
15 private static $randInt;
16
17 public static function getNextId() {
18 if ( !self::$randInt ) {
19 self::$randInt = mt_rand( 1, 0xFFFFFF );
20 }
21 return sprintf( '%06x.%03x', self::$randInt, ++self::$counter );
22 }
23
24 /**
25 * Get a TestUser object that the caller may modify.
26 *
27 * @since 1.28
28 *
29 * @param string $testName Caller's __CLASS__. Used to generate the
30 * user's username.
31 * @param string[] $groups Groups the test user should be added to.
32 * @return TestUser
33 */
34 public static function getMutableTestUser( $testName, $groups = [] ) {
35 $id = self::getNextId();
36 $password = wfRandomString( 20 );
37 $testUser = new TestUser(
38 "TestUser $testName $id", // username
39 "Name $id", // real name
40 "$id@mediawiki.test", // e-mail
41 $groups, // groups
42 $password // password
43 );
44 $testUser->getUser()->clearInstanceCache();
45 return $testUser;
46 }
47
48 /**
49 * Get a TestUser object that the caller may not modify.
50 *
51 * Whenever possible, unit tests should use immutable users, because
52 * immutable users can be reused in multiple tests, which helps keep
53 * the unit tests fast.
54 *
55 * @since 1.28
56 *
57 * @param string[] $groups Groups the test user should be added to.
58 * @return TestUser
59 */
60 public static function getImmutableTestUser( $groups = [] ) {
61 $groups = array_unique( $groups );
62 sort( $groups );
63 $key = implode( ',', $groups );
64
65 $testUser = isset( self::$testUsers[$key] )
66 ? self::$testUsers[$key]
67 : false;
68
69 if ( !$testUser || !$testUser->getUser()->isLoggedIn() ) {
70 $id = self::getNextId();
71 // Hack! If this is the primary sysop account, make the username
72 // be 'UTSysop', for back-compat, and for the sake of PHPUnit data
73 // provider methods, which are executed before the test database
74 // is set up. See T136348.
75 if ( $groups === [ 'bureaucrat', 'sysop' ] ) {
76 $username = 'UTSysop';
77 $password = 'UTSysopPassword';
78 } else {
79 $username = "TestUser $id";
80 $password = wfRandomString( 20 );
81 }
82 self::$testUsers[$key] = $testUser = new TestUser(
83 $username, // username
84 "Name $id", // real name
85 "$id@mediawiki.test", // e-mail
86 $groups, // groups
87 $password // password
88 );
89 }
90
91 $testUser->getUser()->clearInstanceCache();
92 return self::$testUsers[$key];
93 }
94
95 /**
96 * Clear the registry.
97 *
98 * TestUsers created by this class will not be deleted, but any handles
99 * to existing immutable TestUsers will be deleted, ensuring these users
100 * are not reused. We don't reset the counter or random string by design.
101 *
102 * @since 1.28
103 *
104 * @param string[] $groups Groups the test user should be added to.
105 * @return TestUser
106 */
107 public static function clear() {
108 self::$testUsers = [];
109 }
110 }