wiki.techinc.nl/tests/phpunit/includes/user/UserGroupMembershipTest.php
Thiemo Kreuz e1dd371e11 Make use of PHPUnit's assertCount feature where possible
… and avoid assertEmpty() on arrays, in favor of a much more strict
assertSame( [] ).

Change-Id: I20266b0b1fc38a3a87666ba1b0793cb2b37d94a9
2020-03-02 15:58:41 +00:00

216 lines
7 KiB
PHP

<?php
use MediaWiki\MediaWikiServices;
/**
* @group Database
*/
class UserGroupMembershipTest extends MediaWikiTestCase {
protected $tablesUsed = [ 'user', 'user_groups' ];
/**
* @var User Belongs to no groups
*/
protected $userNoGroups;
/**
* @var User Belongs to the 'unittesters' group indefinitely, and the
* 'testwriters' group with expiry
*/
protected $userTester;
/**
* @var string The timestamp, in TS_MW format, of the expiry of $userTester's
* membership in the 'testwriters' group
*/
protected $expiryTime;
protected function setUp() : void {
parent::setUp();
$this->setMwGlobals( [
'wgGroupPermissions' => [
'unittesters' => [
'runtest' => true,
],
'testwriters' => [
'writetest' => true,
]
]
] );
$this->userNoGroups = new User;
$this->userNoGroups->setName( 'NoGroups' );
$this->userNoGroups->addToDatabase();
$this->userTester = new User;
$this->userTester->setName( 'Tester' );
$this->userTester->addToDatabase();
$this->userTester->addGroup( 'unittesters' );
$this->expiryTime = wfTimestamp( TS_MW, time() + 100500 );
$this->userTester->addGroup( 'testwriters', $this->expiryTime );
}
/**
* @covers UserGroupMembership::insert
* @covers UserGroupMembership::delete
*/
public function testAddAndRemoveGroups() {
$user = $this->getMutableTestUser()->getUser();
// basic tests
$ugm = new UserGroupMembership( $user->getId(), 'unittesters' );
$this->assertTrue( $ugm->insert() );
$user->clearInstanceCache();
$this->assertContains( 'unittesters', $user->getGroups() );
$this->assertArrayHasKey( 'unittesters', $user->getGroupMemberships() );
$this->assertTrue( MediaWikiServices::getInstance()
->getPermissionManager()
->userHasRight( $user, 'runtest' ) );
// try updating without allowUpdate. Should fail
$ugm = new UserGroupMembership( $user->getId(), 'unittesters', $this->expiryTime );
$this->assertFalse( $ugm->insert() );
// now try updating with allowUpdate
$this->assertTrue( $ugm->insert( 2 ) );
$user->clearInstanceCache();
$this->assertContains( 'unittesters', $user->getGroups() );
$this->assertArrayHasKey( 'unittesters', $user->getGroupMemberships() );
$this->assertTrue( MediaWikiServices::getInstance()
->getPermissionManager()
->userHasRight( $user, 'runtest' ) );
// try removing the group
$ugm->delete();
$user->clearInstanceCache();
$this->assertThat( $user->getGroups(),
$this->logicalNot( $this->contains( 'unittesters' ) ) );
$this->assertThat( $user->getGroupMemberships(),
$this->logicalNot( $this->arrayHasKey( 'unittesters' ) ) );
$this->assertFalse( MediaWikiServices::getInstance()
->getPermissionManager()
->userHasRight( $user, 'runtest' ) );
// check that the user group is now in user_former_groups
$this->assertContains( 'unittesters', $user->getFormerGroups() );
}
private function addUserTesterToExpiredGroup() {
// put $userTester in a group with expiry in the past
$ugm = new UserGroupMembership( $this->userTester->getId(), 'sysop', '20010102030405' );
$ugm->insert();
}
/**
* @covers UserGroupMembership::getMembershipsForUser
*/
public function testGetMembershipsForUser() {
$this->addUserTesterToExpiredGroup();
// check that the user in no groups has no group memberships
$ugms = UserGroupMembership::getMembershipsForUser( $this->userNoGroups->getId() );
$this->assertSame( [], $ugms );
// check that the user in 2 groups has 2 group memberships
$testerUserId = $this->userTester->getId();
$ugms = UserGroupMembership::getMembershipsForUser( $testerUserId );
$this->assertCount( 2, $ugms );
// check that the required group memberships are present on $userTester,
// with the correct user IDs and expiries
$expectedGroups = [ 'unittesters', 'testwriters' ];
foreach ( $expectedGroups as $group ) {
$this->assertArrayHasKey( $group, $ugms );
$this->assertEquals( $ugms[$group]->getUserId(), $testerUserId );
$this->assertEquals( $ugms[$group]->getGroup(), $group );
if ( $group === 'unittesters' ) {
$this->assertNull( $ugms[$group]->getExpiry() );
} elseif ( $group === 'testwriters' ) {
$this->assertEquals( $ugms[$group]->getExpiry(), $this->expiryTime );
}
}
}
/**
* @covers UserGroupMembership::getMembership
*/
public function testGetMembership() {
$this->addUserTesterToExpiredGroup();
// groups that the user doesn't belong to shouldn't be returned
$ugm = UserGroupMembership::getMembership( $this->userNoGroups->getId(), 'sysop' );
$this->assertFalse( $ugm );
// implicit groups shouldn't be returned
$ugm = UserGroupMembership::getMembership( $this->userNoGroups->getId(), 'user' );
$this->assertFalse( $ugm );
// expired groups shouldn't be returned
$ugm = UserGroupMembership::getMembership( $this->userTester->getId(), 'sysop' );
$this->assertFalse( $ugm );
// groups that the user does belong to should be returned with correct properties
$ugm = UserGroupMembership::getMembership( $this->userTester->getId(), 'unittesters' );
$this->assertInstanceOf( UserGroupMembership::class, $ugm );
$this->assertEquals( $ugm->getUserId(), $this->userTester->getId() );
$this->assertEquals( $ugm->getGroup(), 'unittesters' );
$this->assertNull( $ugm->getExpiry() );
}
/**
* @covers UserGroupMembership::getLink
*/
public function testGetLink() {
$this->setMwGlobals( [
'wgMetaNamespace' => 'Project',
'wgScriptPath' => '/w',
'wgScript' => '/w/index.php'
] );
$user = $this->getMutableTestUser()->getUser();
$ugm = new UserGroupMembership( $user->getId(), 'unittesters' );
/** @var IContextSource $context */
$context = $this->getMockBuilder( ContextSource::class )
->disableOriginalConstructor()
->getMock();
$this->assertSame(
'unittesters',
UserGroupMembership::getLink( $ugm, $context, 'wiki' )
);
$this->assertSame(
'unittesters',
UserGroupMembership::getLink( $ugm, $context, 'html' )
);
$this->assertSame(
'unittesters',
UserGroupMembership::getLink( $ugm, $context, 'html', $user->getName() )
);
$this->assertSame(
'unittesters',
UserGroupMembership::getLink( $ugm, $context, 'wiki', $user->getName() )
);
$ugm = new UserGroupMembership( $user->getId(), 'sysop' );
$this->assertSame(
'[[Project:Administrators|Administrators]]',
UserGroupMembership::getLink( $ugm, $context, 'wiki' )
);
$this->assertSame(
'<a href="/w/index.php?title=Project:Administrators&amp;action=edit&amp;' .
'redlink=1" class="new" title="Project:Administrators (page does not exist)">' .
'Administrators</a>',
UserGroupMembership::getLink( $ugm, $context, 'html' )
);
$this->assertSame(
'[[Project:Administrators|administrator]]',
UserGroupMembership::getLink( $ugm, $context, 'wiki', $user->getName() )
);
$this->assertSame(
'<a href="/w/index.php?title=Project:Administrators&amp;action=edit&amp;' .
'redlink=1" class="new" title="Project:Administrators (page does not exist)">' .
'administrator</a>',
UserGroupMembership::getLink( $ugm, $context, 'html', $user->getName() )
);
}
}