[MediaWiki-commits] [Gerrit] mediawiki...WikibaseLexeme[master]: Add LanguageChangeOpDeserializer

2017-02-28 Thread jenkins-bot (Code Review)
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

2017-02-24 Thread Ladsgroup (Code Review)
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