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