Addshore has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/108503


Change subject: Clean up error for claim index out of bounds
......................................................................

Clean up error for claim index out of bounds

This changes the uncaught exception to an actual
api UsageException to be provided to users

Bug: 58394
Change-Id: I177ac29de9d2ec0f4a355ec847f6f2075650fe2a
---
M repo/includes/ChangeOp/ChangeOpClaim.php
M repo/includes/api/SetClaim.php
M repo/tests/phpunit/includes/api/SetClaimTest.php
3 files changed, 65 insertions(+), 13 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/03/108503/1

diff --git a/repo/includes/ChangeOp/ChangeOpClaim.php 
b/repo/includes/ChangeOp/ChangeOpClaim.php
index fbaf937..ebf69b1 100644
--- a/repo/includes/ChangeOp/ChangeOpClaim.php
+++ b/repo/includes/ChangeOp/ChangeOpClaim.php
@@ -3,6 +3,7 @@
 namespace Wikibase\ChangeOp;
 
 use InvalidArgumentException;
+use OutOfBoundsException;
 use Wikibase\DataModel\ByPropertyIdArray;
 use Wikibase\DataModel\Claim\Claim;
 use Wikibase\DataModel\Claim\Claims;
@@ -97,7 +98,12 @@
                        $indexedClaimList = new ByPropertyIdArray( 
$entityClaims );
                        $indexedClaimList->buildIndex();
 
-                       $indexedClaimList->addObjectAtIndex( $this->claim, 
$this->index );
+                       try{
+                               $indexedClaimList->addObjectAtIndex( 
$this->claim, $this->index );
+                       }
+                       catch( OutOfBoundsException $e ){
+                               throw new ChangeOpException( "Can not create 
claim at given index" );
+                       }
 
                } else {
                        // Altering an existing claim.
diff --git a/repo/includes/api/SetClaim.php b/repo/includes/api/SetClaim.php
index bb2b100..15dcb02 100644
--- a/repo/includes/api/SetClaim.php
+++ b/repo/includes/api/SetClaim.php
@@ -63,7 +63,7 @@
                try{
                        $changeop->apply( $entity );
                } catch( ChangeOpException $exception ){
-                       $this->dieUsage( 'Failed to apply changeOp:' . 
$exception->getMessage(), 'save-failed' );
+                       $this->dieUsage( 'Failed to apply changeOp: ' . 
$exception->getMessage(), 'save-failed' );
                }
 
                $this->saveChanges( $entityContent, $summary );
diff --git a/repo/tests/phpunit/includes/api/SetClaimTest.php 
b/repo/tests/phpunit/includes/api/SetClaimTest.php
index 6c66290..897b81f 100644
--- a/repo/tests/phpunit/includes/api/SetClaimTest.php
+++ b/repo/tests/phpunit/includes/api/SetClaimTest.php
@@ -4,20 +4,22 @@
 
 use DataValues\StringValue;
 use FormatJson;
-use Wikibase\Claim;
-use Wikibase\Claims;
+use Revision;
+use UsageException;
+use Wikibase\DataModel\Claim\Claim;
+use Wikibase\DataModel\Claim\Claims;
+use Wikibase\DataModel\Claim\Statement;
 use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\Item;
+use Wikibase\DataModel\Reference;
+use Wikibase\DataModel\Snak\PropertyNoValueSnak;
+use Wikibase\DataModel\Snak\PropertySomeValueSnak;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
+use Wikibase\DataModel\Snak\Snak;
+use Wikibase\DataModel\Snak\SnakList;
 use Wikibase\PropertyContent;
 use Wikibase\Lib\Serializers\SerializerFactory;
 use Wikibase\Repo\WikibaseRepo;
-use Wikibase\Statement;
-use Wikibase\Reference;
-use Wikibase\Snak;
-use Wikibase\SnakList;
-use Wikibase\PropertyValueSnak;
-use Wikibase\PropertyNoValueSnak;
-use Wikibase\PropertySomeValueSnak;
-use Wikibase\Item;
 use Wikibase\ItemContent;
 use Wikibase\Lib\ClaimGuidGenerator;
 
@@ -120,6 +122,7 @@
        public function testAddClaim() {
                $claims = $this->getClaims();
 
+               /** @var Claim[] $claims */
                foreach( $claims as $claim ) {
                        $item = Item::newEmpty();
                        $content = new ItemContent( $item );
@@ -181,6 +184,7 @@
 
                // Add new claim at index 2:
                $guid = $guidGenerator->newGuid();
+               /** @var Claim $claim */
                foreach( $this->getClaims() as $claim ) {
                        $claim->setGuid( $guid );
 
@@ -194,13 +198,15 @@
         * @param $claimCount
         * @param $requestLabel string a label to identify requests that are 
made in errors
         * @param int|null $index
+        * @param int|null $baserevid
         */
        protected function makeRequest(
                $claim,
                EntityId $entityId,
                $claimCount,
                $requestLabel,
-               $index = null
+               $index = null,
+               $baserevid = null
        ) {
                $serializerFactory = new SerializerFactory();
 
@@ -220,6 +226,10 @@
 
                if( !is_null( $index ) ) {
                        $params['index'] = $index;
+               }
+
+               if( !is_null( $baserevid ) ) {
+                       $params['baserevid'] = $baserevid;
                }
 
                $this->makeValidRequest( $params );
@@ -253,4 +263,40 @@
                return $resultArray;
        }
 
+       /**
+        * @see Bug 58394 - "specified index out of bounds" issue when moving a 
statement
+        * @expectedException UsageException
+        * @expectedExceptionMessage Failed to apply changeOp: Can not create 
claim at given index
+        */
+       public function testBug58394SpecifiedIndexOutOfBounds() {
+               // Initialize item content with empty claims:
+               $item = Item::newEmpty();
+               $claims = new Claims();
+               $item->setClaims( $claims );
+               $content = new ItemContent( $item );
+               $content->save( 'setclaimtest', null, EDIT_NEW );
+
+               // Generate a single claim:
+               $itemId = $content->getItem()->getId();
+               $guidGenerator = new ClaimGuidGenerator( $itemId );
+               $preexistingClaim = $item->newClaim( new PropertyNoValueSnak( 1 
) );
+               $preexistingClaim->setGuid( $guidGenerator->newGuid() );
+               $claims->addClaim( $preexistingClaim );
+
+               // Save the single claim
+               $item->setClaims( $claims );
+               $content = new ItemContent( $item );
+               $status = $content->save( 'setclaimtest', null, EDIT_UPDATE );
+
+               // Get the baserevid
+               $statusValue = $status->getValue();
+               /** @var Revision $revision */
+               $revision = $statusValue['revision'];
+
+               // Add new claim at index 3 using the baserevid and a different 
property id
+               $newClaim = $item->newClaim( new PropertyNoValueSnak( 2 ) );
+               $newClaim->setGuid( $guidGenerator->newGuid() );
+               $this->makeRequest( $newClaim, $itemId, 2, 'addition request', 
3, $revision->getId() );
+       }
+
 }

-- 
To view, visit https://gerrit.wikimedia.org/r/108503
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I177ac29de9d2ec0f4a355ec847f6f2075650fe2a
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Addshore <addshorew...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to