wiki.techinc.nl/tests/phpunit/unit/includes/user/CentralId/CentralIdLookupTest.php
DannyS712 6e46d72309 Make CentralIdLookupTest a unit test
Mock the UserIdentityLookup (might be worth adding
to DummyServicesTrait soon) and pass UserIdentityValue
instead of full User objects.

The tests for the factory methods are removed, those
just wrap around CentralIdLookupFactory which has
its own tests already.

Change-Id: Ieea548aae46e3dd5a71518e7381dd40ce19c94ec
2021-07-26 20:52:14 +00:00

193 lines
5.8 KiB
PHP

<?php
namespace MediaWiki\Tests\User\CentralId;
use CentralIdLookup;
use InvalidArgumentException;
use LogicException;
use MediaWiki\Permissions\Authority;
use MediaWiki\Tests\Unit\Permissions\MockAuthorityTrait;
use MediaWiki\User\UserIdentity;
use MediaWiki\User\UserIdentityLookup;
use MediaWiki\User\UserIdentityValue;
use MediaWikiUnitTestCase;
use User;
use Wikimedia\TestingAccessWrapper;
/**
* @covers CentralIdLookup
*/
class CentralIdLookupTest extends MediaWikiUnitTestCase {
use MockAuthorityTrait;
public function testGetProviderId() {
$mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->init( 'this is a test', $this->createNoOpMock( UserIdentityLookup::class ) );
$this->assertSame( 'this is a test', $mock->getProviderId() );
}
public function testRepeatingInitThrows() {
$mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->init( 'foo', $this->createNoOpMock( UserIdentityLookup::class ) );
$this->expectException( LogicException::class );
$mock->init( 'bar', $this->createNoOpMock( UserIdentityLookup::class ) );
}
public function testCheckAudience() {
$mock = TestingAccessWrapper::newFromObject(
$this->getMockForAbstractClass( CentralIdLookup::class )
);
$authority = $this->mockAnonUltimateAuthority();
$this->assertSame( $authority, $mock->checkAudience( $authority ) );
$authority = $mock->checkAudience( CentralIdLookup::AUDIENCE_PUBLIC );
$this->assertInstanceOf( Authority::class, $authority );
// Should be an empty User object, don't trigger loading that requires integration
// if a user is created from "defaults" then its an anonymous default user
$this->assertInstanceOf( User::class, $authority );
$this->assertSame( 'defaults', $authority->mFrom );
$this->assertNull( $mock->checkAudience( CentralIdLookup::AUDIENCE_RAW ) );
try {
$mock->checkAudience( 100 );
$this->fail( 'Expected exception not thrown' );
} catch ( InvalidArgumentException $ex ) {
$this->assertSame( 'Invalid audience', $ex->getMessage() );
}
}
public function testNameFromCentralId() {
$mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->expects( $this->once() )->method( 'lookupCentralIds' )
->with(
[ 15 => null ],
CentralIdLookup::AUDIENCE_RAW,
CentralIdLookup::READ_LATEST
)
->willReturn( [ 15 => 'FooBar' ] );
$this->assertSame(
'FooBar',
$mock->nameFromCentralId( 15, CentralIdLookup::AUDIENCE_RAW, CentralIdLookup::READ_LATEST )
);
}
/**
* @dataProvider provideLocalUserFromCentralId
* @param string $name
* @param bool $succeeds
*/
public function testLocalUserFromCentralId( $name, $succeeds ) {
// UserIdentityLookup expects to be asked for a UserIdentity with the
// name $name, and will return one only if its for UTSysop, no other
// users are registered
$lookupResult = ( $name === 'UTSysop' ? ( new UserIdentityValue( 5, $name ) ) : null );
$userIdentityLookup = $this->createMock( UserIdentityLookup::class );
$userIdentityLookup->method( 'getUserIdentityByName' )
->with( $name )
->willReturn( $lookupResult );
$mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->method( 'isAttached' )
->willReturn( true );
$mock->expects( $this->once() )->method( 'lookupCentralIds' )
->with(
[ 42 => null ],
CentralIdLookup::AUDIENCE_RAW,
CentralIdLookup::READ_LATEST
)
->willReturn( [ 42 => $name ] );
$mock->init( 'test', $userIdentityLookup );
$user = $mock->localUserFromCentralId(
42, CentralIdLookup::AUDIENCE_RAW, CentralIdLookup::READ_LATEST
);
if ( $succeeds ) {
$this->assertInstanceOf( UserIdentity::class, $user );
$this->assertSame( $name, $user->getName() );
} else {
$this->assertNull( $user );
}
$mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->method( 'isAttached' )
->willReturn( false );
$mock->expects( $this->once() )->method( 'lookupCentralIds' )
->with(
[ 42 => null ],
CentralIdLookup::AUDIENCE_RAW,
CentralIdLookup::READ_LATEST
)
->willReturn( [ 42 => $name ] );
$mock->init( 'test', $userIdentityLookup );
$this->assertNull(
$mock->localUserFromCentralId( 42, CentralIdLookup::AUDIENCE_RAW, CentralIdLookup::READ_LATEST )
);
}
public static function provideLocalUserFromCentralId() {
return [
[ 'UTSysop', true ],
[ 'UTDoesNotExist', false ],
[ null, false ],
[ '', false ],
[ '<X>', false ],
];
}
public function testCentralIdFromName() {
$mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->expects( $this->once() )->method( 'lookupUserNames' )
->with(
[ 'FooBar' => 0 ],
CentralIdLookup::AUDIENCE_RAW,
CentralIdLookup::READ_LATEST
)
->willReturn( [ 'FooBar' => 23 ] );
$this->assertSame(
23,
$mock->centralIdFromName( 'FooBar', CentralIdLookup::AUDIENCE_RAW, CentralIdLookup::READ_LATEST )
);
}
public function testCentralIdFromLocalUser() {
$mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->method( 'isAttached' )
->willReturn( true );
$mock->expects( $this->once() )->method( 'lookupUserNames' )
->with(
[ 'FooBar' => 0 ],
CentralIdLookup::AUDIENCE_RAW,
CentralIdLookup::READ_LATEST
)
->willReturn( [ 'FooBar' => 23 ] );
$this->assertSame(
23,
$mock->centralIdFromLocalUser(
new UserIdentityValue( 10, 'FooBar' ),
CentralIdLookup::AUDIENCE_RAW,
CentralIdLookup::READ_LATEST
)
);
$mock = $this->getMockForAbstractClass( CentralIdLookup::class );
$mock->method( 'isAttached' )
->willReturn( false );
$mock->expects( $this->never() )->method( 'lookupUserNames' );
$this->assertSame(
0,
$mock->centralIdFromLocalUser(
new UserIdentityValue( 10, 'FooBar' ),
CentralIdLookup::AUDIENCE_RAW,
CentralIdLookup::READ_LATEST
)
);
}
}