wiki.techinc.nl/tests/phpunit/unit/includes/Storage/EditResultCacheTest.php
Ostrzyciel 299cd0db9f Implement EditResultCache
EditResultCache is meant to be an easy way for storing and retrieving
EditResults associated with revisions. It stores the data in the main
object stash which is supposed to be mostly persistent. In case the
main stash method fails, it falls back to trying to find the
EditResult in the ct_params field of revert change tags.

EditResultCache is to be used for delaying the execution of
RevertedTagUpdateJob until the edit is approved. The code for that
will be in the next commit in the relation chain.

This is a separate commit just for clarity.

Bug: T259103
Change-Id: I6c0c6556b6d98fcd131beb0957230ce7c7d268da
2020-08-31 08:59:10 +02:00

169 lines
4.1 KiB
PHP

<?php
namespace MediaWiki\Tests\Storage;
use BagOStuff;
use FormatJson;
use IDatabase;
use MediaWiki\Config\ServiceOptions;
use MediaWiki\Storage\EditResult;
use MediaWiki\Storage\EditResultCache;
use MediaWikiUnitTestCase;
use Wikimedia\Rdbms\ILoadBalancer;
/**
* @covers \MediaWiki\Storage\EditResultCache
*/
class EditResultCacheTest extends MediaWikiUnitTestCase {
private const DUMMY_KEY = 'wiki:dummy:key';
/**
* Returns an EditResult for testing.
*
* @return EditResult
*/
private function getEditResult() : EditResult {
return new EditResult(
false,
100,
EditResult::REVERT_ROLLBACK,
123,
125,
true,
false,
[ 'mw-rollback' ]
);
}
/**
* @covers \MediaWiki\Storage\EditResultCache::set
*/
public function testSet() {
$editResult = $this->getEditResult();
$mainStash = $this->createMock( BagOStuff::class );
$mainStash->expects( $this->once() )
->method( 'set' )
->with(
self::DUMMY_KEY,
FormatJson::encode( $editResult )
)
->willReturn( true );
$mainStash->expects( $this->once() )
->method( 'makeKey' )
->willReturn( self::DUMMY_KEY );
$erCache = new EditResultCache(
$mainStash,
$this->createNoOpMock( ILoadBalancer::class ),
new ServiceOptions(
EditResultCache::CONSTRUCTOR_OPTIONS,
[ 'RCMaxAge' => BagOStuff::TTL_MONTH ]
)
);
$result = $erCache->set( 123, $editResult );
$this->assertTrue( $result, 'EditResultCache::set()' );
}
/**
* @covers \MediaWiki\Storage\EditResultCache::get
*/
public function testGetFromStash() {
$editResult = $this->getEditResult();
$mainStash = $this->createMock( BagOStuff::class );
$mainStash->expects( $this->once() )
->method( 'get' )
->with( self::DUMMY_KEY )
->willReturn( FormatJson::encode( $editResult ) );
$mainStash->expects( $this->once() )
->method( 'makeKey' )
->willReturn( self::DUMMY_KEY );
$erCache = new EditResultCache(
$mainStash,
$this->createNoOpMock( ILoadBalancer::class ),
new ServiceOptions(
EditResultCache::CONSTRUCTOR_OPTIONS,
[ 'RCMaxAge' => BagOStuff::TTL_MONTH ]
)
);
$res = $erCache->get( 126 );
$this->assertEquals( $editResult, $res, 'Correct EditResult is returned' );
}
/**
* @covers \MediaWiki\Storage\EditResultCache::get
*/
public function testGetFromRevertTag() {
$editResult = $this->getEditResult();
$mainStash = $this->createMock( BagOStuff::class );
$mainStash->expects( $this->once() )
->method( 'get' )
->with( self::DUMMY_KEY )
->willReturn( false );
$mainStash->expects( $this->once() )
->method( 'makeKey' )
->willReturn( self::DUMMY_KEY );
$dbr = $this->createMock( IDatabase::class );
$dbr->expects( $this->once() )
->method( 'selectField' )
->willReturn( FormatJson::encode( $editResult ) );
$loadBalancer = $this->createMock( ILoadBalancer::class );
$loadBalancer->expects( $this->once() )
->method( 'getConnection' )
->willReturn( $dbr );
$erCache = new EditResultCache(
$mainStash,
$loadBalancer,
new ServiceOptions(
EditResultCache::CONSTRUCTOR_OPTIONS,
[ 'RCMaxAge' => BagOStuff::TTL_MONTH ]
)
);
$res = $erCache->get( 126 );
$this->assertEquals( $editResult, $res, 'Correct EditResult is returned' );
}
/**
* @covers \MediaWiki\Storage\EditResultCache::get
*/
public function testGetMissingEntry() {
$mainStash = $this->createMock( BagOStuff::class );
$mainStash->expects( $this->once() )
->method( 'get' )
->with( self::DUMMY_KEY )
->willReturn( false );
$mainStash->expects( $this->once() )
->method( 'makeKey' )
->willReturn( self::DUMMY_KEY );
$dbr = $this->createMock( IDatabase::class );
$dbr->expects( $this->once() )
->method( 'selectField' )
->willReturn( false );
$loadBalancer = $this->createMock( ILoadBalancer::class );
$loadBalancer->expects( $this->once() )
->method( 'getConnection' )
->willReturn( $dbr );
$erCache = new EditResultCache(
$mainStash,
$loadBalancer,
new ServiceOptions(
EditResultCache::CONSTRUCTOR_OPTIONS,
[ 'RCMaxAge' => BagOStuff::TTL_MONTH ]
)
);
$res = $erCache->get( 126 );
$this->assertNull( $res, 'Null is returned' );
}
}