Thiemo Mättig (WMDE) has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/333688 )
Change subject: Refactor StatementModificationHelperTest
......................................................................
Refactor StatementModificationHelperTest
Major sections of this code were not tested before.
Change-Id: I8de60f5ac0bff8337feb74f251cd7466e03235b3
---
M repo/tests/phpunit/includes/Api/StatementModificationHelperTest.php
1 file changed, 167 insertions(+), 23 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/88/333688/1
diff --git
a/repo/tests/phpunit/includes/Api/StatementModificationHelperTest.php
b/repo/tests/phpunit/includes/Api/StatementModificationHelperTest.php
index 7fd3e91..2cbfa67 100644
--- a/repo/tests/phpunit/includes/Api/StatementModificationHelperTest.php
+++ b/repo/tests/phpunit/includes/Api/StatementModificationHelperTest.php
@@ -5,16 +5,21 @@
use ApiMain;
use DataValues\StringValue;
use ApiUsageException;
+use StatusValue;
+use ValueValidators\Result;
+use Wikibase\ChangeOp\ChangeOp;
+use Wikibase\ChangeOp\ChangeOpException;
+use Wikibase\DataModel\Entity\EntityDocument;
use Wikibase\DataModel\Entity\EntityId;
use Wikibase\DataModel\Entity\Item;
-use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Entity\ItemIdParser;
+use Wikibase\DataModel\Services\Statement\StatementGuidValidator;
use Wikibase\DataModel\Snak\PropertyValueSnak;
use Wikibase\DataModel\Statement\Statement;
use Wikibase\Repo\Api\ApiErrorReporter;
use Wikibase\Repo\Api\CreateClaim;
use Wikibase\Repo\Api\StatementModificationHelper;
-use Wikibase\Repo\Localizer\DispatchingExceptionLocalizer;
-use Wikibase\Repo\WikibaseRepo;
+use Wikibase\Repo\SnakFactory;
/**
* @covers Wikibase\Repo\Api\StatementModificationHelper
@@ -38,13 +43,16 @@
);
}
- /**
- * @expectedException ApiUsageException
- */
public function testInvalidGetEntityIdFromString() {
$invalidEntityIdString = 'no!';
- $helper = $this->getNewInstance();
- $helper->getEntityIdFromString( $invalidEntityIdString );
+ $errorReporter = $this->newApiErrorReporterWithException(
'invalid-entity-id' );
+ $helper = $this->getNewInstance( $errorReporter );
+
+ try {
+ $helper->getEntityIdFromString( $invalidEntityIdString
);
+ } catch ( ApiUsageException $ex ) {
+ $this->assertErrorCode( 'invalid-entity-id', $ex );
+ }
}
public function testCreateSummary() {
@@ -70,7 +78,7 @@
public function testGetStatementFromEntity() {
$helper = $this->getNewInstance();
- $item = new Item( new ItemId( 'Q42' ) );
+ $item = new Item();
$snak = new PropertyValueSnak( 2754236, new StringValue( 'test'
) );
$statement = new Statement( $snak );
@@ -79,26 +87,162 @@
$guid = $statement->getGuid();
$this->assertEquals( $statement,
$helper->getStatementFromEntity( $guid, $item ) );
- $this->setExpectedException( ApiUsageException::class );
- $helper->getStatementFromEntity(
'q42$D8404CDA-25E4-4334-AF13-A3290BCD9C0N', $item );
}
- private function getNewInstance() {
- $wikibaseRepo = WikibaseRepo::getDefaultInstance();
- $api = new ApiMain();
+ public function
testGetStatementFromEntity_reportsErrorForInvalidEntity() {
+ $entity = $this->getMock( EntityDocument::class );
+ $errorReporter = $this->newApiErrorReporterWithError(
'no-such-claim' );
+ $helper = $this->getNewInstance( $errorReporter );
- $errorReporter = new ApiErrorReporter(
- $api,
- new DispatchingExceptionLocalizer( array() ),
- $api->getLanguage()
- );
+ try {
+ $helper->getStatementFromEntity( 'foo', $entity );
+ } catch ( ApiUsageException $ex ) {
+ $this->assertErrorCode( 'no-such-claim', $ex );
+ }
+ }
+
+ public function
testGetStatementFromEntity_reportsErrorForUnknownStatementGuid() {
+ $entity = new Item();
+ $errorReporter = $this->newApiErrorReporterWithError(
'no-such-claim' );
+ $helper = $this->getNewInstance( $errorReporter );
+
+ try {
+ $helper->getStatementFromEntity( 'unknown', $entity );
+ } catch ( ApiUsageException $ex ) {
+ $this->assertErrorCode( 'no-such-claim', $ex );
+ }
+ }
+
+ public function testApplyChangeOp_validatesAndAppliesChangeOp() {
+ $entity = new Item();
+
+ $changeOp = $this->getMock( ChangeOp::class );
+ $changeOp->expects( $this->once() )
+ ->method( 'validate' )
+ ->with( $entity )
+ ->will( $this->returnValue( Result::newSuccess() ) );
+ $changeOp->expects( $this->once() )
+ ->method( 'apply' )
+ ->with( $entity );
+
+ $helper = $this->getNewInstance();
+ $helper->applyChangeOp( $changeOp, $entity );
+ }
+
+ public function testApplyChangeOp_reportsErrorForInvalidChangeOp() {
+ $entity = new Item();
+ $errorReporter = $this->newApiErrorReporterWithException(
'modification-failed' );
+ $helper = $this->getNewInstance( $errorReporter );
+
+ $changeOp = $this->getMock( ChangeOp::class );
+ $changeOp->expects( $this->once() )
+ ->method( 'validate' )
+ ->with( $entity )
+ ->will( $this->returnValue( Result::newError( [] ) ) );
+ $changeOp->expects( $this->never() )
+ ->method( 'apply' );
+
+ try {
+ $helper->applyChangeOp( $changeOp, $entity );
+ } catch ( ApiUsageException $ex ) {
+ $this->assertErrorCode( 'modification-failed', $ex );
+ }
+ }
+
+ public function testApplyChangeOp_reportsErrorWhenApplyFails() {
+ $entity = new Item();
+ $errorReporter = $this->newApiErrorReporterWithException(
'modification-failed' );
+ $helper = $this->getNewInstance( $errorReporter );
+
+ $changeOp = $this->getMock( ChangeOp::class );
+ $changeOp->expects( $this->once() )
+ ->method( 'validate' )
+ ->with( $entity )
+ ->will( $this->returnValue( Result::newSuccess() ) );
+ $changeOp->expects( $this->once() )
+ ->method( 'apply' )
+ ->with( $entity )
+ ->will( $this->throwException( new ChangeOpException()
) );
+
+ try {
+ $helper->applyChangeOp( $changeOp, $entity );
+ } catch ( ApiUsageException $ex ) {
+ $this->assertErrorCode( 'modification-failed', $ex );
+ }
+ }
+
+ /**
+ * @param ApiErrorReporter|null $errorReporter
+ *
+ * @return StatementModificationHelper
+ */
+ private function getNewInstance( ApiErrorReporter $errorReporter = null
) {
+ $entityIdParser = new ItemIdParser();
return new StatementModificationHelper(
- $wikibaseRepo->getSnakFactory(),
- $wikibaseRepo->getEntityIdParser(),
- $wikibaseRepo->getStatementGuidValidator(),
- $errorReporter
+ $this->getMockBuilder( SnakFactory::class
)->disableOriginalConstructor()->getMock(),
+ $entityIdParser,
+ new StatementGuidValidator( $entityIdParser ),
+ $errorReporter ?: $this->newApiErrorReporter()
);
}
+ /**
+ * @return ApiErrorReporter
+ */
+ private function newApiErrorReporter() {
+ $errorReporter = $this->getMockBuilder( ApiErrorReporter::class
)
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $errorReporter->expects( $this->never() )
+ ->method( $this->anything() );
+
+ return $errorReporter;
+ }
+
+ /**
+ * @param string $expectedMessage
+ *
+ * @return ApiErrorReporter
+ */
+ private function newApiErrorReporterWithException( $expectedMessage ) {
+ $errorReporter = $this->getMockBuilder( ApiErrorReporter::class
)
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $errorReporter->method( 'dieException' )
+ ->will( $this->throwException(
+ new ApiUsageException( null,
StatusValue::newFatal( $expectedMessage ) )
+ ) );
+
+ return $errorReporter;
+ }
+
+ /**
+ * @param string $expectedMessage
+ *
+ * @return ApiErrorReporter
+ */
+ private function newApiErrorReporterWithError( $expectedMessage ) {
+ $errorReporter = $this->getMockBuilder( ApiErrorReporter::class
)
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $errorReporter->method( 'dieError' )
+ ->will( $this->throwException(
+ new ApiUsageException( null,
StatusValue::newFatal( $expectedMessage ) )
+ ) );
+
+ return $errorReporter;
+ }
+
+ /**
+ * @param string $expectedMessage
+ * @param ApiUsageException $actualException
+ */
+ private function assertErrorCode( $expectedMessage, ApiUsageException
$actualException ) {
+ $this->assertTrue(
$actualException->getStatusValue()->hasMessage( $expectedMessage ) );
+ }
+
}
--
To view, visit https://gerrit.wikimedia.org/r/333688
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I8de60f5ac0bff8337feb74f251cd7466e03235b3
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Thiemo Mättig (WMDE) <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits