Release notes for Iabf4873f
[mediawiki.git] / tests / phpunit / includes / UserTest.php
blobff33e825ee31befa789eb2a0f47b4378887e64ff
1 <?php
3 define( 'NS_UNITTEST', 5600 );
4 define( 'NS_UNITTEST_TALK', 5601 );
6 /**
7 * @group Database
8 */
9 class UserTest extends MediaWikiTestCase {
10 /**
11 * @var User
13 protected $user;
15 protected function setUp() {
16 parent::setUp();
18 $this->setMwGlobals( array(
19 'wgGroupPermissions' => array(),
20 'wgRevokePermissions' => array(),
21 ) );
23 $this->setUpPermissionGlobals();
25 $this->user = new User;
26 $this->user->addGroup( 'unittesters' );
29 private function setUpPermissionGlobals() {
30 global $wgGroupPermissions, $wgRevokePermissions;
32 # Data for regular $wgGroupPermissions test
33 $wgGroupPermissions['unittesters'] = array(
34 'test' => true,
35 'runtest' => true,
36 'writetest' => false,
37 'nukeworld' => false,
39 $wgGroupPermissions['testwriters'] = array(
40 'test' => true,
41 'writetest' => true,
42 'modifytest' => true,
45 # Data for regular $wgRevokePermissions test
46 $wgRevokePermissions['formertesters'] = array(
47 'runtest' => true,
50 # For the options test
51 $wgGroupPermissions['*'] = array(
52 'editmyoptions' => true,
56 /**
57 * @covers User::getGroupPermissions
59 public function testGroupPermissions() {
60 $rights = User::getGroupPermissions( array( 'unittesters' ) );
61 $this->assertContains( 'runtest', $rights );
62 $this->assertNotContains( 'writetest', $rights );
63 $this->assertNotContains( 'modifytest', $rights );
64 $this->assertNotContains( 'nukeworld', $rights );
66 $rights = User::getGroupPermissions( array( 'unittesters', 'testwriters' ) );
67 $this->assertContains( 'runtest', $rights );
68 $this->assertContains( 'writetest', $rights );
69 $this->assertContains( 'modifytest', $rights );
70 $this->assertNotContains( 'nukeworld', $rights );
73 /**
74 * @covers User::getGroupPermissions
76 public function testRevokePermissions() {
77 $rights = User::getGroupPermissions( array( 'unittesters', 'formertesters' ) );
78 $this->assertNotContains( 'runtest', $rights );
79 $this->assertNotContains( 'writetest', $rights );
80 $this->assertNotContains( 'modifytest', $rights );
81 $this->assertNotContains( 'nukeworld', $rights );
84 /**
85 * @covers User::getRights
87 public function testUserPermissions() {
88 $rights = $this->user->getRights();
89 $this->assertContains( 'runtest', $rights );
90 $this->assertNotContains( 'writetest', $rights );
91 $this->assertNotContains( 'modifytest', $rights );
92 $this->assertNotContains( 'nukeworld', $rights );
95 /**
96 * @dataProvider provideGetGroupsWithPermission
97 * @covers User::getGroupsWithPermission
99 public function testGetGroupsWithPermission( $expected, $right ) {
100 $result = User::getGroupsWithPermission( $right );
101 sort( $result );
102 sort( $expected );
104 $this->assertEquals( $expected, $result, "Groups with permission $right" );
107 public static function provideGetGroupsWithPermission() {
108 return array(
109 array(
110 array( 'unittesters', 'testwriters' ),
111 'test'
113 array(
114 array( 'unittesters' ),
115 'runtest'
117 array(
118 array( 'testwriters' ),
119 'writetest'
121 array(
122 array( 'testwriters' ),
123 'modifytest'
129 * @dataProvider provideUserNames
130 * @covers User::isValidUserName
132 public function testIsValidUserName( $username, $result, $message ) {
133 $this->assertEquals( $this->user->isValidUserName( $username ), $result, $message );
136 public static function provideUserNames() {
137 return array(
138 array( '', false, 'Empty string' ),
139 array( ' ', false, 'Blank space' ),
140 array( 'abcd', false, 'Starts with small letter' ),
141 array( 'Ab/cd', false, 'Contains slash' ),
142 array( 'Ab cd', true, 'Whitespace' ),
143 array( '192.168.1.1', false, 'IP' ),
144 array( 'User:Abcd', false, 'Reserved Namespace' ),
145 array( '12abcd232', true, 'Starts with Numbers' ),
146 array( '?abcd', true, 'Start with ? mark' ),
147 array( '#abcd', false, 'Start with #' ),
148 array( 'Abcdകഖഗഘ', true, ' Mixed scripts' ),
149 array( 'ജോസ്‌തോമസ്', false, 'ZWNJ- Format control character' ),
150 array( 'Ab cd', false, ' Ideographic space' ),
155 * Test, if for all rights a right- message exist,
156 * which is used on Special:ListGroupRights as help text
157 * Extensions and core
159 public function testAllRightsWithMessage() {
160 //Getting all user rights, for core: User::$mCoreRights, for extensions: $wgAvailableRights
161 $allRights = User::getAllRights();
162 $allMessageKeys = Language::getMessageKeysFor( 'en' );
164 $rightsWithMessage = array();
165 foreach ( $allMessageKeys as $message ) {
166 // === 0: must be at beginning of string (position 0)
167 if ( strpos( $message, 'right-' ) === 0 ) {
168 $rightsWithMessage[] = substr( $message, strlen( 'right-' ) );
172 sort( $allRights );
173 sort( $rightsWithMessage );
175 $this->assertEquals(
176 $allRights,
177 $rightsWithMessage,
178 'Each user rights (core/extensions) has a corresponding right- message.'
183 * Test User::editCount
184 * @group medium
185 * @covers User::getEditCount
187 public function testEditCount() {
188 $user = User::newFromName( 'UnitTestUser' );
189 $user->loadDefaults();
190 $user->addToDatabase();
192 // let the user have a few (3) edits
193 $page = WikiPage::factory( Title::newFromText( 'Help:UserTest_EditCount' ) );
194 for ( $i = 0; $i < 3; $i++ ) {
195 $page->doEdit( (string)$i, 'test', 0, false, $user );
198 $user->clearInstanceCache();
199 $this->assertEquals( 3, $user->getEditCount(), 'After three edits, the user edit count should be 3' );
201 // increase the edit count and clear the cache
202 $user->incEditCount();
204 $user->clearInstanceCache();
205 $this->assertEquals( 4, $user->getEditCount(), 'After increasing the edit count manually, the user edit count should be 4' );
209 * Test changing user options.
210 * @covers User::setOption
211 * @covers User::getOption
213 public function testOptions() {
214 $user = User::newFromName( 'UnitTestUser' );
215 $user->addToDatabase();
217 $user->setOption( 'someoption', 'test' );
218 $user->setOption( 'cols', 200 );
219 $user->saveSettings();
221 $user = User::newFromName( 'UnitTestUser' );
222 $this->assertEquals( 'test', $user->getOption( 'someoption' ) );
223 $this->assertEquals( 200, $user->getOption( 'cols' ) );
227 * Bug 37963
228 * Make sure defaults are loaded when setOption is called.
229 * @covers User::loadOptions
231 public function testAnonOptions() {
232 global $wgDefaultUserOptions;
233 $this->user->setOption( 'someoption', 'test' );
234 $this->assertEquals( $wgDefaultUserOptions['cols'], $this->user->getOption( 'cols' ) );
235 $this->assertEquals( 'test', $this->user->getOption( 'someoption' ) );