WMDE-leszek has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/405316 )

Change subject: Set summary when editing form elements with the UI-dedicated 
API.
......................................................................

Set summary when editing form elements with the UI-dedicated API.

Bug: T184702
Change-Id: Iccb01836d871789be64c29c42d6edfff7ba0b0b1
---
A src/Api/AddGrammaticalFeatureSummary.php
A src/Api/AddRepresentationSummary.php
M src/Api/EditFormElements.php
D src/Api/EditFormElementsSummary.php
A src/Api/EditFormElementsSummaryFormatter.php
A src/Api/RemoveGrammaticalFeatureSummary.php
A src/Api/RemoveRepresentationSummary.php
A src/Api/SetRepresentationSummary.php
M src/ChangeOp/ChangeOpEditFormElements.php
M tests/phpunit/mediawiki/Api/EditFormElementsTest.php
10 files changed, 632 insertions(+), 45 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseLexeme 
refs/changes/16/405316/1

diff --git a/src/Api/AddGrammaticalFeatureSummary.php 
b/src/Api/AddGrammaticalFeatureSummary.php
new file mode 100644
index 0000000..884d1a5
--- /dev/null
+++ b/src/Api/AddGrammaticalFeatureSummary.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace Wikibase\Lexeme\Api;
+
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\Lexeme\DataModel\FormId;
+use Wikibase\Lib\FormatableSummary;
+
+/**
+ * @license GPL-2.0+
+ */
+class AddGrammaticalFeatureSummary implements FormatableSummary {
+
+       /**
+        * @var FormId
+        */
+       private $formId;
+
+       /**
+        * @var ItemId[]
+        */
+       private $addedFeatures;
+
+       public function __construct( FormId $formId, array $addedFeatures ) {
+               $this->formId = $formId;
+               $this->addedFeatures = $addedFeatures;
+       }
+
+       public function getUserSummary() {
+               return null;
+       }
+
+       public function getLanguageCode() {
+               return null;
+       }
+
+       public function getMessageKey() {
+               /** @see "wikibase-lexeme-summary-add-form-grammatical-feature" 
message */
+               return 'add-form-grammatical-feature';
+       }
+
+       public function getCommentArgs() {
+               return array_merge(
+                       [ $this->formId->getSerialization() ],
+                       array_map(
+                               function ( ItemId $feature ) {
+                                       return $feature->getSerialization();
+                               },
+                               $this->addedFeatures
+                       )
+               );
+       }
+
+       public function getAutoSummaryArgs() {
+               return [];
+       }
+
+}
diff --git a/src/Api/AddRepresentationSummary.php 
b/src/Api/AddRepresentationSummary.php
new file mode 100644
index 0000000..781b09c
--- /dev/null
+++ b/src/Api/AddRepresentationSummary.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Wikibase\Lexeme\Api;
+
+use Wikibase\DataModel\Term\Term;
+use Wikibase\Lexeme\DataModel\FormId;
+use Wikibase\Lib\FormatableSummary;
+
+/**
+ * @license GPL-2.0+
+ */
+class AddRepresentationSummary implements FormatableSummary {
+
+       /**
+        * @var FormId
+        */
+       private $formId;
+
+       /**
+        * @var Term
+        */
+       private $addedRepresentation;
+
+       public function __construct( FormId $formId, Term $addedRepresentation 
) {
+               $this->formId = $formId;
+               $this->addedRepresentation = $addedRepresentation;
+       }
+
+       public function getUserSummary() {
+               return null;
+       }
+
+       public function getLanguageCode() {
+               return $this->addedRepresentation->getLanguageCode(); // TODO: 
????
+       }
+
+       public function getMessageKey() {
+               /** @see "wikibase-lexeme-summary-add-form-representation" 
message */
+               return 'add-form-representation';
+       }
+
+       public function getCommentArgs() {
+               return [ $this->formId->getSerialization() ];
+       }
+
+       public function getAutoSummaryArgs() {
+               return [ $this->addedRepresentation->getText() ];
+       }
+
+}
diff --git a/src/Api/EditFormElements.php b/src/Api/EditFormElements.php
index 5eb2068..40866b1 100644
--- a/src/Api/EditFormElements.php
+++ b/src/Api/EditFormElements.php
@@ -7,6 +7,7 @@
 use Wikibase\Lexeme\Api\Error\FormNotFound;
 use Wikibase\Lexeme\DataModel\Form;
 use Wikibase\Lexeme\DataModel\Serialization\FormSerializer;
+use Wikibase\Lib\FormatableSummary;
 use Wikibase\Lib\Store\EntityRevisionLookup;
 use Wikibase\Repo\WikibaseRepo;
 use Wikibase\SummaryFormatter;
@@ -32,7 +33,7 @@
        private $requestParser;
 
        /**
-        * @var SummaryFormatter
+        * @var EditFormElementsSummaryFormatter
         */
        private $summaryFormatter;
 
@@ -57,7 +58,7 @@
                        $wikibaseRepo->getEntityRevisionLookup( 'uncached' ),
                        $wikibaseRepo->newEditEntityFactory( 
$mainModule->getContext() ),
                        new EditFormElementsRequestParser( 
$wikibaseRepo->getEntityIdParser() ),
-                       $wikibaseRepo->getSummaryFormatter(),
+                       new EditFormElementsSummaryFormatter( 
$wikibaseRepo->getSummaryFormatter() ),
                        $formSerializer
                );
        }
@@ -68,7 +69,7 @@
                EntityRevisionLookup $entityRevisionLookup,
                EditEntityFactory $editEntityFactory,
                EditFormElementsRequestParser $requestParser,
-               SummaryFormatter $summaryFormatter,
+               EditFormElementsSummaryFormatter $summaryFormatter,
                FormSerializer $formSerializer
        ) {
                parent::__construct( $mainModule, $moduleName );
@@ -107,11 +108,12 @@
                $form = $formRevision->getEntity();
 
                $changeOp = $request->getChangeOp();
-               $summary = new EditFormElementsSummary();
-               // TODO: We can not use summary in the changeop, we should
+               // TODO: We can not use Summary, as the summary of this action 
is incompatible
+               // with logic encoded in Summary
+               $summaryParts = $changeOp->generateSummaryWhenAppliedToForm( 
$form );
                $changeOp->apply( $form );
 
-               $status = $this->saveForm( $form, $summary, 
$formRevision->getRevisionId(), $params );
+               $status = $this->saveForm( $form, $summaryParts, 
$formRevision->getRevisionId(), $params );
 
                if ( !$status->isGood() ) {
                        $this->dieStatus( $status );
@@ -122,14 +124,14 @@
 
        /**
         * @param Form $form
-        * @param EditFormElementsSummary $summary
+        * @param FormatableSummary[] $summaryParts
         * @param int $baseRevisionId
         * @param array $params
         * @return \Status
         */
        private function saveForm(
                Form $form,
-               EditFormElementsSummary $summary,
+               array $summaryParts,
                $baseRevisionId,
                array $params
        ) {
@@ -148,7 +150,7 @@
                $tokenThatDoesNotNeedChecking = false;
                return $editEntity->attemptSave(
                        $form,
-                       $this->summaryFormatter->formatSummary( $summary ),
+                       $this->summaryFormatter->format( $summaryParts ),
                        $flags,
                        $tokenThatDoesNotNeedChecking
                );
diff --git a/src/Api/EditFormElementsSummary.php 
b/src/Api/EditFormElementsSummary.php
deleted file mode 100644
index 134d886..0000000
--- a/src/Api/EditFormElementsSummary.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-namespace Wikibase\Lexeme\Api;
-
-use Wikibase\Lib\FormatableSummary;
-
-/**
- * @license GPL-2.0+
- */
-class EditFormElementsSummary implements FormatableSummary {
-
-       public function getUserSummary() {
-               return null;
-       }
-
-       public function getLanguageCode() {
-               return null;
-       }
-
-       public function getMessageKey() {
-               /** @see "wikibase-lexeme-summary-set-form" message */
-               return 'set-form';
-       }
-
-       public function getCommentArgs() {
-               return [];
-       }
-
-       public function getAutoSummaryArgs() {
-               return [];
-       }
-
-}
diff --git a/src/Api/EditFormElementsSummaryFormatter.php 
b/src/Api/EditFormElementsSummaryFormatter.php
new file mode 100644
index 0000000..8717bc3
--- /dev/null
+++ b/src/Api/EditFormElementsSummaryFormatter.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Wikibase\Lexeme\Api;
+
+use Wikibase\Lib\FormatableSummary;
+use Wikibase\SummaryFormatter;
+
+/**
+ * @license GPL-2.0+
+ */
+class EditFormElementsSummaryFormatter {
+
+       private $formatter;
+
+       public function __construct( SummaryFormatter $formatter ) {
+               $this->formatter = $formatter;
+       }
+
+       /**
+        * @param FormatableSummary[] $summaryParts
+        * @return string
+        */
+       public function format( array $summaryParts ) {
+               $summary = '';
+
+               foreach ( $summaryParts as $part ) {
+                       if ( $summary ) {
+                               $summary .= ' ';
+                       }
+                       $summary .= $this->formatter->formatSummary( $part );
+               }
+               return $summary;
+       }
+
+}
diff --git a/src/Api/RemoveGrammaticalFeatureSummary.php 
b/src/Api/RemoveGrammaticalFeatureSummary.php
new file mode 100644
index 0000000..2a5825a
--- /dev/null
+++ b/src/Api/RemoveGrammaticalFeatureSummary.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace Wikibase\Lexeme\Api;
+
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\Lexeme\DataModel\FormId;
+use Wikibase\Lib\FormatableSummary;
+
+/**
+ * @license GPL-2.0+
+ */
+class RemoveGrammaticalFeatureSummary implements FormatableSummary {
+
+       /**
+        * @var FormId
+        */
+       private $formId;
+
+       /**
+        * @var ItemId[]
+        */
+       private $removedFeatures;
+
+       public function __construct( FormId $formId, array $removedFeatures ) {
+               $this->formId = $formId;
+               $this->removedFeatures = $removedFeatures;
+       }
+
+       public function getUserSummary() {
+               return null;
+       }
+
+       public function getLanguageCode() {
+               return null;
+       }
+
+       public function getMessageKey() {
+               /** @see 
"wikibase-lexeme-summary-remove-form-grammatical-feature" message */
+               return 'remove-form-grammatical-feature';
+       }
+
+       public function getCommentArgs() {
+               return array_merge(
+                       [ $this->formId->getSerialization() ],
+                       array_map(
+                               function ( ItemId $feature ) {
+                                       return $feature->getSerialization();
+                               },
+                               $this->removedFeatures
+                       )
+               );
+       }
+
+       public function getAutoSummaryArgs() {
+               return [];
+       }
+
+}
diff --git a/src/Api/RemoveRepresentationSummary.php 
b/src/Api/RemoveRepresentationSummary.php
new file mode 100644
index 0000000..8293c68
--- /dev/null
+++ b/src/Api/RemoveRepresentationSummary.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Wikibase\Lexeme\Api;
+
+use Wikibase\DataModel\Term\Term;
+use Wikibase\Lexeme\DataModel\FormId;
+use Wikibase\Lib\FormatableSummary;
+
+/**
+ * @license GPL-2.0+
+ */
+class RemoveRepresentationSummary implements FormatableSummary {
+
+       /**
+        * @var FormId
+        */
+       private $formId;
+
+       /**
+        * @var Term
+        */
+       private $removedRepresentation;
+
+       public function __construct( FormId $formId, Term 
$removedRepresentation ) {
+               $this->formId = $formId;
+               $this->removedRepresentation = $removedRepresentation;
+       }
+
+       public function getUserSummary() {
+               return null;
+       }
+
+       public function getLanguageCode() {
+               return $this->removedRepresentation->getLanguageCode(); // 
TODO: ????
+       }
+
+       public function getMessageKey() {
+               /** @see "wikibase-lexeme-summary-remove-form-representation" 
message */
+               return 'remove-form-representation';
+       }
+
+       public function getCommentArgs() {
+               return [ $this->formId->getSerialization() ];
+       }
+
+       public function getAutoSummaryArgs() {
+               return [ $this->removedRepresentation->getText() ];
+       }
+
+}
diff --git a/src/Api/SetRepresentationSummary.php 
b/src/Api/SetRepresentationSummary.php
new file mode 100644
index 0000000..c855d3d
--- /dev/null
+++ b/src/Api/SetRepresentationSummary.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Wikibase\Lexeme\Api;
+
+use Wikibase\Lexeme\DataModel\FormId;
+use Wikibase\Lib\FormatableSummary;
+
+/**
+ * @license GPL-2.0+
+ */
+class SetRepresentationSummary implements FormatableSummary {
+
+       /**
+        * @var FormId
+        */
+       private $formId;
+
+       /**
+        * @var string
+        */
+       private $languageCode;
+
+       /**
+        * @var string
+        */
+       private $representation;
+
+       /**
+        * @param FormId $formId
+        * @param string $languageCode
+        * @param string $representation
+        */
+       public function __construct( FormId $formId, $languageCode, 
$representation ) {
+               $this->formId = $formId;
+               $this->languageCode = $languageCode;
+               $this->representation = $representation;
+       }
+
+       public function getUserSummary() {
+               return null;
+       }
+
+       public function getLanguageCode() {
+               return $this->languageCode; // TODO: ????
+       }
+
+       public function getMessageKey() {
+               /** @see "wikibase-lexeme-summary-set-form-representation" 
message */
+               return 'set-form-representation';
+       }
+
+       public function getCommentArgs() {
+               return [ $this->formId->getSerialization() ];
+       }
+
+       public function getAutoSummaryArgs() {
+               return [ $this->representation ];
+       }
+
+}
diff --git a/src/ChangeOp/ChangeOpEditFormElements.php 
b/src/ChangeOp/ChangeOpEditFormElements.php
index b31ed8a..21b73c6 100644
--- a/src/ChangeOp/ChangeOpEditFormElements.php
+++ b/src/ChangeOp/ChangeOpEditFormElements.php
@@ -5,8 +5,15 @@
 use ValueValidators\Result;
 use Wikibase\DataModel\Entity\EntityDocument;
 use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Term\Term;
 use Wikibase\DataModel\Term\TermList;
+use Wikibase\Lexeme\Api\AddGrammaticalFeatureSummary;
+use Wikibase\Lexeme\Api\AddRepresentationSummary;
+use Wikibase\Lexeme\Api\RemoveGrammaticalFeatureSummary;
+use Wikibase\Lexeme\Api\RemoveRepresentationSummary;
+use Wikibase\Lexeme\Api\SetRepresentationSummary;
 use Wikibase\Lexeme\DataModel\Form;
+use Wikibase\Lib\FormatableSummary;
 use Wikibase\Repo\ChangeOp\ChangeOp;
 use Wikibase\Repo\Store\EntityPermissionChecker;
 use Wikibase\Summary;
@@ -54,4 +61,84 @@
                return [ EntityPermissionChecker::ACTION_EDIT ];
        }
 
+       public function generateSummaryWhenAppliedToForm( Form $form ) {
+               return array_merge(
+                       $this->getRepresentationSummaries( $form ),
+                       $this->getGrammaticalFeatureSummaries( $form )
+               );
+       }
+
+       /**
+        * @param Form $form
+        * @return FormatableSummary[]
+        */
+       private function getRepresentationSummaries( Form $form ) {
+               $summaries = [];
+
+               $addedRepresentations = [];
+               $changedRepresentations = [];
+               $removedRepresentations = [];
+
+               $existingRepresentations = $form->getRepresentations();
+               foreach ( $this->representations->getIterator() as 
$representation ) {
+                       if ( !$existingRepresentations->hasTermForLanguage( 
$representation->getLanguageCode() ) ) {
+                               $addedRepresentations[] = $representation;
+                               continue;
+                       }
+
+                       if ( !$existingRepresentations->getByLanguage( 
$representation->getLanguageCode() )->equals(
+                               $representation
+                       ) ) {
+                               $changedRepresentations[] = $representation;
+                       }
+               }
+               foreach ( $existingRepresentations->getIterator() as 
$representation ) {
+                       if ( !$this->representations->hasTermForLanguage( 
$representation->getLanguageCode() ) ) {
+                               $removedRepresentations[] = $representation;
+                       }
+               }
+
+               $formId = $form->getId();
+
+               foreach ( $addedRepresentations as $representation ) {
+                       $summaries[] = new AddRepresentationSummary( $formId, 
$representation );
+               }
+               foreach ( $changedRepresentations as $representation ) {
+                       /** @var Term $representation */
+                       $summaries[] = new SetRepresentationSummary(
+                               $formId,
+                               $representation->getLanguageCode(),
+                               $representation->getText()
+                       );
+               }
+               foreach ( $removedRepresentations as $representation ) {
+                       $summaries[] = new RemoveRepresentationSummary( 
$formId, $representation );
+               }
+               return $summaries;
+       }
+
+       /**
+        * @param Form $form
+        * @return FormatableSummary[]
+        */
+       private function getGrammaticalFeatureSummaries( Form $form ) {
+
+               $existingFeatures = $form->getGrammaticalFeatures();
+
+               $addedFeatures = array_diff( $this->grammaticalFeatures, 
$existingFeatures );
+               $removedFeatures = array_diff( $existingFeatures, 
$this->grammaticalFeatures );
+
+               $formId = $form->getId();
+
+               $summaries = [];
+               if ( $addedFeatures ) {
+                       $summaries[] = new AddGrammaticalFeatureSummary( 
$formId, $addedFeatures );
+               }
+               if ( $removedFeatures ) {
+                       $summaries[] = new RemoveGrammaticalFeatureSummary( 
$formId, $removedFeatures );
+               }
+
+               return $summaries;
+       }
+
 }
diff --git a/tests/phpunit/mediawiki/Api/EditFormElementsTest.php 
b/tests/phpunit/mediawiki/Api/EditFormElementsTest.php
index b6e3fb7..0ba8675 100644
--- a/tests/phpunit/mediawiki/Api/EditFormElementsTest.php
+++ b/tests/phpunit/mediawiki/Api/EditFormElementsTest.php
@@ -4,12 +4,14 @@
 
 use ApiMessage;
 use ApiUsageException;
+use MediaWiki\MediaWikiServices;
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\Lexeme\DataModel\FormId;
 use Wikibase\Lexeme\DataModel\Lexeme;
 use Wikibase\Lexeme\DataModel\LexemeId;
 use Wikibase\Lexeme\Tests\DataModel\NewForm;
 use Wikibase\Lexeme\Tests\DataModel\NewLexeme;
+use Wikibase\Lib\Store\EntityRevision;
 use Wikibase\Repo\Tests\Api\WikibaseApiTestCase;
 use Wikibase\Repo\WikibaseRepo;
 
@@ -22,6 +24,13 @@
  * @group medium
  */
 class EditFormElementsTest extends WikibaseApiTestCase {
+
+       public function setUp() {
+               parent::setUp();
+
+               $this->tablesUsed[] = 'page';
+               $this->tablesUsed[] = 'revision';
+       }
 
        /**
         * @dataProvider provideInvalidParams
@@ -297,7 +306,209 @@
                $this->assertEmpty( $form->getGrammaticalFeatures() );
        }
 
-       // TODO: test summary once its set!
+       public function testGivenChangedRepresentation_summarySetAccordingly() {
+               $form = NewForm::havingId( 'F1' )->andRepresentation( 'en', 
'goat' )->build();
+               $lexeme = NewLexeme::havingId( 'L1' )->withForm( $form 
)->build();
+
+               $this->saveLexeme( $lexeme );
+
+               $params = [
+                       'action' => 'wblexemeeditformelements',
+                       'formId' => 'L1-F1',
+                       'data' => json_encode( [
+                               'representations' => [
+                                       [ 'language' => 'en', 'representation' 
=> 'goadth' ],
+                               ],
+                               'grammaticalFeatures' => [],
+                       ] ),
+               ];
+
+               $this->doApiRequestWithToken( $params );
+
+               $formRevision = $this->getCurrentRevisionForForm( 'L1-F1' );
+
+               $revision = 
MediaWikiServices::getInstance()->getRevisionStore()->getRevisionById(
+                       $formRevision->getRevisionId()
+               );
+
+               $this->assertEquals(
+                       '/* set-form-representation:1|en|L1-F1 */ goadth',
+                       $revision->getComment()->text
+               );
+       }
+
+       public function 
testGivenAddedRepresentationInNewLanguage_summarySetAccordingly() {
+               $form = NewForm::havingId( 'F1' )
+                       ->andRepresentation( 'en', 'colour' )
+                       ->build();
+               $lexeme = NewLexeme::havingId( 'L1' )->withForm( $form 
)->build();
+
+               $this->saveLexeme( $lexeme );
+
+               $params = [
+                       'action' => 'wblexemeeditformelements',
+                       'formId' => 'L1-F1',
+                       'data' => json_encode( [
+                               'representations' => [
+                                       [ 'language' => 'en', 'representation' 
=> 'colour' ],
+                                       [ 'language' => 'en-us', 
'representation' => 'color' ],
+                               ],
+                               'grammaticalFeatures' => [],
+                       ] ),
+               ];
+
+               $this->doApiRequestWithToken( $params );
+
+               $formRevision = $this->getCurrentRevisionForForm( 'L1-F1' );
+
+               $revision = 
MediaWikiServices::getInstance()->getRevisionStore()->getRevisionById(
+                       $formRevision->getRevisionId()
+               );
+
+               $this->assertEquals(
+                       '/* add-form-representation:1|en-us|L1-F1 */ color',
+                       $revision->getComment()->text
+               );
+       }
+
+       public function testGivenRemovedRepresentation_summarySetAccordingly() {
+               $form = NewForm::havingId( 'F1' )
+                       ->andRepresentation( 'en', 'colour' )
+                       ->andRepresentation( 'en-us', 'color' )
+                       ->build();
+               $lexeme = NewLexeme::havingId( 'L1' )->withForm( $form 
)->build();
+
+               $this->saveLexeme( $lexeme );
+
+               $params = [
+                       'action' => 'wblexemeeditformelements',
+                       'formId' => 'L1-F1',
+                       'data' => json_encode( [
+                               'representations' => [
+                                       [ 'language' => 'en', 'representation' 
=> 'colour' ],
+                               ],
+                               'grammaticalFeatures' => [],
+                       ] ),
+               ];
+
+               $this->doApiRequestWithToken( $params );
+
+               $formRevision = $this->getCurrentRevisionForForm( 'L1-F1' );
+
+               $revision = 
MediaWikiServices::getInstance()->getRevisionStore()->getRevisionById(
+                       $formRevision->getRevisionId()
+               );
+
+               $this->assertEquals(
+                       '/* remove-form-representation:1|en-us|L1-F1 */ color',
+                       $revision->getComment()->text
+               );
+       }
+
+       public function 
testGivenAddedGrammaticalFeature_summarySetAccordingly() {
+               $form = NewForm::havingId( 'F1' )
+                       ->andGrammaticalFeature( 'Q123' )
+                       ->andRepresentation( 'en', 'goat' )
+                       ->build();
+               $lexeme = NewLexeme::havingId( 'L1' )->withForm( $form 
)->build();
+
+               $this->saveLexeme( $lexeme );
+
+               $params = [
+                       'action' => 'wblexemeeditformelements',
+                       'formId' => 'L1-F1',
+                       'data' => json_encode( [
+                               'representations' => [
+                                       [ 'language' => 'en', 'representation' 
=> 'goat' ],
+                               ],
+                               'grammaticalFeatures' => [ 'Q123', 'Q678' ],
+                       ] ),
+               ];
+
+               $this->doApiRequestWithToken( $params );
+
+               $formRevision = $this->getCurrentRevisionForForm( 'L1-F1' );
+
+               $revision = 
MediaWikiServices::getInstance()->getRevisionStore()->getRevisionById(
+                       $formRevision->getRevisionId()
+               );
+
+               $this->assertEquals(
+                       '/* add-form-grammatical-feature:0||L1-F1|Q678 */',
+                       $revision->getComment()->text
+               );
+       }
+
+       public function 
testGivenRemovedGrammaticalFeature_summarySetAccordingly() {
+               $form = NewForm::havingId( 'F1' )
+                       ->andGrammaticalFeature( 'Q123' )
+                       ->andRepresentation( 'en', 'goat' )
+                       ->build();
+               $lexeme = NewLexeme::havingId( 'L1' )->withForm( $form 
)->build();
+
+               $this->saveLexeme( $lexeme );
+
+               $params = [
+                       'action' => 'wblexemeeditformelements',
+                       'formId' => 'L1-F1',
+                       'data' => json_encode( [
+                               'representations' => [
+                                       [ 'language' => 'en', 'representation' 
=> 'goat' ],
+                               ],
+                               'grammaticalFeatures' => [],
+                       ] ),
+               ];
+
+               $this->doApiRequestWithToken( $params );
+
+               $formRevision = $this->getCurrentRevisionForForm( 'L1-F1' );
+
+               $revision = 
MediaWikiServices::getInstance()->getRevisionStore()->getRevisionById(
+                       $formRevision->getRevisionId()
+               );
+
+               $this->assertEquals(
+                       '/* remove-form-grammatical-feature:0||L1-F1|Q123 */',
+                       $revision->getComment()->text
+               );
+       }
+
+       public function 
testGivenSeveralPartsChanges_summaryContainsAllChanges() {
+               $form = NewForm::havingId( 'F1' )
+                       ->andRepresentation( 'en', 'colour' )
+                       ->andGrammaticalFeature( 'Q123' )
+                       ->build();
+               $lexeme = NewLexeme::havingId( 'L1' )->withForm( $form 
)->build();
+
+               $this->saveLexeme( $lexeme );
+
+               $params = [
+                       'action' => 'wblexemeeditformelements',
+                       'formId' => 'L1-F1',
+                       'data' => json_encode( [
+                               'representations' => [
+                                       [ 'language' => 'en', 'representation' 
=> 'colour' ],
+                                       [ 'language' => 'en-us', 
'representation' => 'color' ],
+                               ],
+                               'grammaticalFeatures' => [ 'Q678' ],
+                       ] ),
+               ];
+
+               $this->doApiRequestWithToken( $params );
+
+               $formRevision = $this->getCurrentRevisionForForm( 'L1-F1' );
+
+               $revision = 
MediaWikiServices::getInstance()->getRevisionStore()->getRevisionById(
+                       $formRevision->getRevisionId()
+               );
+
+               $this->assertEquals(
+                       '/* add-form-representation:1|en-us|L1-F1 */ color ' .
+                       '/* add-form-grammatical-feature:0||L1-F1|Q678 */ ' .
+                       '/* remove-form-grammatical-feature:0||L1-F1|Q123 */',
+                       $revision->getComment()->text
+               );
+       }
 
        public function testGivenFormEdited_responseContainsSuccessMarker() {
                $form = NewForm::havingId( 'F1' )
@@ -354,8 +565,6 @@
                );
        }
 
-       // TODO: test API response contains the revision ID
-
        private function saveLexeme( Lexeme $lexeme ) {
                $store = WikibaseRepo::getDefaultInstance()->getEntityStore();
 
@@ -372,4 +581,15 @@
                return $lookup->getEntity( new LexemeId( $id ) );
        }
 
+       /**
+        * @param string $id
+        *
+        * @return EntityRevision|null
+        */
+       private function getCurrentRevisionForForm( $id ) {
+               $lookup = 
WikibaseRepo::getDefaultInstance()->getEntityRevisionLookup();
+
+               return $lookup->getEntityRevision( new FormId( $id ) );
+       }
+
 }

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iccb01836d871789be64c29c42d6edfff7ba0b0b1
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/WikibaseLexeme
Gerrit-Branch: master
Gerrit-Owner: WMDE-leszek <leszek.mani...@wikimedia.de>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to