The unit tests spend nearly half of their run time resetting the user table for each test. But the majority of tests do not depend on the user table having the exact value that the setup code resets it to, and do not need to modify the user objects they require to run. Fix that by providing an API for tests to get User objects, and to indicate whether the User object will be subject to destructive modification or not. This allows User objects to be reused across multiple unit tests. Change-Id: I17ef1f519759c5e7796c259282afe730ef722e96
156 lines
4.4 KiB
PHP
156 lines
4.4 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @covers LocalIdLookup
|
|
* @group Database
|
|
*/
|
|
class LocalIdLookupTest extends MediaWikiTestCase {
|
|
private $localUsers = [];
|
|
|
|
protected function setUp() {
|
|
global $wgGroupPermissions;
|
|
|
|
parent::setUp();
|
|
|
|
$this->stashMwGlobals( [ 'wgGroupPermissions' ] );
|
|
$wgGroupPermissions['local-id-lookup-test']['hideuser'] = true;
|
|
}
|
|
|
|
public function addDBData() {
|
|
for ( $i = 1; $i <= 4; $i++ ) {
|
|
$this->localUsers[] = $this->getMutableTestUser()->getUser();
|
|
}
|
|
|
|
$sysop = static::getTestSysop()->getUser();
|
|
|
|
$block = new Block( [
|
|
'address' => $this->localUsers[2]->getName(),
|
|
'by' => $sysop->getId(),
|
|
'reason' => __METHOD__,
|
|
'expiry' => '1 day',
|
|
'hideName' => false,
|
|
] );
|
|
$block->insert();
|
|
|
|
$block = new Block( [
|
|
'address' => $this->localUsers[3]->getName(),
|
|
'by' => $sysop->getId(),
|
|
'reason' => __METHOD__,
|
|
'expiry' => '1 day',
|
|
'hideName' => true,
|
|
] );
|
|
$block->insert();
|
|
}
|
|
|
|
public function getLookupUser() {
|
|
return static::getTestUser( [ 'local-id-lookup-test' ] )->getUser();
|
|
}
|
|
|
|
public function testLookupCentralIds() {
|
|
$lookup = new LocalIdLookup();
|
|
|
|
$user1 = $this->getLookupUser();
|
|
$user2 = User::newFromName( 'UTLocalIdLookup2' );
|
|
|
|
$this->assertTrue( $user1->isAllowed( 'hideuser' ), 'sanity check' );
|
|
$this->assertFalse( $user2->isAllowed( 'hideuser' ), 'sanity check' );
|
|
|
|
$this->assertSame( [], $lookup->lookupCentralIds( [] ) );
|
|
|
|
$expect = [];
|
|
foreach ( $this->localUsers as $localUser ) {
|
|
$expect[$localUser->getId()] = $localUser->getName();
|
|
}
|
|
$expect[12345] = 'X';
|
|
ksort( $expect );
|
|
|
|
$expect2 = $expect;
|
|
$expect2[$this->localUsers[3]->getId()] = '';
|
|
|
|
$arg = array_fill_keys( array_keys( $expect ), 'X' );
|
|
|
|
$this->assertSame( $expect2, $lookup->lookupCentralIds( $arg ) );
|
|
$this->assertSame( $expect, $lookup->lookupCentralIds( $arg, CentralIdLookup::AUDIENCE_RAW ) );
|
|
$this->assertSame( $expect, $lookup->lookupCentralIds( $arg, $user1 ) );
|
|
$this->assertSame( $expect2, $lookup->lookupCentralIds( $arg, $user2 ) );
|
|
}
|
|
|
|
public function testLookupUserNames() {
|
|
$lookup = new LocalIdLookup();
|
|
$user1 = $this->getLookupUser();
|
|
$user2 = User::newFromName( 'UTLocalIdLookup2' );
|
|
|
|
$this->assertTrue( $user1->isAllowed( 'hideuser' ), 'sanity check' );
|
|
$this->assertFalse( $user2->isAllowed( 'hideuser' ), 'sanity check' );
|
|
|
|
$this->assertSame( [], $lookup->lookupUserNames( [] ) );
|
|
|
|
$expect = [];
|
|
foreach ( $this->localUsers as $localUser ) {
|
|
$expect[$localUser->getName()] = $localUser->getId();
|
|
}
|
|
$expect['UTDoesNotExist'] = 'X';
|
|
ksort( $expect );
|
|
|
|
$expect2 = $expect;
|
|
$expect2[$this->localUsers[3]->getName()] = 'X';
|
|
|
|
$arg = array_fill_keys( array_keys( $expect ), 'X' );
|
|
|
|
$this->assertSame( $expect2, $lookup->lookupUserNames( $arg ) );
|
|
$this->assertSame( $expect, $lookup->lookupUserNames( $arg, CentralIdLookup::AUDIENCE_RAW ) );
|
|
$this->assertSame( $expect, $lookup->lookupUserNames( $arg, $user1 ) );
|
|
$this->assertSame( $expect2, $lookup->lookupUserNames( $arg, $user2 ) );
|
|
}
|
|
|
|
public function testIsAttached() {
|
|
$lookup = new LocalIdLookup();
|
|
$user1 = $this->getLookupUser();
|
|
$user2 = User::newFromName( 'DoesNotExist' );
|
|
|
|
$this->assertTrue( $lookup->isAttached( $user1 ) );
|
|
$this->assertFalse( $lookup->isAttached( $user2 ) );
|
|
|
|
$wiki = wfWikiID();
|
|
$this->assertTrue( $lookup->isAttached( $user1, $wiki ) );
|
|
$this->assertFalse( $lookup->isAttached( $user2, $wiki ) );
|
|
|
|
$wiki = 'not-' . wfWikiID();
|
|
$this->assertFalse( $lookup->isAttached( $user1, $wiki ) );
|
|
$this->assertFalse( $lookup->isAttached( $user2, $wiki ) );
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideIsAttachedShared
|
|
* @param bool $sharedDB $wgSharedDB is set
|
|
* @param bool $sharedTable $wgSharedTables contains 'user'
|
|
* @param bool $localDBSet $wgLocalDatabases contains the shared DB
|
|
*/
|
|
public function testIsAttachedShared( $sharedDB, $sharedTable, $localDBSet ) {
|
|
global $wgDBName;
|
|
$this->setMwGlobals( [
|
|
'wgSharedDB' => $sharedDB ? $wgDBName : null,
|
|
'wgSharedTables' => $sharedTable ? [ 'user' ] : [],
|
|
'wgLocalDatabases' => $localDBSet ? [ 'shared' ] : [],
|
|
] );
|
|
|
|
$lookup = new LocalIdLookup();
|
|
$this->assertSame(
|
|
$sharedDB && $sharedTable && $localDBSet,
|
|
$lookup->isAttached( $this->getLookupUser(), 'shared' )
|
|
);
|
|
}
|
|
|
|
public static function provideIsAttachedShared() {
|
|
$ret = [];
|
|
for ( $i = 0; $i < 7; $i++ ) {
|
|
$ret[] = [
|
|
(bool)( $i & 1 ),
|
|
(bool)( $i & 2 ),
|
|
(bool)( $i & 4 ),
|
|
];
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
}
|