]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - tests/phpunit/includes/TestUserRegistry.php
MediaWiki 1.30.2-scripts
[autoinstallsdev/mediawiki.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 }