createMock() does the same, but is much easier to read. A small difference is that some of the replacements made in this patch didn't use disableOriginalConstructor() before. In case this was relevant we should see the respective test fail. If not we can save some CPU cycles and skip these constructors. Change-Id: Ib98fb06e0fe753b7a53cb087a47e1159515a8ad5
102 lines
3.5 KiB
PHP
102 lines
3.5 KiB
PHP
<?php
|
|
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
|
|
/**
|
|
* @covers ExternalStoreAccess
|
|
*/
|
|
class ExternalStoreAccessTest extends MediaWikiIntegrationTestCase {
|
|
|
|
public function testBasic() {
|
|
$active = [ 'memory' ];
|
|
$defaults = [ 'memory://cluster1', 'memory://cluster2' ];
|
|
$esFactory = new ExternalStoreFactory( $active, $defaults, 'db-prefix' );
|
|
$access = new ExternalStoreAccess( $esFactory );
|
|
|
|
$this->assertFalse( $access->isReadOnly() );
|
|
|
|
/** @var ExternalStoreMemory $store */
|
|
$store = $esFactory->getStore( 'memory' );
|
|
$this->assertInstanceOf( ExternalStoreMemory::class, $store );
|
|
|
|
$location = $esFactory->getStoreLocationFromUrl( 'memory://cluster1' );
|
|
$this->assertFalse( $store->isReadOnly( $location ) );
|
|
}
|
|
|
|
/**
|
|
* @covers ExternalStoreAccess::isReadOnly
|
|
*/
|
|
public function testReadOnly() {
|
|
/** @var ExternalStoreMedium|MockObject $medium */
|
|
$medium = $this->createMock( ExternalStoreMedium::class );
|
|
|
|
$medium->method( 'isReadOnly' )->willReturn( true );
|
|
|
|
/** @var ExternalStoreFactory|MockObject $esFactory */
|
|
$esFactory = $this->createMock( ExternalStoreFactory::class );
|
|
|
|
$esFactory->method( 'getWriteBaseUrls' )->willReturn( [ 'test:' ] );
|
|
$esFactory->method( 'getStoreForUrl' )->willReturn( $medium );
|
|
$esFactory->method( 'getStoreLocationFromUrl' )->willReturn( 'dummy' );
|
|
|
|
$access = new ExternalStoreAccess( $esFactory );
|
|
$this->assertTrue( $access->isReadOnly() );
|
|
|
|
$this->expectExceptionObject( new ReadOnlyError() );
|
|
$access->insert( 'Lorem Ipsum' );
|
|
}
|
|
|
|
/**
|
|
* @covers ExternalStoreAccess::fetchFromURL
|
|
* @covers ExternalStoreAccess::fetchFromURLs
|
|
* @covers ExternalStoreAccess::insert
|
|
*/
|
|
public function testReadWrite() {
|
|
$active = [ 'memory' ]; // active store types
|
|
$defaults = [ 'memory://cluster1', 'memory://cluster2' ];
|
|
$esFactory = new ExternalStoreFactory( $active, $defaults, 'db-prefix' );
|
|
$access = new ExternalStoreAccess( $esFactory );
|
|
|
|
/** @var ExternalStoreMemory $storeLocal */
|
|
$storeLocal = $esFactory->getStore( 'memory' );
|
|
/** @var ExternalStoreMemory $storeOther */
|
|
$storeOther = $esFactory->getStore( 'memory', [ 'domain' => 'other' ] );
|
|
$this->assertInstanceOf( ExternalStoreMemory::class, $storeLocal );
|
|
$this->assertInstanceOf( ExternalStoreMemory::class, $storeOther );
|
|
|
|
$v1 = wfRandomString();
|
|
$v2 = wfRandomString();
|
|
$v3 = wfRandomString();
|
|
|
|
$this->assertFalse( $storeLocal->fetchFromURL( 'memory://cluster1/1' ) );
|
|
|
|
$url1 = 'memory://cluster1/1';
|
|
$this->assertEquals(
|
|
$url1,
|
|
$esFactory->getStoreForUrl( 'memory://cluster1' )
|
|
->store( $esFactory->getStoreLocationFromUrl( 'memory://cluster1' ), $v1 )
|
|
);
|
|
$this->assertEquals(
|
|
$v1,
|
|
$esFactory->getStoreForUrl( 'memory://cluster1/1' )
|
|
->fetchFromURL( 'memory://cluster1/1' )
|
|
);
|
|
$this->assertEquals( $v1, $storeLocal->fetchFromURL( 'memory://cluster1/1' ) );
|
|
|
|
$url2 = $access->insert( $v2 );
|
|
$url3 = $access->insert( $v3, [ 'domain' => 'other' ] );
|
|
$this->assertNotFalse( $url2 );
|
|
$this->assertNotFalse( $url3 );
|
|
// There is only one active store type
|
|
$this->assertEquals( $v2, $storeLocal->fetchFromURL( $url2 ) );
|
|
$this->assertEquals( $v3, $storeOther->fetchFromURL( $url3 ) );
|
|
$this->assertFalse( $storeOther->fetchFromURL( $url2 ) );
|
|
$this->assertFalse( $storeLocal->fetchFromURL( $url3 ) );
|
|
|
|
$res = $access->fetchFromURLs( [ $url1, $url2, $url3 ] );
|
|
$this->assertEquals( [ $url1 => $v1, $url2 => $v2, $url3 => false ], $res, "Local-only" );
|
|
|
|
$storeLocal->clear();
|
|
$storeOther->clear();
|
|
}
|
|
}
|