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