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
169 lines
4.1 KiB
PHP
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' );
|
|
}
|
|
}
|