This is the wrong configuration format for such a feature, and the wrong interface. We already have certain per-namespace permissions in the Title class, and we didn't need to add extra formal parameters to a whole lot of User methods in order to get them. The feature should be implemented wholly in Title, and the concept of user rights should remain relatively simple and easy to understand, and independent of its many applications, i.e. a user either has a right or doesn't. Rights are just a tool for developing access policies; the complexity should be in the caller. The revert was mostly done by hand, since there were a lot of conflicts. I tried to preserve the gist of conflicting changes in r102187 and r102873. The test changes are not simple reverts, rather I just edited out the per-namespace tests. I reverted the followups r92589 and r104310.
138 lines
4 KiB
PHP
138 lines
4 KiB
PHP
<?php
|
||
|
||
define( 'NS_UNITTEST', 5600 );
|
||
define( 'NS_UNITTEST_TALK', 5601 );
|
||
|
||
/**
|
||
* @group Database
|
||
*/
|
||
class UserTest extends MediaWikiTestCase {
|
||
protected $savedGroupPermissions, $savedRevokedPermissions;
|
||
protected $user;
|
||
|
||
public function setUp() {
|
||
parent::setUp();
|
||
|
||
$this->savedGroupPermissions = $GLOBALS['wgGroupPermissions'];
|
||
$this->savedRevokedPermissions = $GLOBALS['wgRevokePermissions'];
|
||
|
||
$this->setUpPermissionGlobals();
|
||
$this->setUpUser();
|
||
}
|
||
private function setUpPermissionGlobals() {
|
||
global $wgGroupPermissions, $wgRevokePermissions;
|
||
|
||
# Data for regular $wgGroupPermissions test
|
||
$wgGroupPermissions['unittesters'] = array(
|
||
'test' => true,
|
||
'runtest' => true,
|
||
'writetest' => false,
|
||
'nukeworld' => false,
|
||
);
|
||
$wgGroupPermissions['testwriters'] = array(
|
||
'test' => true,
|
||
'writetest' => true,
|
||
'modifytest' => true,
|
||
);
|
||
# Data for regular $wgRevokePermissions test
|
||
$wgRevokePermissions['formertesters'] = array(
|
||
'runtest' => true,
|
||
);
|
||
}
|
||
private function setUpUser() {
|
||
$this->user = new User;
|
||
$this->user->addGroup( 'unittesters' );
|
||
}
|
||
|
||
public function tearDown() {
|
||
parent::tearDown();
|
||
|
||
$GLOBALS['wgGroupPermissions'] = $this->savedGroupPermissions;
|
||
$GLOBALS['wgRevokePermissions'] = $this->savedRevokedPermissions;
|
||
}
|
||
|
||
public function testGroupPermissions() {
|
||
$rights = User::getGroupPermissions( array( 'unittesters' ) );
|
||
$this->assertContains( 'runtest', $rights );
|
||
$this->assertNotContains( 'writetest', $rights );
|
||
$this->assertNotContains( 'modifytest', $rights );
|
||
$this->assertNotContains( 'nukeworld', $rights );
|
||
|
||
$rights = User::getGroupPermissions( array( 'unittesters', 'testwriters' ) );
|
||
$this->assertContains( 'runtest', $rights );
|
||
$this->assertContains( 'writetest', $rights );
|
||
$this->assertContains( 'modifytest', $rights );
|
||
$this->assertNotContains( 'nukeworld', $rights );
|
||
}
|
||
public function testRevokePermissions() {
|
||
$rights = User::getGroupPermissions( array( 'unittesters', 'formertesters' ) );
|
||
$this->assertNotContains( 'runtest', $rights );
|
||
$this->assertNotContains( 'writetest', $rights );
|
||
$this->assertNotContains( 'modifytest', $rights );
|
||
$this->assertNotContains( 'nukeworld', $rights );
|
||
}
|
||
|
||
public function testUserPermissions() {
|
||
$rights = $this->user->getRights();
|
||
$this->assertContains( 'runtest', $rights );
|
||
$this->assertNotContains( 'writetest', $rights );
|
||
$this->assertNotContains( 'modifytest', $rights );
|
||
$this->assertNotContains( 'nukeworld', $rights );
|
||
}
|
||
|
||
/**
|
||
* @dataProvider provideGetGroupsWithPermission
|
||
*/
|
||
public function testGetGroupsWithPermission( $expected, $right ) {
|
||
$result = User::getGroupsWithPermission( $right );
|
||
sort( $result );
|
||
sort( $expected );
|
||
|
||
$this->assertEquals( $expected, $result, "Groups with permission $right" );
|
||
}
|
||
public function provideGetGroupsWithPermission() {
|
||
return array(
|
||
array(
|
||
array( 'unittesters', 'testwriters' ),
|
||
'test'
|
||
),
|
||
array(
|
||
array( 'unittesters' ),
|
||
'runtest'
|
||
),
|
||
array(
|
||
array( 'testwriters' ),
|
||
'writetest'
|
||
),
|
||
array(
|
||
array( 'testwriters' ),
|
||
'modifytest'
|
||
),
|
||
);
|
||
}
|
||
|
||
/**
|
||
* @dataProvider provideUserNames
|
||
*/
|
||
public function testIsValidUserName( $username, $result, $message ) {
|
||
$this->assertEquals( $this->user->isValidUserName( $username ), $result, $message );
|
||
}
|
||
|
||
public function provideUserNames() {
|
||
return array(
|
||
array( '', false, 'Empty string' ),
|
||
array( ' ', false, 'Blank space' ),
|
||
array( 'abcd', false, 'Starts with small letter' ),
|
||
array( 'Ab/cd', false, 'Contains slash' ),
|
||
array( 'Ab cd' , true, 'Whitespace' ),
|
||
array( '192.168.1.1', false, 'IP' ),
|
||
array( 'User:Abcd', false, 'Reserved Namespace' ),
|
||
array( '12abcd232' , true , 'Starts with Numbers' ),
|
||
array( '?abcd' , true, 'Start with ? mark' ),
|
||
array( '#abcd', false, 'Start with #' ),
|
||
array( 'Abcdകഖഗഘ', true, ' Mixed scripts' ),
|
||
array( 'ജോസ്തോമസ്', false, 'ZWNJ- Format control character' ),
|
||
array( 'Ab cd', false, ' Ideographic space' ),
|
||
);
|
||
}
|
||
}
|