With a separate service for each of the NameTableStore tables, it wasn't possible to instantiate a NameTableStore for a foreign wiki, leading to the inelegant situation of having RevisionStoreFactory construct a new NameTableStoreFactory every time a RevisionStore for a foreign wiki was requested. These NameTableStore objects were not tracked in any structured way, so there was no way to reset them for tests. So, introduce NameTableStoreFactory, which tracks object instances for both local and remote table access. This also avoids having schema details in ServiceWiring.php. Depends-On: I5c78cfb8bf90eca935a3264592366f63517c4fad Bug: T202641 Change-Id: Ic0f2d1d94bad9dcc047ff19a1f92db89b7e014ce
114 lines
2.9 KiB
PHP
114 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace MediaWiki\Tests\Storage;
|
|
|
|
use MediaWiki\Logger\LoggerFactory;
|
|
use MediaWiki\MediaWikiServices;
|
|
use MediaWiki\Storage\NameTableStore;
|
|
use MediaWiki\Storage\NameTableStoreFactory;
|
|
use MediaWikiTestCase;
|
|
use Wikimedia\Rdbms\ILBFactory;
|
|
use Wikimedia\Rdbms\ILoadBalancer;
|
|
|
|
/**
|
|
* @covers MediaWiki\Storage\NameTableStoreFactory
|
|
* @group Database
|
|
*/
|
|
class NameTableStoreFactoryTest extends MediaWikiTestCase {
|
|
/**
|
|
* @return \PHPUnit_Framework_MockObject_MockObject|ILoadBalancer
|
|
*/
|
|
private function getMockLoadBalancer() {
|
|
return $this->getMockBuilder( ILoadBalancer::class )
|
|
->disableOriginalConstructor()->getMock();
|
|
}
|
|
|
|
/**
|
|
* @return \PHPUnit_Framework_MockObject_MockObject|ILBFactory
|
|
*/
|
|
private function getMockLoadBalancerFactory( $expectedWiki ) {
|
|
$mock = $this->getMockBuilder( ILBFactory::class )
|
|
->disableOriginalConstructor()->getMock();
|
|
|
|
$mock->expects( $this->once() )
|
|
->method( 'getMainLB' )
|
|
->with( $this->equalTo( $expectedWiki ) )
|
|
->willReturnCallback( function ( $domain ) use ( $expectedWiki ) {
|
|
return $this->getMockLoadBalancer();
|
|
} );
|
|
|
|
return $mock;
|
|
}
|
|
|
|
public static function provideTestGet() {
|
|
return [
|
|
[
|
|
'change_tag_def',
|
|
false,
|
|
false,
|
|
],
|
|
[
|
|
'content_models',
|
|
false,
|
|
false,
|
|
],
|
|
[
|
|
'slot_roles',
|
|
false,
|
|
false,
|
|
],
|
|
[
|
|
'change_tag_def',
|
|
'test7245',
|
|
'test7245',
|
|
],
|
|
];
|
|
}
|
|
|
|
/** @dataProvider provideTestGet */
|
|
public function testGet( $tableName, $wiki, $expectedWiki ) {
|
|
$services = MediaWikiServices::getInstance();
|
|
$db = wfGetDB( DB_MASTER );
|
|
if ( $wiki === false ) {
|
|
$wiki2 = $db->getWikiID();
|
|
} else {
|
|
$wiki2 = $wiki;
|
|
}
|
|
$names = new NameTableStoreFactory(
|
|
$this->getMockLoadBalancerFactory( $expectedWiki ),
|
|
$services->getMainWANObjectCache(),
|
|
LoggerFactory::getInstance( 'NameTableStoreFactory' )
|
|
);
|
|
|
|
$table = $names->get( $tableName, $wiki );
|
|
$table2 = $names->get( $tableName, $wiki2 );
|
|
$this->assertSame( $table, $table2 );
|
|
$this->assertInstanceOf( NameTableStore::class, $table );
|
|
}
|
|
|
|
/*
|
|
* The next three integration tests verify that the schema information is correct by loading
|
|
* the relevant information from the database.
|
|
*/
|
|
|
|
public function testIntegratedGetChangeTagDef() {
|
|
$services = MediaWikiServices::getInstance();
|
|
$factory = $services->getNameTableStoreFactory();
|
|
$store = $factory->getChangeTagDef();
|
|
$this->assertType( 'array', $store->getMap() );
|
|
}
|
|
|
|
public function testIntegratedGetContentModels() {
|
|
$services = MediaWikiServices::getInstance();
|
|
$factory = $services->getNameTableStoreFactory();
|
|
$store = $factory->getContentModels();
|
|
$this->assertType( 'array', $store->getMap() );
|
|
}
|
|
|
|
public function testIntegratedGetSlotRoles() {
|
|
$services = MediaWikiServices::getInstance();
|
|
$factory = $services->getNameTableStoreFactory();
|
|
$store = $factory->getSlotRoles();
|
|
$this->assertType( 'array', $store->getMap() );
|
|
}
|
|
}
|