[MediaWiki-commits] [Gerrit] mediawiki...WikibaseLexeme[master]: Add LanguageChangeOpDeserializer
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/339787 ) Change subject: Add LanguageChangeOpDeserializer .. Add LanguageChangeOpDeserializer Bug: T155701 Change-Id: Ibda3e8b94a7f17637f4da5a5e54cd76369f1e003 --- A src/ChangeOp/Deserialization/LanguageChangeOpDeserializer.php A tests/phpunit/mediawiki/ChangeOp/Deserialization/LanguageChangeOpDeserializerTest.php 2 files changed, 218 insertions(+), 0 deletions(-) Approvals: WMDE-leszek: Looks good to me, approved jenkins-bot: Verified diff --git a/src/ChangeOp/Deserialization/LanguageChangeOpDeserializer.php b/src/ChangeOp/Deserialization/LanguageChangeOpDeserializer.php new file mode 100644 index 000..8ce29da --- /dev/null +++ b/src/ChangeOp/Deserialization/LanguageChangeOpDeserializer.php @@ -0,0 +1,107 @@ +lexemeValidatorFactory = $lexemeValidatorFactory; + $this->stringNormalizer = $stringNormalizer; + $this->stringValidator = $stringValidator; + } + + /** +* @see ChangeOpDeserializer::createEntityChangeOp +* +* @param array $changeRequest +* +* @throws ChangeOpDeserializationException +* +* @return ChangeOp +*/ + public function createEntityChangeOp( array $changeRequest ) { + $changeOps = new ChangeOps(); + + $result = $this->stringValidator->validate( $changeRequest['language'] ); + if ( $result->isValid() !== true ) { + throw new ChangeOpDeserializationException( + 'language needs to be string', + 'invalid-language' + ); + } + $languageSerialization = $this->stringNormalizer->cleanupToNFC( $changeRequest['language'] ); + + if ( $languageSerialization === '' ) { + $changeOps->add( new ChangeOpLanguage( + null, + $this->lexemeValidatorFactory + ) ); + return $changeOps; + } + + $itemId = $this->validateItemId( $languageSerialization ); + // TODO: maybe move creating ChangeOpLanguage instance to some kind of factory? + $changeOps->add( new ChangeOpLanguage( + $itemId, + $this->lexemeValidatorFactory + ) ); + + return $changeOps; + } + + /** +* @param string $idSerialization +* @return ItemId +* @throws ChangeOpDeserializationException +*/ + private function validateItemId( $idSerialization ) { + try { + $itemId = new ItemId( $idSerialization ); + } catch ( InvalidArgumentException $e ) { + throw new ChangeOpDeserializationException( + 'Item id can not be parsed', + 'invalid-item-id' + ); + } + + return $itemId; + } + +} diff --git a/tests/phpunit/mediawiki/ChangeOp/Deserialization/LanguageChangeOpDeserializerTest.php b/tests/phpunit/mediawiki/ChangeOp/Deserialization/LanguageChangeOpDeserializerTest.php new file mode 100644 index 000..94fa15d --- /dev/null +++ b/tests/phpunit/mediawiki/ChangeOp/Deserialization/LanguageChangeOpDeserializerTest.php @@ -0,0 +1,111 @@ +getMockTermValidatorFactory() ), + new StringNormalizer(), + new StringValidator() + ); + } + + public function testGivenLanguageSerializationIsNotString_exceptionIsThrown() { + $deserializer = $this->newLanguageChangeOpDeserializer(); + + $this->setExpectedException( ChangeOpDeserializationException::class ); + + $deserializer->createEntityChangeOp( [ 'language' => [] ] ); + } + + public function testGivenLanguageSerializationIsInvalid_exceptionIsThrown() { + + $lexemeValidatorFactory = $this->getMockBuilder( LexemeValidatorFactory::class ) + ->disableOriginalConstructor() + ->getMock(); + + $deserializer = new LanguageChangeOpDeserializer( + $lexemeValidatorFactory, + new StringNormalizer(), + new StringValidator() + ); + + $this->setExpectedException( ChangeOpDeserializationException::class ); + + // Invalid ItemId (not a Q###) + $deserializer->createEntityChangeOp( [ 'language' => 'invalid item id' ] ); + } + + public function testGivenRequestWithLanguageAndNoLanguage_changeOpAddsTheLanguage() { + $lexeme = new Lexeme( new
[MediaWiki-commits] [Gerrit] mediawiki...WikibaseLexeme[master]: Add LanguageChangeOpDeserializer
Ladsgroup has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/339787 ) Change subject: Add LanguageChangeOpDeserializer .. Add LanguageChangeOpDeserializer Bug: T155701 Change-Id: Ibda3e8b94a7f17637f4da5a5e54cd76369f1e003 --- A src/ChangeOp/Deserialization/LanguageChangeOpDeserializer.php A tests/phpunit/mediawiki/ChangeOp/Deserialization/LanguageChangeOpDeserializerTest.php 2 files changed, 218 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseLexeme refs/changes/87/339787/1 diff --git a/src/ChangeOp/Deserialization/LanguageChangeOpDeserializer.php b/src/ChangeOp/Deserialization/LanguageChangeOpDeserializer.php new file mode 100644 index 000..948fd7a --- /dev/null +++ b/src/ChangeOp/Deserialization/LanguageChangeOpDeserializer.php @@ -0,0 +1,107 @@ +lexemeValidatorFactory = $lexemeValidatorFactory; + $this->stringNormalizer = $stringNormalizer; + //XXX: Inject this? + $this->stringValidator = new StringValidator(); + } + + /** +* @see ChangeOpDeserializer::createEntityChangeOp +* +* @param array $changeRequest +* +* @throws ChangeOpDeserializationException +* +* @return ChangeOp +*/ + public function createEntityChangeOp( array $changeRequest ) { + $changeOps = new ChangeOps(); + + $result = $this->stringValidator->validate( $changeRequest['language'] ); + if ( $result->isValid() !== true ) { + throw new ChangeOpDeserializationException( + 'language needs to be string', + 'invalid-language' + ); + } + $languageSerialization = $this->stringNormalizer->cleanupToNFC( $changeRequest['language'] ); + + if ( $languageSerialization === '' ) { + $changeOps->add( new ChangeOpLanguage( + null, + $this->lexemeValidatorFactory + ) ); + return $changeOps; + } + + $itemId = $this->validateItemId( $languageSerialization ); + // TODO: maybe move creating ChangeOpLanguage instance to some kind of factory? + $changeOps->add( new ChangeOpLanguage( + $itemId, + $this->lexemeValidatorFactory + ) ); + + return $changeOps; + } + + /** +* @param string $idSerialization +* @return ItemId +* @throws ChangeOpDeserializationException +*/ + private function validateItemId( $idSerialization ) { + try { + $itemId = new ItemId( $idSerialization ); + } catch ( InvalidArgumentException $e ) { + throw new ChangeOpDeserializationException( + 'Item id can not be parsed', + 'invalid-item-id' + ); + } + + return $itemId; + } + +} diff --git a/tests/phpunit/mediawiki/ChangeOp/Deserialization/LanguageChangeOpDeserializerTest.php b/tests/phpunit/mediawiki/ChangeOp/Deserialization/LanguageChangeOpDeserializerTest.php new file mode 100644 index 000..26bae10 --- /dev/null +++ b/tests/phpunit/mediawiki/ChangeOp/Deserialization/LanguageChangeOpDeserializerTest.php @@ -0,0 +1,111 @@ +getMockTermValidatorFactory() ), + new StringNormalizer() + ); + } + + public function testGivenLanguageSerializationIsNotString_exceptionIsThrown() { + $deserializer = $this->newLanguageChangeOpDeserializer(); + + $this->setExpectedException( ChangeOpDeserializationException::class ); + + $deserializer->createEntityChangeOp( [ 'language' => [] ] ); + } + + public function testGivenLanguageSerializationIsInvalid_exceptionIsThrown() { + + $lexemeValidatorFactory = $this->getMockBuilder( LexemeValidatorFactory::class ) + ->disableOriginalConstructor() + ->getMock(); + + $deserializer = new LanguageChangeOpDeserializer( + $lexemeValidatorFactory, + new StringNormalizer() + ); + + $this->setExpectedException( ChangeOpDeserializationException::class ); + + $deserializer->createEntityChangeOp( [ 'language' => 'invalid item id' ] ); + } + + // TODO: should case of ChangeOp with invalid Term (ie. throwing ChangeOpException + // when applied on Lexeme object) be also tested here? + + public function