Lucas Werkmeister (WMDE) has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/405721 )
Change subject: Add tests for ConstraintParameterRenderer ...................................................................... Add tests for ConstraintParameterRenderer This adds tests for all the methods of ConstraintParameterRenderer which are called by constraint checkers or ConstraintParameterParser. On the other hand, the formatValue and formatParameters methods are only used for the special page (and by the API if the “detail” and “detailHTML” fields are included), and might be removed completely depending on the outcome of T185091. Bug: T169121 Change-Id: Ifb48530ac0fe26ec1866a8c766c7198a5853d9bc --- A tests/phpunit/ConstraintParameterRendererTest.php 1 file changed, 654 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseQualityConstraints refs/changes/21/405721/1 diff --git a/tests/phpunit/ConstraintParameterRendererTest.php b/tests/phpunit/ConstraintParameterRendererTest.php new file mode 100644 index 0000000..0bd1edc --- /dev/null +++ b/tests/phpunit/ConstraintParameterRendererTest.php @@ -0,0 +1,654 @@ +<?php + +namespace WikibaseQuality\ConstraintReport\Tests; + +use DataValues\StringValue; +use HashConfig; +use ValueFormatters\StringFormatter; +use ValueFormatters\ValueFormatter; +use Wikibase\DataModel\Entity\ItemId; +use Wikibase\DataModel\Entity\PropertyId; +use Wikibase\DataModel\Services\EntityId\EntityIdFormatter; +use Wikibase\DataModel\Services\EntityId\PlainEntityIdFormatter; +use WikibaseQuality\ConstraintReport\ConstraintCheck\Context\Context; +use WikibaseQuality\ConstraintReport\ConstraintCheck\ItemIdSnakValue; +use WikibaseQuality\ConstraintReport\ConstraintParameterRenderer; +use WikibaseQuality\ConstraintReport\Role; + +/** + * @covers WikibaseQuality\ConstraintReport\ConstraintParameterRenderer + * + * @group WikibaseQualityConstraints + * + * @author Lucas Werkmeister + * @license GNU GPL v2+ + */ +class ConstraintParameterRendererTest extends \PHPUnit_Framework_TestCase { + + use DefaultConfig; + + public function testFormatByRole_Null() { + $role = null; + $value = 'foo <bar ""baz'; + + $formatted = ConstraintParameterRenderer::formatByRole( $role, $value ); + + $this->assertSame( $value, $formatted ); + } + + public function testFormatByRole_Subject() { + $role = Role::SUBJECT; + $value = 'foo <bar ""baz'; + + $formatted = ConstraintParameterRenderer::formatByRole( $role, $value ); + + $this->assertSame( + '<span class="wbqc-role wbqc-role-subject">'. $value . '</span>', + $formatted + ); + } + + public function testFormatDataValue() { + $role = Role::OBJECT; + $value = new StringValue( 'a test string' ); + $valueFormatter = $this->getMock( ValueFormatter::class ); + $valueFormatter->expects( $this->once() ) + ->method( 'format' ) + ->with( $value ) + ->willReturn( '<span class="wikibase-string">a test string</span>' ); + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + $valueFormatter, + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatDataValue( $value, $role ); + + $this->assertSame( + '<span class="wbqc-role wbqc-role-object">' . + '<span class="wikibase-string">a test string</span>' . + '</span>', + $formatted + ); + } + + public function testFormatEntityId() { + $role = Role::PREDICATE; + $value = new PropertyId( 'P1234' ); + $entityIdFormatter = $this->getMock( EntityIdFormatter::class ); + $entityIdFormatter->expects( $this->once() ) + ->method( 'formatEntityId' ) + ->with( $value ) + ->willReturn( '<span class="wikibase-entity-id">some property</span>' ); + $constraintParameterRenderer = new ConstraintParameterRenderer( + $entityIdFormatter, + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatEntityId( $value, $role ); + + $this->assertSame( + '<span class="wbqc-role wbqc-role-predicate">' . + '<span class="wikibase-entity-id">some property</span>' . + '</span>', + $formatted + ); + } + + public function testFormatPropertyId_PropertyId() { + $value = new PropertyId( 'P1234' ); + $constraintParameterRenderer = $this->getMockBuilder( ConstraintParameterRenderer::class ) + ->disableOriginalConstructor() + ->setMethods( [ 'formatEntityId' ] ) + ->getMock(); + $constraintParameterRenderer->expects( $this->once() ) + ->method( 'formatEntityId' ) + ->with( $value ) + ->willReturn( 'some property' ); + + $formatted = $constraintParameterRenderer->formatPropertyId( $value ); + + $this->assertSame( 'some property', $formatted ); + } + + public function testFormatPropertyId_PropertyIdSerialization() { + $value = 'P1234'; + $constraintParameterRenderer = $this->getMockBuilder( ConstraintParameterRenderer::class ) + ->disableOriginalConstructor() + ->setMethods( [ 'formatEntityId' ] ) + ->getMock(); + $constraintParameterRenderer->expects( $this->once() ) + ->method( 'formatEntityId' ) + ->willReturnCallback( function ( PropertyId $propertyId ) use ( $value ) { + $this->assertSame( $value, $propertyId->getSerialization() ); + return 'some property'; + } ); + + $formatted = $constraintParameterRenderer->formatPropertyId( $value ); + + $this->assertSame( 'some property', $formatted ); + } + + public function testFormatPropertyId_OtherString() { + $value = 'some property'; + $constraintParameterRenderer = $this->getMockBuilder( ConstraintParameterRenderer::class ) + ->disableOriginalConstructor() + ->setMethods( [ 'formatEntityId' ] ) + ->getMock(); + $constraintParameterRenderer->expects( $this->never() )->method( 'formatEntityId' ); + + $formatted = $constraintParameterRenderer->formatPropertyId( $value ); + + $this->assertSame( 'some property', $formatted ); + } + + public function testFormatItemId_ItemId() { + $value = new ItemId( 'Q1234' ); + $constraintParameterRenderer = $this->getMockBuilder( ConstraintParameterRenderer::class ) + ->disableOriginalConstructor() + ->setMethods( [ 'formatEntityId' ] ) + ->getMock(); + $constraintParameterRenderer->expects( $this->once() ) + ->method( 'formatEntityId' ) + ->with( $value ) + ->willReturn( 'some item' ); + + $formatted = $constraintParameterRenderer->formatItemId( $value ); + + $this->assertSame( 'some item', $formatted ); + } + + public function testFormatItemId_ItemIdSerialization() { + $value = 'Q1234'; + $constraintParameterRenderer = $this->getMockBuilder( ConstraintParameterRenderer::class ) + ->disableOriginalConstructor() + ->setMethods( [ 'formatEntityId' ] ) + ->getMock(); + $constraintParameterRenderer->expects( $this->once() ) + ->method( 'formatEntityId' ) + ->willReturnCallback( function ( ItemId $itemId ) use ( $value ) { + $this->assertSame( $value, $itemId->getSerialization() ); + return 'some item'; + } ); + + $formatted = $constraintParameterRenderer->formatItemId( $value ); + + $this->assertSame( 'some item', $formatted ); + } + + public function testFormatItemId_OtherString() { + $value = 'some item'; + $constraintParameterRenderer = $this->getMockBuilder( ConstraintParameterRenderer::class ) + ->disableOriginalConstructor() + ->setMethods( [ 'formatEntityId' ] ) + ->getMock(); + $constraintParameterRenderer->expects( $this->never() )->method( 'formatEntityId' ); + + $formatted = $constraintParameterRenderer->formatItemId( $value ); + + $this->assertSame( 'some item', $formatted ); + } + + public function testFormatItemIdSnakValue_Value() { + $itemId = new ItemId( 'Q1234' ); + $value = ItemIdSnakValue::fromItemId( $itemId ); + $constraintParameterRenderer = $this->getMockBuilder( ConstraintParameterRenderer::class ) + ->disableOriginalConstructor() + ->setMethods( [ 'formatEntityId' ] ) + ->getMock(); + $constraintParameterRenderer->expects( $this->once() ) + ->method( 'formatEntityId' ) + ->with( $itemId ) + ->willReturn( 'some item' ); + + $formatted = $constraintParameterRenderer->formatItemIdSnakValue( $value ); + + $this->assertSame( 'some item', $formatted ); + } + + public function testFormatItemIdSnakValue_SomeValue() { + $value = ItemIdSnakValue::someValue(); + $constraintParameterRenderer = $this->getMockBuilder( ConstraintParameterRenderer::class ) + ->disableOriginalConstructor() + ->setMethods( [ 'formatEntityId' ] ) + ->getMock(); + $constraintParameterRenderer->expects( $this->never() )->method( 'formatEntityId' ); + + $formatted = $constraintParameterRenderer->formatItemIdSnakValue( $value ); + + $this->assertContains( 'somevalue', $formatted ); + } + + public function testFormatItemIdSnakValue_NoValue() { + $value = ItemIdSnakValue::noValue(); + $constraintParameterRenderer = $this->getMockBuilder( ConstraintParameterRenderer::class ) + ->disableOriginalConstructor() + ->setMethods( [ 'formatEntityId' ] ) + ->getMock(); + $constraintParameterRenderer->expects( $this->never() )->method( 'formatEntityId' ); + + $formatted = $constraintParameterRenderer->formatItemIdSnakValue( $value ); + + $this->assertContains( 'novalue', $formatted ); + } + + /** + * @dataProvider provideConstraintScopes + */ + public function testFormatConstraintScope( $contextType, $itemIdSerialization, $returnValue ) { + $constraintParameterRenderer = $this->getMockBuilder( ConstraintParameterRenderer::class ) + ->setConstructorArgs( [ + new PlainEntityIdFormatter(), + new StringFormatter(), + new HashConfig( [ + 'WBQualityConstraintsConstraintCheckedOnMainValueId' => 'Q1', + 'WBQualityConstraintsConstraintCheckedOnQualifiersId' => 'Q2', + 'WBQualityConstraintsConstraintCheckedOnReferencesId' => 'Q3', + ] ) + ] ) + ->setMethods( [ 'formatItemId' ] ) + ->getMock(); + $constraintParameterRenderer->expects( $this->once() ) + ->method( 'formatItemId' ) + ->with( $itemIdSerialization, Role::CONSTRAINT_PARAMETER_VALUE ) + ->willReturn( $returnValue ); + + $formatted = $constraintParameterRenderer->formatConstraintScope( + $contextType, + Role::CONSTRAINT_PARAMETER_VALUE + ); + + $this->assertSame( $returnValue, $formatted ); + } + + public function provideConstraintScopes() { + return [ + [ Context::TYPE_STATEMENT, 'Q1', 'statement scope' ], + [ Context::TYPE_QUALIFIER, 'Q2', 'qualifier scope' ], + [ Context::TYPE_REFERENCE, 'Q3', 'reference scope' ], + ]; + } + + public function testFormatPropertyIdList_Empty() { + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatPropertyIdList( [] ); + + $this->assertSame( [ '<ul></ul>' ], $formatted ); + } + + public function testFormatPropertyIdList_TwoPropertyIds() { + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatPropertyIdList( [ + new PropertyId( 'P1' ), + new PropertyId( 'P2' ), + ] ); + + $this->assertSame( [ '<ul><li>P1</li><li>P2</li></ul>', 'P1', 'P2' ], $formatted ); + } + + public function testFormatPropertyIdList_TwentyPropertyIds() { + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatPropertyIdList( + array_map( + function ( $i ) { + return new PropertyId( 'P' . $i ); + }, + range( 1, 20 ) + ) + ); + + $this->assertSame( + [ + '<ul>' . + '<li>P1</li><li>P2</li><li>P3</li><li>P4</li><li>P5</li>' . + '<li>P6</li><li>P7</li><li>P8</li><li>P9</li><li>P10</li>' . + '<li>...</li>' . + '</ul>', + 'P1', + 'P2', + 'P3', + 'P4', + 'P5', + 'P6', + 'P7', + 'P8', + 'P9', + 'P10', + '...', + ], + $formatted + ); + } + + public function testFormatItemIdList_Empty() { + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatItemIdList( [] ); + + $this->assertSame( [ '<ul></ul>' ], $formatted ); + } + + public function testFormatItemIdList_TwoItemIds() { + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatItemIdList( [ + new ItemId( 'Q1' ), + new ItemId( 'Q2' ), + ] ); + + $this->assertSame( [ '<ul><li>Q1</li><li>Q2</li></ul>', 'Q1', 'Q2' ], $formatted ); + } + + public function testFormatItemIdList_TwentyItemIds() { + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatItemIdList( + array_map( + function ( $i ) { + return new ItemId( 'Q' . $i ); + }, + range( 1, 20 ) + ) + ); + + $this->assertSame( + [ + '<ul>' . + '<li>Q1</li><li>Q2</li><li>Q3</li><li>Q4</li><li>Q5</li>' . + '<li>Q6</li><li>Q7</li><li>Q8</li><li>Q9</li><li>Q10</li>' . + '<li>...</li>' . + '</ul>', + 'Q1', + 'Q2', + 'Q3', + 'Q4', + 'Q5', + 'Q6', + 'Q7', + 'Q8', + 'Q9', + 'Q10', + '...', + ], + $formatted + ); + } + + public function testFormatEntityIdList_Empty() { + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatEntityIdList( [] ); + + $this->assertSame( [ '<ul></ul>' ], $formatted ); + } + + public function testFormatItemIdList_PropertyIdItemIdAndNull() { + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatEntityIdList( [ + new PropertyId( 'P1' ), + new ItemId( 'Q2' ), + null + ] ); + + $this->assertSame( [ '<ul><li>P1</li><li>Q2</li></ul>', 'P1', 'Q2' ], $formatted ); + } + + public function testFormatEntityIdList_TwentyItemIds() { + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatItemIdList( + array_map( + function ( $i ) { + return new ItemId( 'Q' . $i ); + }, + range( 1, 20 ) + ) + ); + + $this->assertSame( + [ + '<ul>' . + '<li>Q1</li><li>Q2</li><li>Q3</li><li>Q4</li><li>Q5</li>' . + '<li>Q6</li><li>Q7</li><li>Q8</li><li>Q9</li><li>Q10</li>' . + '<li>...</li>' . + '</ul>', + 'Q1', + 'Q2', + 'Q3', + 'Q4', + 'Q5', + 'Q6', + 'Q7', + 'Q8', + 'Q9', + 'Q10', + '...', + ], + $formatted + ); + } + + public function testFormatItemIdSnakValueList_Empty() { + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatItemIdSnakValueList( [] ); + + $this->assertSame( [ '<ul></ul>' ], $formatted ); + } + + public function testFormatItemIdSnakValueList_ValueSomeValueAndNoValue() { + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatItemIdSnakValueList( [ + ItemIdSnakValue::fromItemId( new ItemId( 'Q1' ) ), + ItemIdSnakValue::someValue(), + ItemIdSnakValue::noValue(), + ] ); + + $expectedSomeValue = $constraintParameterRenderer->formatItemIdSnakValue( + ItemIdSnakValue::someValue() + ); + $expectedNoValue = $constraintParameterRenderer->formatItemIdSnakValue( + ItemIdSnakValue::noValue() + ); + $this->assertSame( + [ + "<ul><li>Q1</li><li>$expectedSomeValue</li><li>$expectedNoValue</li></ul>", + 'Q1', + $expectedSomeValue, + $expectedNoValue, + ], + $formatted + ); + } + + public function testFormatItemIdSnakValueList_TwentyItemIdValues() { + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatItemIdSnakValueList( + array_map( + function ( $i ) { + return ItemIdSnakValue::fromItemId( new ItemId( 'Q' . $i ) ); + }, + range( 1, 20 ) + ) + ); + + $this->assertSame( + [ + '<ul>' . + '<li>Q1</li><li>Q2</li><li>Q3</li><li>Q4</li><li>Q5</li>' . + '<li>Q6</li><li>Q7</li><li>Q8</li><li>Q9</li><li>Q10</li>' . + '<li>...</li>' . + '</ul>', + 'Q1', + 'Q2', + 'Q3', + 'Q4', + 'Q5', + 'Q6', + 'Q7', + 'Q8', + 'Q9', + 'Q10', + '...', + ], + $formatted + ); + } + + public function testFormatConstraintScopeList_Empty() { + $constraintParameterRenderer = new ConstraintParameterRenderer( + new PlainEntityIdFormatter(), + new StringFormatter(), + $this->getDefaultConfig() + ); + + $formatted = $constraintParameterRenderer->formatConstraintScopeList( [] ); + + $this->assertSame( [ '<ul></ul>' ], $formatted ); + } + + public function testFormatConstraintScopeList_QualifierAndReferenceScope() { + $entityIdFormatter = $this->getMock( EntityIdFormatter::class ); + $entityIdFormatter->method( 'formatEntityId' ) + ->willReturnCallback( function ( $entityIdSerialization ) { + switch ( $entityIdSerialization ) { + case 'Q1': + return 'statement'; + case 'Q2': + return 'qualifier'; + case 'Q3': + return 'reference'; + default: + return 'unknown'; + } + } ); + $constraintParameterRenderer = new ConstraintParameterRenderer( + $entityIdFormatter, + new StringFormatter(), + new HashConfig( [ + 'WBQualityConstraintsConstraintCheckedOnMainValueId' => 'Q1', + 'WBQualityConstraintsConstraintCheckedOnQualifiersId' => 'Q2', + 'WBQualityConstraintsConstraintCheckedOnReferencesId' => 'Q3', + ] ) + ); + + $formatted = $constraintParameterRenderer->formatConstraintScopeList( [ + Context::TYPE_QUALIFIER, + Context::TYPE_REFERENCE, + ] ); + + $this->assertSame( + [ '<ul><li>qualifier</li><li>reference</li></ul>', 'qualifier', 'reference' ], + $formatted + ); + } + + public function testFormatConstraintScopeList_TwentyStatementScopes() { + $entityIdFormatter = $this->getMock( EntityIdFormatter::class ); + $entityIdFormatter->method( 'formatEntityId' ) + ->willReturnCallback( function ( $entityIdSerialization ) { + switch ( $entityIdSerialization ) { + case 'Q1': + return 'statement'; + case 'Q2': + return 'qualifier'; + case 'Q3': + return 'reference'; + default: + return 'unknown'; + } + } ); + $constraintParameterRenderer = new ConstraintParameterRenderer( + $entityIdFormatter, + new StringFormatter(), + new HashConfig( [ + 'WBQualityConstraintsConstraintCheckedOnMainValueId' => 'Q1', + 'WBQualityConstraintsConstraintCheckedOnQualifiersId' => 'Q2', + 'WBQualityConstraintsConstraintCheckedOnReferencesId' => 'Q3', + ] ) + ); + + $formatted = $constraintParameterRenderer->formatConstraintScopeList( + array_fill( 0, 20, Context::TYPE_STATEMENT ) + ); + + $this->assertSame( + [ + '<ul>' . + '<li>statement</li><li>statement</li><li>statement</li>' . + '<li>statement</li><li>statement</li><li>statement</li>' . + '<li>statement</li><li>statement</li><li>statement</li>' . + '<li>statement</li><li>...</li>' . + '</ul>', + 'statement', + 'statement', + 'statement', + 'statement', + 'statement', + 'statement', + 'statement', + 'statement', + 'statement', + 'statement', + '...', + ], + $formatted + ); + } + +} -- To view, visit https://gerrit.wikimedia.org/r/405721 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ifb48530ac0fe26ec1866a8c766c7198a5853d9bc Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/WikibaseQualityConstraints Gerrit-Branch: master Gerrit-Owner: Lucas Werkmeister (WMDE) <lucas.werkmeis...@wikimedia.de> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits