jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/376720 )

Change subject: Add a lexeme serializer for the external output
......................................................................


Add a lexeme serializer for the external output

Bug: T176473
Change-Id: I83ec9f2bf45196b8f93a554b7a90cc307a1294dd
---
M WikibaseLexeme.entitytypes.php
A src/DataModel/Serialization/ExternalLexemeSerializer.php
M src/DataModel/Serialization/LexemeDeserializer.php
R src/DataModel/Serialization/StorageLexemeSerializer.php
R 
tests/phpunit/composer/DataModel/Serialization/ExternalLexemeSerializerTest.php
A tests/phpunit/composer/DataModel/Serialization/StorageLexemeSerializerTest.php
M tests/phpunit/composer/ErisGenerators/LexemeGenerator.php
M tests/phpunit/composer/ErisGenerators/WikibaseLexemeGenerators.php
A tests/phpunit/mediawiki/Api/LexemeGetEntitiesTest.php
M tests/phpunit/mediawiki/DataModel/Serialization/LexemeDeserializerTest.php
10 files changed, 444 insertions(+), 24 deletions(-)

Approvals:
  WMDE-leszek: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/WikibaseLexeme.entitytypes.php b/WikibaseLexeme.entitytypes.php
index 226b9a7..50bc4ee 100644
--- a/WikibaseLexeme.entitytypes.php
+++ b/WikibaseLexeme.entitytypes.php
@@ -25,8 +25,9 @@
 use Wikibase\Lexeme\Content\LexemeHandler;
 use Wikibase\Lexeme\DataModel\Lexeme;
 use Wikibase\Lexeme\DataModel\LexemeId;
+use Wikibase\Lexeme\DataModel\Serialization\ExternalLexemeSerializer;
 use Wikibase\Lexeme\DataModel\Serialization\LexemeDeserializer;
-use Wikibase\Lexeme\DataModel\Serialization\LexemeSerializer;
+use Wikibase\Lexeme\DataModel\Serialization\StorageLexemeSerializer;
 use Wikibase\Lexeme\DataModel\Services\Diff\LexemeDiffer;
 use Wikibase\Lexeme\DataModel\Services\Diff\LexemePatcher;
 use Wikibase\Lexeme\Rdf\LexemeRdfBuilder;
@@ -44,13 +45,15 @@
 return [
        'lexeme' => [
                'serializer-factory-callback' => function ( SerializerFactory 
$serializerFactory ) {
-                       return new LexemeSerializer(
-                               $serializerFactory->newTermListSerializer(),
-                               $serializerFactory->newStatementListSerializer()
+                       return new ExternalLexemeSerializer(
+                               new StorageLexemeSerializer(
+                                       
$serializerFactory->newTermListSerializer(),
+                                       
$serializerFactory->newStatementListSerializer()
+                               )
                        );
                },
                'storage-serializer-factory-callback' => function ( 
SerializerFactory $serializerFactory ) {
-                       return new LexemeSerializer(
+                       return new StorageLexemeSerializer(
                                $serializerFactory->newTermListSerializer(),
                                $serializerFactory->newStatementListSerializer()
                        );
diff --git a/src/DataModel/Serialization/ExternalLexemeSerializer.php 
b/src/DataModel/Serialization/ExternalLexemeSerializer.php
new file mode 100644
index 0000000..f321b8f
--- /dev/null
+++ b/src/DataModel/Serialization/ExternalLexemeSerializer.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Wikibase\Lexeme\DataModel\Serialization;
+
+use Serializers\DispatchableSerializer;
+use Serializers\Exceptions\SerializationException;
+use Serializers\Exceptions\UnsupportedObjectException;
+use Wikibase\Lexeme\DataModel\Lexeme;
+
+/**
+ * Serializer of Lexeme entities to be used to serializer entities for any 
external output
+ * (i.e. API, Special pages, dumps etc).
+ * For serialization to be used in the internal Wikibase storage layer use 
LexemeSerializer instead.
+ *
+ * @license GPL-2.0+
+ */
+class ExternalLexemeSerializer implements DispatchableSerializer {
+
+       /**
+        * @var StorageLexemeSerializer
+        */
+       private $internalSerializer;
+
+       public function __construct( StorageLexemeSerializer 
$internalSerializer ) {
+               $this->internalSerializer = $internalSerializer;
+       }
+
+       /**
+        * @see DispatchableSerializer::isSerializerFor
+        *
+        * @param mixed $object
+        *
+        * @return bool
+        */
+       public function isSerializerFor( $object ) {
+               return $object instanceof Lexeme;
+       }
+
+       /**
+        * @see Serializer::serialize
+        *
+        * @param Lexeme $object
+        *
+        * @throws SerializationException
+        * @return array
+        */
+       public function serialize( $object ) {
+               if ( !$this->isSerializerFor( $object ) ) {
+                       throw new UnsupportedObjectException(
+                               $object,
+                               'ExternalLexemeSerializer can only serialize 
Lexeme objects.'
+                       );
+               }
+
+               return $this->getSerialized( $object );
+       }
+
+       private function getSerialized( Lexeme $lexeme ) {
+               $internalSerialization = $this->internalSerializer->serialize( 
$lexeme );
+
+               unset( $internalSerialization['nextFormId'] );
+
+               return $internalSerialization;
+       }
+
+}
diff --git a/src/DataModel/Serialization/LexemeDeserializer.php 
b/src/DataModel/Serialization/LexemeDeserializer.php
index 7138d41..0b8bd70 100644
--- a/src/DataModel/Serialization/LexemeDeserializer.php
+++ b/src/DataModel/Serialization/LexemeDeserializer.php
@@ -168,7 +168,12 @@
                        $serialization['representations']
                );
 
-               return new Form( $id, $representations, [] );
+               $grammaticalFeatures = [];
+               foreach ( $serialization['grammaticalFeatures'] as $featureId ) 
{
+                       $grammaticalFeatures[] = 
$this->entityIdDeserializer->deserialize( $featureId );
+               }
+
+               return new Form( $id, $representations, $grammaticalFeatures );
        }
 
 }
diff --git a/src/DataModel/Serialization/LexemeSerializer.php 
b/src/DataModel/Serialization/StorageLexemeSerializer.php
similarity index 98%
rename from src/DataModel/Serialization/LexemeSerializer.php
rename to src/DataModel/Serialization/StorageLexemeSerializer.php
index b2dadf1..97edbf5 100644
--- a/src/DataModel/Serialization/LexemeSerializer.php
+++ b/src/DataModel/Serialization/StorageLexemeSerializer.php
@@ -16,7 +16,7 @@
  * @license GPL-2.0+
  * @author Amir Sarabadani <[email protected]>
  */
-class LexemeSerializer implements DispatchableSerializer {
+class StorageLexemeSerializer implements DispatchableSerializer {
 
        /**
         * @var Serializer
diff --git 
a/tests/phpunit/mediawiki/DataModel/Serialization/LexemeSerializerTest.php 
b/tests/phpunit/composer/DataModel/Serialization/ExternalLexemeSerializerTest.php
similarity index 91%
rename from 
tests/phpunit/mediawiki/DataModel/Serialization/LexemeSerializerTest.php
rename to 
tests/phpunit/composer/DataModel/Serialization/ExternalLexemeSerializerTest.php
index 055e48e..3c198e1 100644
--- a/tests/phpunit/mediawiki/DataModel/Serialization/LexemeSerializerTest.php
+++ 
b/tests/phpunit/composer/DataModel/Serialization/ExternalLexemeSerializerTest.php
@@ -12,21 +12,22 @@
 use Wikibase\DataModel\Statement\StatementList;
 use Wikibase\DataModel\Term\TermList;
 use Wikibase\Lexeme\DataModel\Lexeme;
-use Wikibase\Lexeme\DataModel\Serialization\LexemeSerializer;
+use Wikibase\Lexeme\DataModel\Serialization\ExternalLexemeSerializer;
+use Wikibase\Lexeme\DataModel\Serialization\StorageLexemeSerializer;
 use Wikibase\Lexeme\Tests\DataModel\NewForm;
 use Wikibase\Lexeme\Tests\DataModel\NewLexeme;
 use Wikibase\Lexeme\Tests\DataModel\NewSense;
 use Wikibase\Repo\Tests\NewStatement;
 
 /**
- * @covers Wikibase\Lexeme\DataModel\Serialization\LexemeSerializer
+ * @covers Wikibase\Lexeme\DataModel\Serialization\ExternalLexemeSerializer
  *
  * @group WikibaseLexeme
  *
  * @license GPL-2.0+
  * @author Amir Sarabadani <[email protected]>
  */
-class LexemeSerializerTest extends PHPUnit_Framework_TestCase {
+class ExternalLexemeSerializerTest extends PHPUnit_Framework_TestCase {
 
        private function newSerializer() {
                $statementListSerializer = $this->getMockBuilder( 
StatementListSerializer::class )
@@ -45,7 +46,9 @@
                                return $termList->toTextArray();
                        } ) );
 
-               return new LexemeSerializer( $termListSerializer, 
$statementListSerializer );
+               return new ExternalLexemeSerializer(
+                       new StorageLexemeSerializer( $termListSerializer, 
$statementListSerializer )
+               );
        }
 
        public function testIsSerializerFor() {
@@ -180,7 +183,7 @@
 
        public function testSerializesStatementsOnForms() {
                $lexeme = NewLexeme::havingForm(
-                       NewForm::havingStatement( NewStatement::forProperty( 
"P2" ) )
+                       NewForm::havingStatement( new PropertyNoValueSnak( new 
PropertyId( 'P2' ) ) )
                )->build();
 
                $serialization = $this->newSerializer()->serialize( $lexeme );
@@ -264,12 +267,12 @@
                );
        }
 
-       public function testSerializesNextFormId() {
+       public function testDoesNotSerializeNextFormId() {
                $lexeme = NewLexeme::create()->build();
 
                $serialization = $this->newSerializer()->serialize( $lexeme );
 
-               assertThat( $serialization, hasKeyValuePair( 'nextFormId', 1 ) 
);
+               assertThat( $serialization, not( hasKeyInArray( 'nextFormId' ) 
) );
        }
 
 }
diff --git 
a/tests/phpunit/composer/DataModel/Serialization/StorageLexemeSerializerTest.php
 
b/tests/phpunit/composer/DataModel/Serialization/StorageLexemeSerializerTest.php
new file mode 100644
index 0000000..ff570a7
--- /dev/null
+++ 
b/tests/phpunit/composer/DataModel/Serialization/StorageLexemeSerializerTest.php
@@ -0,0 +1,279 @@
+<?php
+
+namespace Wikibase\Lexeme\Tests\DataModel\Serialization;
+
+use DataValues\Deserializers\DataValueDeserializer;
+use DataValues\NumberValue;
+use DataValues\Serializers\DataValueSerializer;
+use DataValues\StringValue;
+use Wikibase\DataModel\DeserializerFactory;
+use Wikibase\DataModel\Deserializers\EntityIdDeserializer;
+use Wikibase\DataModel\Entity\DispatchingEntityIdParser;
+use Wikibase\DataModel\Entity\EntityIdValue;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\DataModel\SerializerFactory;
+use Wikibase\DataModel\Serializers\TermListSerializer;
+use Wikibase\DataModel\Serializers\TermSerializer;
+use Wikibase\DataModel\Snak\PropertyNoValueSnak;
+use Wikibase\DataModel\Snak\PropertySomeValueSnak;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
+use Wikibase\Lexeme\DataModel\Lexeme;
+use Wikibase\Lexeme\DataModel\LexemeId;
+use Wikibase\Lexeme\DataModel\Serialization\LexemeDeserializer;
+use Wikibase\Lexeme\DataModel\Serialization\StorageLexemeSerializer;
+use Wikibase\Lexeme\Tests\DataModel\NewForm;
+use Wikibase\Lexeme\Tests\DataModel\NewLexeme;
+use Wikibase\Lexeme\Tests\DataModel\NewSense;
+use Wikibase\Lexeme\Tests\ErisGenerators\ErisTest;
+use Wikibase\Lexeme\Tests\ErisGenerators\WikibaseLexemeGenerators;
+
+/**
+ * @covers \Wikibase\Lexeme\DataModel\Serialization\StorageLexemeSerializer
+ *
+ * @group WikibaseLexeme
+ *
+ * @license GPL-2.0+
+ */
+class StorageLexemeSerializerTest extends \PHPUnit_Framework_TestCase {
+
+       use ErisTest;
+
+       public function testSerializedLexemeIsDeserializedToTheSameLexeme() {
+               $serializer = $this->createSerializer();
+               $deserializer = $this->createDeserializer();
+
+               $this->eris()
+                       ->forAll( WikibaseLexemeGenerators::lexeme() )
+                       ->then( function ( Lexeme $lexeme ) use ( $serializer, 
$deserializer ) {
+                               $serialized = $serializer->serialize( $lexeme );
+                               $newLexeme = $deserializer->deserialize( 
$serialized );
+
+                               $this->assertTrue( $newLexeme->equals( $lexeme 
), 'Lexemes are not equal' );
+                               $this->assertEquals( $lexeme, $newLexeme ); 
//Just to be sure
+                       } );
+       }
+
+       public function 
testSerializedLexemeIsDeserializedToTheSameLexeme_FullRoundTrip() {
+               $serializer = $this->createSerializer();
+               $deserializer = $this->createDeserializer();
+
+               $this->eris()
+                       ->limitTo( 10 )
+                       ->forAll( WikibaseLexemeGenerators::lexeme() )
+                       ->then( function ( Lexeme $lexeme ) use ( $serializer, 
$deserializer ) {
+                               $serialized = $serializer->serialize( $lexeme );
+                               // emulating full round trip
+                               $serialized = json_decode( json_encode( 
$serialized ), true );
+                               $newLexeme = $deserializer->deserialize( 
$serialized );
+
+                               $this->assertTrue( $newLexeme->equals( $lexeme 
), 'Lexemes are not equal' );
+                               $this->assertEquals( $lexeme, $newLexeme ); 
//Just to be sure
+                       } );
+       }
+
+       public function testSerializationIsStable() {
+               /**
+                * The purpose of this test is to insure against accidental 
serialization change.
+                * This is important because entities are stored as text (JSON 
encoded structure)
+                * and migration of serialization is close to impossible.
+                */
+
+               $serializer = $this->createSerializer();
+
+               $lexeme = NewLexeme::havingId( new LexemeId( 'L1' ) )
+                       ->withLanguage( 'Q1' )
+                       ->withLexicalCategory( 'Q2' )
+                       ->withLemma( 'en', 'color' )
+                       ->withLemma( 'en_gb', 'colour' )
+                       ->withForm(
+                               NewForm::havingId( 'F1' )
+                                       ->andRepresentation( 'en', 'color' )
+                                       ->andRepresentation( 'en_gb', 'colour' )
+                                       ->andGrammaticalFeature( 'Q3' )
+                                       ->andStatement( new 
PropertyNoValueSnak( new PropertyId( 'P1' ) ) )
+                       )->withForm(
+                               NewForm::havingId( 'F2' )
+                                       ->andRepresentation( 'en', 'colors' )
+                                       ->andRepresentation( 'en_gb', 'colours' 
)
+                                       ->andGrammaticalFeature( 'Q4' )
+                                       ->andStatement( new 
PropertySomeValueSnak( new PropertyId( 'P2' ) ) )
+                       )->withSense(
+                               NewSense::havingId( 'S1' )
+                                       ->withGloss(
+                                               'en',
+                                               'the property of an object of 
producing different sensations on the eye'
+                                       )->withStatement(
+                                               new PropertyValueSnak(
+                                                       new PropertyId( 'P3' ),
+                                                       new EntityIdValue( new 
ItemId( 'Q5' ) )
+                                               )
+                                       )
+                       )->withStatement( new PropertySomeValueSnak( new 
PropertyId( 'P4' ) ) )
+                       ->withStatement( new PropertyNoValueSnak( new 
PropertyId( 'P5' ) ) )
+                       ->build();
+
+               $lexemeSerialization = $serializer->serialize( $lexeme );
+
+               $expectedSerialization = [
+                       'type' => 'lexeme',
+                       'id' => 'L1',
+                       'lemmas' => [
+                               'en' => [ 'language' => 'en', 'value' => 
'color' ],
+                               'en_gb' => [ 'language' => 'en_gb', 'value' => 
'colour' ],
+                       ],
+                       'lexicalCategory' => 'Q2',
+                       'language' => 'Q1',
+                       'claims' => [
+                               'P4' => [ [
+                                       'mainsnak' => [
+                                               'snaktype' => 'somevalue',
+                                               'property' => 'P4',
+                                               'hash' => 
'ede91cc55952400386a2401405bb09e446b1867b',
+                                       ],
+                                       'type' => 'statement',
+                                       'rank' => 'normal',
+                               ] ],
+                               'P5' => [ [
+                                       'mainsnak' => [
+                                               'snaktype' => 'novalue',
+                                               'property' => 'P5',
+                                               'hash' => 
'6ee46c6e25606f949a870c84ae6694be8b5d4a02',
+                                       ],
+                                       'type' => 'statement',
+                                       'rank' => 'normal',
+                               ] ],
+                       ],
+                       'nextFormId' => 3,
+                       'forms' => [
+                               [
+                                       'id' => 'F1',
+                                       'representations' => [
+                                               'en' => [ 'language' => 'en', 
'value' => 'color' ],
+                                               'en_gb' => [ 'language' => 
'en_gb', 'value' => 'colour' ],
+                                       ],
+                                       'grammaticalFeatures' => [ 'Q3' ],
+                                       'claims' => [
+                                               'P1' => [ [
+                                                       'mainsnak' => [
+                                                               'snaktype' => 
'novalue',
+                                                               'property' => 
'P1',
+                                                               'hash' => 
'c77761897897f63f151c4a1deb8bd3ad23ac51c6',
+                                                       ],
+                                                       'type' => 'statement',
+                                                       'rank' => 'normal',
+                                               ], ],
+                                       ],
+                               ],
+                               [
+                                       'id' => 'F2',
+                                       'representations' => [
+                                               'en' => [ 'language' => 'en', 
'value' => 'colors' ],
+                                               'en_gb' => [ 'language' => 
'en_gb', 'value' => 'colours' ],
+                                       ],
+                                       'grammaticalFeatures' => [ 'Q4' ],
+                                       'claims' => [
+                                               'P2' => [ [
+                                                       'mainsnak' => [
+                                                               'snaktype' => 
'somevalue',
+                                                               'property' => 
'P2',
+                                                               'hash' => 
'0cf42a63838da890a0b23c220bdb7705ca9c7892',
+                                                       ],
+                                                       'type' => 'statement',
+                                                       'rank' => 'normal',
+                                               ] ],
+                                       ],
+                               ],
+                       ],
+                       'senses' => [
+                               [
+                                       'id' => 'S1',
+                                       'glosses' => [
+                                               'en' => [
+                                                       'language' => 'en',
+                                                       'value' => 'the 
property of an object of producing' .
+                                                               ' different 
sensations on the eye',
+                                               ],
+                                       ],
+                                       'claims' => [
+                                               'P3' => [ [
+                                                       'mainsnak' => [
+                                                               'snaktype' => 
'value',
+                                                               'property' => 
'P3',
+                                                               'hash' => 
'4c2e17bc6d4c930be2beccbf929724b2cd431f3d',
+                                                               'datavalue' => [
+                                                                       'value' 
=> [
+                                                                               
'entity-type' => 'item',
+                                                                               
'numeric-id' => 5,
+                                                                               
'id' => 'Q5',
+                                                                       ],
+                                                                       'type' 
=> 'wikibase-entityid',
+                                                               ],
+                                                       ],
+                                                       'type' => 'statement',
+                                                       'rank' => 'normal',
+                                               ] ],
+                                       ]
+                               ]
+                       ]
+               ];
+
+               $this->assertEquals( $expectedSerialization, 
$lexemeSerialization );
+       }
+
+       /**
+        * @return StorageLexemeSerializer
+        */
+       private function createSerializer() {
+               $serializerFactory = new SerializerFactory(
+                       new DataValueSerializer(),
+                       SerializerFactory::OPTION_DEFAULT
+               );
+               return new StorageLexemeSerializer(
+                       new TermListSerializer( new TermSerializer(), false ),
+                       $serializerFactory->newStatementListSerializer()
+               );
+       }
+
+       /**
+        * @return LexemeDeserializer
+        */
+       private function createDeserializer() {
+               $entityIdParser = new DispatchingEntityIdParser(
+                       [
+                               LexemeId::PATTERN => function ( $s ) {
+                                       return new LexemeId( $s );
+                               },
+                               ItemId::PATTERN => function ( $s ) {
+                                       return new ItemId( $s );
+                               },
+                               PropertyId::PATTERN => function ( $s ) {
+                                       return new PropertyId( $s );
+                               }
+                       ]
+               );
+               $factory = new DeserializerFactory(
+                       $this->newDataValueDeserializer(),
+                       $entityIdParser
+               );
+               $statementListDeserializer = 
$factory->newStatementListDeserializer();
+               return new LexemeDeserializer(
+                       new EntityIdDeserializer( $entityIdParser ),
+                       $statementListDeserializer
+               );
+       }
+
+       /**
+        * @return DataValueDeserializer
+        */
+       private function newDataValueDeserializer() {
+               return new DataValueDeserializer(
+                       [
+                               'number' => NumberValue::class,
+                               'string' => StringValue::class,
+                               'wikibase-entityid' => EntityIdValue::class,
+                       ]
+               );
+       }
+
+}
diff --git a/tests/phpunit/composer/ErisGenerators/LexemeGenerator.php 
b/tests/phpunit/composer/ErisGenerators/LexemeGenerator.php
index 0808a39..6baf51d 100644
--- a/tests/phpunit/composer/ErisGenerators/LexemeGenerator.php
+++ b/tests/phpunit/composer/ErisGenerators/LexemeGenerator.php
@@ -5,6 +5,7 @@
 use Eris\Generator;
 use Eris\Generator\GeneratedValueOptions;
 use Eris\Generator\GeneratedValueSingle;
+use Wikibase\DataModel\Entity\Int32EntityId;
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\DataModel\Term\TermList;
 use Wikibase\Lexeme\DataModel\FormSet;
@@ -15,11 +16,6 @@
  * @license GPL-2.0+
  */
 class LexemeGenerator implements Generator {
-
-       /**
-        * @var LexemeId
-        */
-       private $lexemeId;
 
        /**
         * @var Generator
@@ -41,8 +37,22 @@
         */
        private $formSetGenerator;
 
-       public function __construct( LexemeId $lexemeId ) {
-               $this->lexemeId = $lexemeId;
+       /**
+        * @var Generator
+        */
+       private $lexemeIdGenerator;
+
+       public function __construct( LexemeId $lexemeId = null ) {
+               if ( $lexemeId ) {
+                       $this->lexemeIdGenerator = new 
Generator\ConstantGenerator( $lexemeId );
+               } else {
+                       $this->lexemeIdGenerator = new Generator\MapGenerator(
+                               function ( $number ) {
+                                       return new LexemeId( 'L' . $number );
+                               },
+                               new Generator\ChooseGenerator( 1, 
Int32EntityId::MAX )
+                       );
+               }
 
                $this->languageGenerator = new ItemIdGenerator();
                $this->lexicalCategoryGenerator = new ItemIdGenerator();
@@ -61,11 +71,13 @@
        public function __invoke( $size, $rand ) {
                $size = min( $size, 25 );
 
+               $generateLexemeId = $this->lexemeIdGenerator;
                $generateLanguage = $this->languageGenerator;
                $generateLexicalCategory = $this->lexicalCategoryGenerator;
                $generateLemmaList = $this->lemmaListGenerator;
                $generateFormSet = $this->formSetGenerator;
 
+               $lexemeId = $generateLexemeId( $size, $rand )->unbox();
                $language = $generateLanguage( $size, $rand )->unbox();
                $lexicalCategory = $generateLexicalCategory( $size, $rand 
)->unbox();
                $lemmas = $generateLemmaList( $size, $rand )->unbox();
@@ -76,7 +88,7 @@
 
                $nextFormId = $formSet->maxFormIdNumber() + $counterIncrement;
                $lexeme = new Lexeme(
-                       $this->lexemeId,
+                       $lexemeId,
                        $lemmas,
                        $lexicalCategory,
                        $language,
diff --git a/tests/phpunit/composer/ErisGenerators/WikibaseLexemeGenerators.php 
b/tests/phpunit/composer/ErisGenerators/WikibaseLexemeGenerators.php
index 575ed64..172a318 100644
--- a/tests/phpunit/composer/ErisGenerators/WikibaseLexemeGenerators.php
+++ b/tests/phpunit/composer/ErisGenerators/WikibaseLexemeGenerators.php
@@ -10,7 +10,7 @@
  */
 class WikibaseLexemeGenerators {
 
-       public static function lexeme( LexemeId $lexemeId ) {
+       public static function lexeme( LexemeId $lexemeId = null ) {
                return new LexemeGenerator( $lexemeId );
        }
 
diff --git a/tests/phpunit/mediawiki/Api/LexemeGetEntitiesTest.php 
b/tests/phpunit/mediawiki/Api/LexemeGetEntitiesTest.php
new file mode 100644
index 0000000..e14d4e8
--- /dev/null
+++ b/tests/phpunit/mediawiki/Api/LexemeGetEntitiesTest.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Wikibase\Lexeme\Tests\MediaWiki\Api;
+
+use User;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Term\Term;
+use Wikibase\DataModel\Term\TermList;
+use Wikibase\Lexeme\DataModel\Lexeme;
+use Wikibase\Lexeme\DataModel\LexemeId;
+use Wikibase\Repo\Tests\Api\WikibaseApiTestCase;
+use Wikibase\Repo\WikibaseRepo;
+
+/**
+ * @license GPL-2.0+
+ *
+ * @group Database
+ * @group medium
+ * @group WikibaseLexeme
+ */
+class LexemeGetEntitiesTest extends WikibaseApiTestCase {
+
+       const LEXEME_ID = 'L1200';
+
+       public function testNextFormIdIsNotIncludedInLexemeData() {
+               $this->saveDummyLexemeToDatabase();
+
+               list ( $result, ) = $this->doApiRequest( [
+                       'action' => 'wbgetentities',
+                       'ids' => self::LEXEME_ID,
+               ] );
+
+               $this->assertArrayNotHasKey( 'nextFormId', 
$result['entities'][self::LEXEME_ID] );
+       }
+
+       private function saveDummyLexemeToDatabase() {
+               $lexeme = new Lexeme(
+                       new LexemeId( self::LEXEME_ID ),
+                       new TermList( [
+                               new Term( 'en', 'goat' ),
+                       ] ),
+                       new ItemId( 'Q303' ),
+                       new ItemId( 'Q808' )
+               );
+
+               $store = WikibaseRepo::getDefaultInstance()->getEntityStore();
+
+               $store->saveEntity( $lexeme, self::class, $this->getMock( 
User::class ) );
+       }
+
+}
diff --git 
a/tests/phpunit/mediawiki/DataModel/Serialization/LexemeDeserializerTest.php 
b/tests/phpunit/mediawiki/DataModel/Serialization/LexemeDeserializerTest.php
index 545e946..5a8dacf 100644
--- a/tests/phpunit/mediawiki/DataModel/Serialization/LexemeDeserializerTest.php
+++ b/tests/phpunit/mediawiki/DataModel/Serialization/LexemeDeserializerTest.php
@@ -158,7 +158,8 @@
                                                'id' => 'F1',
                                                'representations' => [
                                                        'en' => [ 'language' => 
'en', 'value' => 'form' ]
-                                               ]
+                                               ],
+                                               'grammaticalFeatures' => []
                                        ]
                                ],
                        ],

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I83ec9f2bf45196b8f93a554b7a90cc307a1294dd
Gerrit-PatchSet: 24
Gerrit-Project: mediawiki/extensions/WikibaseLexeme
Gerrit-Branch: master
Gerrit-Owner: WMDE-leszek <[email protected]>
Gerrit-Reviewer: Aleksey Bekh-Ivanov (WMDE) <[email protected]>
Gerrit-Reviewer: Jakob <[email protected]>
Gerrit-Reviewer: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: Ladsgroup <[email protected]>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: WMDE-leszek <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to