wiki.techinc.nl/tests/phpunit/includes/externalstore/ExternalStoreAccessTest.php
Daimona Eaytoy d3243571d0 Fix DB usage in non-database tests (part 2)
Mock the relevant services that need the DB instead, when possible. When
not possible, e.g. because DB access is needed for the test to make
sense, add the test to the Database group instead.

Change-Id: Iefbfe00bedc243906c6b860572568343268646cc
2023-08-06 22:57:28 +00:00

105 lines
3.6 KiB
PHP

<?php
use MediaWiki\Tests\Unit\DummyServicesTrait;
use PHPUnit\Framework\MockObject\MockObject;
/**
* @covers ExternalStoreAccess
*/
class ExternalStoreAccessTest extends MediaWikiIntegrationTestCase {
use DummyServicesTrait;
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->setService( 'ReadOnlyMode', $this->getDummyReadOnlyMode( 'Some absurd reason' ) );
$this->expectException( ReadOnlyError::class );
$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();
}
}