gplx/mediawiki/extensions/SemanticMediaWiki/tests/phpunit/Elastic/Indexer/Replication/DocumentReplicationExaminer...

548 lines
13 KiB
PHP

<?php
namespace SMW\Tests\Elastic\Indexer\Replication;
use SMW\DIWikiPage;
use SMW\Elastic\Indexer\Replication\DocumentReplicationExaminer;
use SMW\Elastic\Indexer\Replication\ReplicationError;
use SMW\Tests\PHPUnitCompat;
use SMWDITime as DITime;
/**
* @covers \SMW\Elastic\Indexer\Replication\DocumentReplicationExaminer
* @group semantic-mediawiki
*
* @license GPL-2.0-or-later
* @since 3.1
*
* @author mwjames
*/
class DocumentReplicationExaminerTest extends \PHPUnit\Framework\TestCase {
use PHPUnitCompat;
private $store;
private $replicationStatus;
private $elasticClient;
private $idTable;
protected function setUp(): void {
$this->idTable = $this->getMockBuilder( '\SMW\SQLStore\EntityStore\EntityIdManager' )
->disableOriginalConstructor()
->getMock();
$this->idTable->expects( $this->any() )
->method( 'getSMWPageID' )
->willReturn( 42 );
$this->store = $this->getMockBuilder( '\SMW\Store' )
->disableOriginalConstructor()
->setMethods( [ 'getObjectIds', 'getConnection' ] )
->getMockForAbstractClass();
$this->store->expects( $this->any() )
->method( 'getObjectIds' )
->willReturn( $this->idTable );
$this->replicationStatus = $this->getMockBuilder( '\SMW\Elastic\Indexer\Replication\ReplicationStatus' )
->disableOriginalConstructor()
->getMock();
$this->elasticClient = $this->getMockBuilder( '\SMW\Elastic\Connection\DummyClient' )
->disableOriginalConstructor()
->getMock();
$this->elasticClient->expects( $this->any() )
->method( 'ping' )
->willReturn( true );
}
public function testCanConstruct() {
$this->assertInstanceOf(
DocumentReplicationExaminer::class,
new DocumentReplicationExaminer( $this->store, $this->replicationStatus )
);
}
public function testCheck_NoError() {
$replicationStatus = [
'modification_date' => DITime::newFromTimestamp( 1272508900 ),
'associated_revision' => 42
];
$dataItem = $this->getMockBuilder( '\SMWDataItem' )
->disableOriginalConstructor()
->getMockForAbstractClass();
$dataItem->expects( $this->any() )
->method( 'equals' )
->willReturn( true );
$this->idTable->expects( $this->at( 1 ) )
->method( 'findAssociatedRev' )
->willReturn( 42 );
$this->elasticClient->expects( $this->any() )
->method( 'hasMaintenanceLock' )
->willReturn( false );
$this->replicationStatus->expects( $this->once() )
->method( 'get' )
->with( 'modification_date_associated_revision' )
->willReturn( $replicationStatus );
$this->store->expects( $this->once() )
->method( 'getPropertyValues' )
->willReturn( [ $dataItem ] );
$this->store->expects( $this->any() )
->method( 'getConnection' )
->willReturn( $this->elasticClient );
$instance = new DocumentReplicationExaminer(
$this->store,
$this->replicationStatus
);
$this->assertNull(
$instance->check( DIWikiPage::newFromText( 'Foo' ) )
);
}
public function testCheck_NotExists() {
$this->elasticClient->expects( $this->any() )
->method( 'hasMaintenanceLock' )
->willReturn( false );
$replicationStatus = [
'modification_date' => false
];
$this->replicationStatus->expects( $this->once() )
->method( 'get' )
->with( 'modification_date_associated_revision' )
->willReturn( $replicationStatus );
$this->store->expects( $this->once() )
->method( 'getPropertyValues' )
->willReturn( [] );
$this->store->expects( $this->any() )
->method( 'getConnection' )
->willReturn( $this->elasticClient );
$instance = new DocumentReplicationExaminer(
$this->store,
$this->replicationStatus
);
$result = $instance->check( DIWikiPage::newFromText( 'Foo' ) );
$this->assertInstanceOf(
ReplicationError::class,
$result
);
$this->assertEquals(
ReplicationError::TYPE_MODIFICATION_DATE_MISSING,
$result->getType()
);
$this->assertEquals(
[
'id' => 42
],
$result->getData()
);
}
public function testCheck_DocumentExists() {
$this->replicationStatus->expects( $this->once() )
->method( 'get' )
->with( 'exists' )
->willReturn( false );
$this->store->expects( $this->any() )
->method( 'getConnection' )
->willReturn( $this->elasticClient );
$instance = new DocumentReplicationExaminer(
$this->store,
$this->replicationStatus
);
$params = [
DocumentReplicationExaminer::CHECK_DOCUMENT_EXISTS => true,
];
$result = $instance->check( DIWikiPage::newFromText( 'Foo' ), $params );
$this->assertInstanceOf(
ReplicationError::class,
$result
);
$this->assertEquals(
ReplicationError::TYPE_DOCUMENT_MISSING,
$result->getType()
);
$this->assertEquals(
[
'id' => 42
],
$result->getData()
);
}
public function testCheck_ModificationDate() {
$this->elasticClient->expects( $this->any() )
->method( 'hasMaintenanceLock' )
->willReturn( false );
$time_es = DITime::newFromTimestamp( 1272508900 );
$time_store = DITime::newFromTimestamp( 1272508903 );
$replicationStatus = [
'modification_date' => $time_es
];
$this->replicationStatus->expects( $this->once() )
->method( 'get' )
->with( 'modification_date_associated_revision' )
->willReturn( $replicationStatus );
$this->store->expects( $this->once() )
->method( 'getPropertyValues' )
->willReturn( [ $time_store ] );
$this->store->expects( $this->any() )
->method( 'getConnection' )
->willReturn( $this->elasticClient );
$instance = new DocumentReplicationExaminer(
$this->store,
$this->replicationStatus
);
$result = $instance->check( DIWikiPage::newFromText( 'Foo' ) );
$this->assertInstanceOf(
ReplicationError::class,
$result
);
$this->assertEquals(
ReplicationError::TYPE_MODIFICATION_DATE_DIFF,
$result->getType()
);
$this->assertEquals(
[
'id' => 42,
'time_es' => '2010-04-29 02:41:40',
'time_store' => '2010-04-29 02:41:43'
],
$result->getData()
);
}
public function testCheck_AssociateRev() {
$this->elasticClient->expects( $this->any() )
->method( 'hasMaintenanceLock' )
->willReturn( false );
$subject = DIWikiPage::newFromText( 'Foo' );
$time = DITime::newFromTimestamp( 1272508903 );
$replicationStatus = [
'modification_date' => $time,
'associated_revision' => 99999
];
$this->replicationStatus->expects( $this->once() )
->method( 'get' )
->with( 'modification_date_associated_revision' )
->willReturn( $replicationStatus );
$this->idTable->expects( $this->at( 1 ) )
->method( 'findAssociatedRev' )
->willReturn( 42 );
$this->store->expects( $this->at( 1 ) )
->method( 'getPropertyValues' )
->willReturn( [ $time ] );
$this->store->expects( $this->any() )
->method( 'getConnection' )
->willReturn( $this->elasticClient );
$instance = new DocumentReplicationExaminer(
$this->store,
$this->replicationStatus
);
$result = $instance->check( DIWikiPage::newFromText( 'Foo' ) );
$this->assertInstanceOf(
ReplicationError::class,
$result
);
$this->assertEquals(
ReplicationError::TYPE_ASSOCIATED_REVISION_DIFF,
$result->getType()
);
$this->assertEquals(
[
'id' => 42,
'rev_es' => 99999,
'rev_store' => 42
],
$result->getData()
);
}
public function testCheck_MissingFileAttachment() {
$subject = DIWikiPage::newFromText( 'Foo', NS_FILE );
$time = DITime::newFromTimestamp( 1272508903 );
$config = $this->getMockBuilder( '\SMW\Options' )
->disableOriginalConstructor()
->getMock();
$config->expects( $this->any() )
->method( 'dotGet' )
->with( 'indexer.experimental.file.ingest' )
->willReturn( true );
$this->elasticClient->expects( $this->once() )
->method( 'getConfig' )
->willReturn( $config );
$this->elasticClient->expects( $this->any() )
->method( 'hasMaintenanceLock' )
->willReturn( false );
$replicationStatus = [
'modification_date' => $time,
'associated_revision' => 99999
];
$this->replicationStatus->expects( $this->once() )
->method( 'get' )
->with( 'modification_date_associated_revision' )
->willReturn( $replicationStatus );
$this->idTable->expects( $this->at( 1 ) )
->method( 'findAssociatedRev' )
->willReturn( 99999 );
$this->store->expects( $this->at( 1 ) )
->method( 'getPropertyValues' )
->willReturn( [ $time ] );
$this->store->expects( $this->at( 4 ) )
->method( 'getPropertyValues' )
->willReturn( [] );
$this->store->expects( $this->any() )
->method( 'getConnection' )
->willReturn( $this->elasticClient );
$instance = new DocumentReplicationExaminer(
$this->store,
$this->replicationStatus
);
$params = [
DocumentReplicationExaminer::CHECK_MISSING_FILE_ATTACHMENT => true
];
$result = $instance->check( $subject, $params );
$this->assertInstanceOf(
ReplicationError::class,
$result
);
$this->assertEquals(
ReplicationError::TYPE_FILE_ATTACHMENT_MISSING,
$result->getType()
);
$this->assertEquals(
[
'id' => 42
],
$result->getData()
);
}
public function testCheck_NoMissingFileAttachment() {
$subject = DIWikiPage::newFromText( 'Foo', NS_FILE );
$time = DITime::newFromTimestamp( 1272508903 );
$config = $this->getMockBuilder( '\SMW\Options' )
->disableOriginalConstructor()
->getMock();
$config->expects( $this->any() )
->method( 'dotGet' )
->with( 'indexer.experimental.file.ingest' )
->willReturn( true );
$this->elasticClient->expects( $this->once() )
->method( 'getConfig' )
->willReturn( $config );
$this->elasticClient->expects( $this->any() )
->method( 'hasMaintenanceLock' )
->willReturn( false );
$replicationStatus = [
'modification_date' => $time,
'associated_revision' => 99999
];
$this->replicationStatus->expects( $this->once() )
->method( 'get' )
->with( 'modification_date_associated_revision' )
->willReturn( $replicationStatus );
$this->idTable->expects( $this->at( 1 ) )
->method( 'findAssociatedRev' )
->willReturn( 99999 );
$this->store->expects( $this->at( 1 ) )
->method( 'getPropertyValues' )
->willReturn( [ $time ] );
$this->store->expects( $this->at( 4 ) )
->method( 'getPropertyValues' )
->willReturn( [ 'Foo' ] );
$this->store->expects( $this->any() )
->method( 'getConnection' )
->willReturn( $this->elasticClient );
$instance = new DocumentReplicationExaminer(
$this->store,
$this->replicationStatus
);
$params = [
DocumentReplicationExaminer::CHECK_MISSING_FILE_ATTACHMENT => true
];
$result = $instance->check( $subject, $params );
$this->assertNull(
$result
);
}
public function testCheck_FileAttachment_Disabled() {
$subject = DIWikiPage::newFromText( 'Foo', NS_FILE );
$time = DITime::newFromTimestamp( 1272508903 );
$config = $this->getMockBuilder( '\SMW\Options' )
->disableOriginalConstructor()
->getMock();
$config->expects( $this->any() )
->method( 'dotGet' )
->with( 'indexer.experimental.file.ingest' )
->willReturn( false );
$this->elasticClient->expects( $this->once() )
->method( 'getConfig' )
->willReturn( $config );
$this->elasticClient->expects( $this->any() )
->method( 'hasMaintenanceLock' )
->willReturn( false );
$replicationStatus = [
'modification_date' => $time,
'associated_revision' => 99999
];
$this->replicationStatus->expects( $this->once() )
->method( 'get' )
->with( 'modification_date_associated_revision' )
->willReturn( $replicationStatus );
$this->idTable->expects( $this->at( 1 ) )
->method( 'findAssociatedRev' )
->willReturn( 99999 );
$this->store->expects( $this->at( 1 ) )
->method( 'getPropertyValues' )
->willReturn( [ $time ] );
$this->store->expects( $this->any() )
->method( 'getConnection' )
->willReturn( $this->elasticClient );
$instance = new DocumentReplicationExaminer(
$this->store,
$this->replicationStatus
);
$params = [
DocumentReplicationExaminer::CHECK_MISSING_FILE_ATTACHMENT => true
];
$result = $instance->check( $subject, $params );
$this->assertNull(
$result
);
}
public function testCheck_FileAttachment_NoCheck() {
$subject = DIWikiPage::newFromText( 'Foo', NS_FILE );
$time = DITime::newFromTimestamp( 1272508903 );
$this->elasticClient->expects( $this->any() )
->method( 'hasMaintenanceLock' )
->willReturn( false );
$replicationStatus = [
'modification_date' => $time,
'associated_revision' => 99999
];
$this->replicationStatus->expects( $this->once() )
->method( 'get' )
->with( 'modification_date_associated_revision' )
->willReturn( $replicationStatus );
$this->idTable->expects( $this->at( 1 ) )
->method( 'findAssociatedRev' )
->willReturn( 99999 );
$this->store->expects( $this->at( 1 ) )
->method( 'getPropertyValues' )
->willReturn( [ $time ] );
$this->store->expects( $this->any() )
->method( 'getConnection' )
->willReturn( $this->elasticClient );
$instance = new DocumentReplicationExaminer(
$this->store,
$this->replicationStatus
);
$result = $instance->check( $subject );
$this->assertNull(
$result
);
}
}