wiki.techinc.nl/tests/phpunit/includes/externalstore/ExternalStoreAccessTest.php
DannyS712 3d2685691a Remove unneeded uses of MediaWikiCoversValidator
Since both MediaWikiIntegrationTestCase and
MediaWikiUnitTestCase use MediaWikiCoversValidator,
subclasses do not need to do so, just tests that
extend the base PHPUnit test case directly

Change-Id: Ie8702625621d55130b04b6ef85114d3375a3b39c
2021-05-22 01:43:29 +00:00

106 lines
3.6 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->getMockBuilder( ExternalStoreMedium::class )
->disableOriginalConstructor()
->getMock();
$medium->method( 'isReadOnly' )->willReturn( true );
/** @var ExternalStoreFactory|MockObject $esFactory */
$esFactory = $this->getMockBuilder( ExternalStoreFactory::class )
->disableOriginalConstructor()
->getMock();
$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();
}
}