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

Reply via email to