Dominic.sauer has submitted this change and it was merged.

Change subject: Added ViolationContext for constraint violation for violations 
special page.
......................................................................


Added ViolationContext for constraint violation for violations special page.

Moved CheckResultTranslator into new Violations namespace. Fixed some i18n 
bugs. Fixed typo in ConflictsWithChecker.

Change-Id: If5086cccdefeb8a68820292e0d075496288c8931
---
M WikibaseQualityConstraints.alias.php
M WikibaseQualityConstraints.php
M i18n/en.json
M i18n/qqq.json
M includes/ConstraintCheck/Checker/ConflictsWithChecker.php
M includes/ConstraintReportFactory.php
R includes/Violations/CheckResultToViolationTranslator.php
A includes/Violations/ConstraintViolationContext.php
R tests/phpunit/Violations/CheckResultToViolationTranslatorTest.php
A tests/phpunit/Violations/ConstraintViolationContextTest.php
10 files changed, 325 insertions(+), 33 deletions(-)

Approvals:
  Dominic.sauer: Verified; Looks good to me, approved



diff --git a/WikibaseQualityConstraints.alias.php 
b/WikibaseQualityConstraints.alias.php
index 8f38748..9a08c8f 100644
--- a/WikibaseQualityConstraints.alias.php
+++ b/WikibaseQualityConstraints.alias.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Aliases for WikidataQualityConstraints extension
+ * Aliases for WikibaseQualityConstraints extension
  *
  * @file
  * @ingroup Extensions
diff --git a/WikibaseQualityConstraints.php b/WikibaseQualityConstraints.php
index 600fff3..3f9ac05 100755
--- a/WikibaseQualityConstraints.php
+++ b/WikibaseQualityConstraints.php
@@ -40,6 +40,9 @@
        define( 'CONSTRAINT_TABLE', 'wbqc_constraints' );
 
        // Jobs
-       $GLOBALS['wgJobClasses']['evaluateConstraintReportJob'] = 
'WikidataQuality\ConstraintReport\EvaluateConstraintReportJob';
+       $GLOBALS['wgJobClasses']['evaluateConstraintReportJob'] = 
'WikibaseQuality\ConstraintReport\EvaluateConstraintReportJob';
        $GLOBALS['wgDebugLogGroups']['wbq_evaluation'] = 
'/var/log/mediawiki/wbq_evaluation.log';
+
+    // Register violation context
+    $GLOBALS['wbqViolationContexts'][] = function() { return 
WikibaseQuality\ConstraintReport\ConstraintReportFactory::getDefaultInstance()->getViolationContext();
 };
 } );
\ No newline at end of file
diff --git a/i18n/en.json b/i18n/en.json
index d7b27e3..47705d5 100755
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -8,13 +8,19 @@
   "wbqc-constraintreport-form-submit-label": "Check",
   "wbqc-constraintreport-form-entityid-placeholder": "Qxx/Pxx",
   "wbqc-constraintreport-result-headline": "Result for $1",
+  "wbqc-constraintreport-not-existent-entity": "Entity does not exist!",
   "wbqc-constraintreport-empty-result": "There are no constraint defined on 
this entity.",
   "wbqc-constraintreport-status-violation": "Violation",
   "wbqc-constraintreport-status-compliance": "Compliance",
   "wbqc-constraintreport-status-exception": "Exception",
   "wbqc-constraintreport-status-todo": "Todo",
+  "wbqc-constraintreport-result-table-header-status": "Status",
   "wbqc-constraintreport-result-table-header-claim": "Claim",
   "wbqc-constraintreport-result-table-header-constraint": "Constraint",
   "wbqc-constraintreport-result-link-to-claim": "go to claim",
-  "wbqc-constraintreport-result-link-to-constraint": "go to constraint"
+  "wbqc-constraintreport-result-link-to-constraint": "go to constraint",
+
+  "wbqc-violations-group": "Constraints",
+  "wbqc-violation-header-parameters": "Parameters:",
+  "wbqc-violation-message": "Constraint check has pointed out a violation. 
Please click on icon for further information."
 }
diff --git a/i18n/qqq.json b/i18n/qqq.json
index ac30d5a..a7766c0 100755
--- a/i18n/qqq.json
+++ b/i18n/qqq.json
@@ -14,12 +14,18 @@
        "wbqc-constraintreport-form-entityid-placeholder": "Entity id 
placeholder for the input field.",
        "wbqc-constraintreport-result-headline": "Result headline",
        "wbqc-constraintreport-empty-result": "Message that appears, when there 
are no constraints defined for the given entity.",
-       "wbqc-constraintreport-status-violation": "Status for claims that are 
violated against a constraint.",
+    "wbqev-constraintreport-not-existent-entity": "Error message that appears 
when the entered entity does not exist.",
+    "wbqc-constraintreport-status-violation": "Status for claims that are 
violated against a constraint.",
        "wbqc-constraintreport-status-compliance": "Status for claims that 
comply with a constraint",
        "wbqc-constraintreport-status-exception": "Status for claims that were 
marked as a exception",
        "wbqc-constraintreport-status-todo": "Status for constraints which 
cannot be checked yet.",
+    "wbqc-constraintreport-result-table-header-status": "Header of the colum 
that displays the status."
        "wbqc-constraintreport-result-table-header-claim": "Header of the 
column that displays a link to the claim, the used property and its 
value.\n{{Identical|Claim}}",
        "wbqc-constraintreport-result-table-header-constraint": "Header of the 
column that gives information about which constraint was 
checked.\n{{Identical|Constraint}}",
        "wbqc-constraintreport-result-link-to-claim": "Text for the link to a 
claim group on the entity page.",
-       "wbqc-constraintreport-result-link-to-constraint": "Text for the link 
to a constraint on the property page."
+       "wbqc-constraintreport-result-link-to-constraint": "Text for the link 
to a constraint on the property page.",
+
+    "wbqc-violations-group": "Name of the group of constrains violations. Is 
shown in special page that lists all the violations.",
+    "wbqc-violation-header-parameters": "Header for section in violations 
special page that displays parameters of a constraint.".
+    "wbqc-violation-message": "Message that is shown for violated claims on 
item page."
 }
diff --git a/includes/ConstraintCheck/Checker/ConflictsWithChecker.php 
b/includes/ConstraintCheck/Checker/ConflictsWithChecker.php
index aa2e816..e8084ec 100755
--- a/includes/ConstraintCheck/Checker/ConflictsWithChecker.php
+++ b/includes/ConstraintCheck/Checker/ConflictsWithChecker.php
@@ -41,12 +41,12 @@
 
        /**
         * @param EntityLookup $lookup
-        * @param ConstraintReportHelper $helper
+        * @param ConstraintReportHelper $constraintReportHelper
         * ConnectionCheckerHelper $connectionCheckerHelper
         */
-       public function __construct( EntityLookup $lookup, 
ConstraintReportHelper $helper, ConnectionCheckerHelper 
$connectionCheckerHelper ) {
+       public function __construct( EntityLookup $lookup, 
ConstraintReportHelper $constraintReportHelper, ConnectionCheckerHelper 
$connectionCheckerHelper ) {
                $this->entityLookup = $lookup;
-               $this->constraintReportHelper = $helper;
+               $this->constraintReportHelper = $constraintReportHelper;
                $this->connectionCheckerHelper = $connectionCheckerHelper;
        }
 
diff --git a/includes/ConstraintReportFactory.php 
b/includes/ConstraintReportFactory.php
index 466cc2f..93dc0a2 100755
--- a/includes/ConstraintReportFactory.php
+++ b/includes/ConstraintReportFactory.php
@@ -27,6 +27,7 @@
 use 
WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\ConnectionCheckerHelper;
 use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\RangeCheckerHelper;
 use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\TypeCheckerHelper;
+use WikibaseQuality\ConstraintReport\Violations\ConstraintViolationContext;
 
 
 class ConstraintReportFactory {
@@ -160,4 +161,9 @@
                return $this->constraintRepository;
        }
 
+    public function getViolationContext() {
+        return new ConstraintViolationContext(
+            array_keys( $this->getConstraintCheckerMap() )
+        );
+    }
 }
\ No newline at end of file
diff --git 
a/includes/ConstraintCheck/Result/CheckResultToViolationTranslator.php 
b/includes/Violations/CheckResultToViolationTranslator.php
similarity index 87%
rename from includes/ConstraintCheck/Result/CheckResultToViolationTranslator.php
rename to includes/Violations/CheckResultToViolationTranslator.php
index 32171cc..8d1fe0f 100755
--- a/includes/ConstraintCheck/Result/CheckResultToViolationTranslator.php
+++ b/includes/Violations/CheckResultToViolationTranslator.php
@@ -1,10 +1,11 @@
 <?php
 
-namespace WikibaseQuality\ConstraintReport\ConstraintCheck\Result;
+namespace WikibaseQuality\ConstraintReport\Violations;
 
 use Wikibase\DataModel\Entity\Entity;
 use Wikibase\DataModel\Statement\Statement;
 use Wikibase\Lib\Store\EntityRevisionLookup;
+use WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResult;
 use WikibaseQuality\Violations\Violation;
 use Doctrine\Instantiator\Exception\InvalidArgumentException;
 
@@ -23,12 +24,6 @@
         $this->entityRevisionLookup = $entityRevisionLookup;
     }
 
-    /**
-     * @param Entity $entity
-     * @param CheckResult[] $checkResultOrArray
-     *
-     * @return array
-     */
        public function translateToViolation( Entity $entity, 
$checkResultOrArray ) {
 
            $checkResultArray = $this->setCheckResultArray( $checkResultOrArray 
);
@@ -48,13 +43,17 @@
             $constraintId = $this->setConstraintId( $checkResult, $statement, 
$constraintTypeEntityId );
                        $revisionId = 
$this->entityRevisionLookup->getLatestRevisionId( $entityId );
                        $status = CheckResult::STATUS_VIOLATION;
-            $parameters = json_encode( $checkResult->getParameters() );
-                       $violationArray[ ] = new Violation( $entityId, 
$propertyId, $claimGuid, $constraintId, $constraintTypeEntityId, $revisionId, 
$status, $parameters );
+
+                       $violationArray[ ] = new Violation( $entityId, 
$propertyId, $claimGuid, $constraintId, $constraintTypeEntityId, $revisionId, 
$status );
                }
 
                return $violationArray;
        }
 
+    /**
+     * @param CheckResult|CheckResult[] $checkResultOrArray
+     * @return CheckResult[]
+     */
     private function setCheckResultArray( $checkResultOrArray ){
 
         if ( $checkResultOrArray instanceof CheckResult ) {
@@ -75,6 +74,6 @@
             }
         }
 
-        return md5( $constraintId );
+        return ConstraintViolationContext::CONTEXT_ID . 
Violation::CONSTRAINT_ID_DELIMITER . $constraintId;
     }
 }
\ No newline at end of file
diff --git a/includes/Violations/ConstraintViolationContext.php 
b/includes/Violations/ConstraintViolationContext.php
new file mode 100644
index 0000000..29ad635
--- /dev/null
+++ b/includes/Violations/ConstraintViolationContext.php
@@ -0,0 +1,115 @@
+<?php
+
+namespace WikibaseQuality\ConstraintReport\Violations;
+
+
+use Html;
+use Doctrine\Instantiator\Exception\InvalidArgumentException;
+use WikibaseQuality\ConstraintReport\ConstraintReportFactory;
+use WikibaseQuality\Violations\Violation;
+use WikibaseQuality\Violations\ViolationContext;
+
+class ConstraintViolationContext implements ViolationContext {
+
+    const CONTEXT_ID = 'wbqc';
+
+    /**
+     * @var array
+     */
+    private $types;
+
+    /**
+     * @param array $types
+     */
+    public function __construct( array $types ) {
+        $this->types = $types;
+    }
+
+    /**
+     * @see ViolationContext::getId
+     * @codeCoverageIgnore
+     *
+     * @return string
+     */
+    public function getId() {
+        return self::CONTEXT_ID;
+    }
+
+    /**
+     * @see ViolationContext::getName
+     * @codeCoverageIgnore
+     *
+     * @return string
+     */
+    public function getName() {
+        return 'wbqc-violations-group';
+    }
+
+    /**
+     * @see ViolationContext::getTypes
+     *
+     * @return array
+     */
+    public function getTypes() {
+        return $this->types;
+    }
+
+    /**
+     * @see ViolationContext::isContextFor
+     *
+     * @param Violation $violation
+     * @return bool
+     */
+    public function isContextFor( Violation $violation ) {
+        $splitConstraintId = explode( Violation::CONSTRAINT_ID_DELIMITER, 
$violation->getConstraintId() );
+        $prefix = $splitConstraintId[0];
+
+        return $prefix === $this->getId();
+    }
+
+    /**
+     * @param Violation $violation
+     * @return string
+     */
+    public function formatAdditionalInformation( Violation $violation ) {
+        if ( !$this->isContextFor( $violation ) ) {
+            throw new InvalidArgumentException( 'Given violation is not part 
of current context.' );
+        }
+
+        $output =
+            Html::openElement( 'p' )
+            . Html::element(
+                'span',
+                array(
+                    'class' => 'wbq-violations-additional-information-header'
+                ),
+                wfMessage( 'wbqc-violation-header-parameters' )->text()
+            );
+
+        $additionalInformation = $violation->getAdditionalInfo();
+        if( array_key_exists( 'parameters', $additionalInformation ) ) {
+            $parameters = $additionalInformation['parameters'];
+            foreach( $parameters as $name => $value ) {
+                $output .= Html::element( 'br' );
+                $output .= sprintf( '%s: %s', $name, $value );
+            }
+        }
+        else {
+            $output .= Html::element( 'br' );
+            $output .= 'none';
+        }
+
+        $output .= Html::closeElement( 'p' );
+
+        return $output;
+    }
+
+    /**
+     * @param Violation $violation
+     * @return string
+     */
+    public function getMessage( Violation $violation ) {
+        //TODO: Implement message system depending on constraint type
+        return wfMessage( 'wbqc-violation-message' )->text();
+    }
+}
\ No newline at end of file
diff --git a/tests/phpunit/Result/CheckResultToViolationTranslatorTest.php 
b/tests/phpunit/Violations/CheckResultToViolationTranslatorTest.php
similarity index 80%
rename from tests/phpunit/Result/CheckResultToViolationTranslatorTest.php
rename to tests/phpunit/Violations/CheckResultToViolationTranslatorTest.php
index 76a9190..245df74 100644
--- a/tests/phpunit/Result/CheckResultToViolationTranslatorTest.php
+++ b/tests/phpunit/Violations/CheckResultToViolationTranslatorTest.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace 
WikibaseQuality\ConstraintReport\Test\CheckResultToViolationTranslator;
+namespace WikibaseQuality\ConstraintReport\Test\Violations;
 
 use Wikibase\DataModel\Entity\Entity;
 use Wikibase\DataModel\Entity\EntityId;
@@ -11,14 +11,14 @@
 use Wikibase\DataModel\Entity\PropertyId;
 use DataValues\StringValue;
 use WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResult;
-use 
WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResultToViolationTranslator;
 use Wikibase\Repo\WikibaseRepo;
+use 
WikibaseQuality\ConstraintReport\Violations\CheckResultToViolationTranslator;
 
 
 /**
- * @covers 
WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResultToViolationTranslator
+ * @covers 
WikibaseQuality\ConstraintReport\Violations\CheckResultToViolationTranslator
  *
- * @group WikidataQualityConstraints
+ * @group WikibaseQualityConstraints
  * @group Database
  * @group medium
  *
@@ -27,7 +27,7 @@
  * @author BP2014N1
  * @license GNU GPL v2+
  */
-class CheckResultTestToViolationTranslatorTest extends \MediaWikiTestCase {
+class CheckResultTestToViolationTranslator extends \MediaWikiTestCase {
 
     /**
      * @var CheckResultToViolationTranslator
@@ -81,7 +81,7 @@
                $this->propertyId =  new PropertyId( 'P1' );
                $this->claimGuid = 'P1$aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee';
                $this->statement->setGuid( 
'P1$aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' );
-               $this->constraintName = 'Single value';
+               $this->constraintName = 'Range';
                $this->parameters = array ();
                $this->message = 'All right';
                $this->entity = new Item();
@@ -106,7 +106,7 @@
                $this->assertEquals( array (), $violations );
        }
 
-       public function testSingleViolationResultWithoutParameter() {
+       public function testSingleViolationResult() {
                $checkResult = new CheckResult( $this->statement, 
$this->constraintName, $this->parameters, 'violation', $this->message );
                $violations = $this->translator->translateToViolation( 
$this->entity, $checkResult );
                $this->assertEquals( 1, sizeof( $violations ) );
@@ -117,15 +117,8 @@
                $this->assertEquals( $this->statement->getGuid(), 
$violation->getClaimGuid() );
                $this->assertEquals( md5( $this->statement->getGuid() . 
$checkResult->getConstraintName() ), $violation->getConstraintId() );
                $this->assertEquals( $checkResult->getConstraintName(), 
$violation->getConstraintTypeEntityId() );
-               $this->assertEquals( 42, $violation->getRevisionId() );
-               $this->assertEquals( '[]', $violation->getAdditionalInfo() );
-       }
+        $this->assertEquals( 42, $violation->getRevisionId() );
 
-       public function testSingleViolationResultWithParameter() {
-               $checkResult = new CheckResult( $this->statement, 
$this->constraintName, array( array( 'constraint_status' => 'mandatory' ) ), 
'violation', $this->message );
-               $violations = $this->translator->translateToViolation( 
$this->entity, $checkResult );
-               $violation = $violations[0];
-               $this->assertEquals( '[{"constraint_status":"mandatory"}]', 
$violation->getAdditionalInfo() );
        }
 
        public function testMultipleCheckResults() {
diff --git a/tests/phpunit/Violations/ConstraintViolationContextTest.php 
b/tests/phpunit/Violations/ConstraintViolationContextTest.php
new file mode 100644
index 0000000..d4c540c
--- /dev/null
+++ b/tests/phpunit/Violations/ConstraintViolationContextTest.php
@@ -0,0 +1,164 @@
+<?php
+
+namespace WikibaseQuality\ConstraintReport\Test\Violations;
+
+use Language;
+use WikibaseQuality\ConstraintReport\Violations\ConstraintViolationContext;
+
+
+/**
+ * @covers 
WikibaseQuality\ConstraintReport\Violations\ConstraintViolationContext
+ *
+ * @group WikibaseQualityConstraints
+ *
+ * @author BP2014N1
+ * @license GNU GPL v2+
+ */
+class ConstraintViolationContextTest extends \MediaWikiTestCase {
+
+    /**
+     * @var array
+     */
+    private $types;
+
+    /**
+     * @var ConstraintViolationContext
+     */
+    private $violationContext;
+
+    public function setUp(){
+        parent::setUp();
+
+        $this->types = array(
+            'foo',
+            'bar',
+            'foobar'
+        );
+        $this->violationContext = new ConstraintViolationContext( $this->types 
);
+    }
+
+    public function tearDown() {
+        unset( $this->violationContext );
+
+        parent::tearDown();
+    }
+
+
+    public function testGetTypes() {
+        $actualResult = $this->violationContext->getTypes();
+
+        $this->assertArrayEquals( $this->types, $actualResult );
+    }
+
+
+    /**
+     * @dataProvider isContextForDataProvider
+     */
+    public function testIsContextFor( $expectedResult, $violation ){
+        $actualResult = $this->violationContext->isContextFor( $violation );
+
+        $this->assertEquals( $expectedResult, $actualResult );
+    }
+
+    /**
+     * Test cases for testIsContextFor
+     * @return array
+     */
+    public function isContextForDataProvider() {
+        return array(
+            array(
+                true,
+                $this->getViolationMock( 'wbqc|foobar' )
+            ),
+            array(
+                false,
+                $this->getViolationMock( 'wbqev|foobar' )
+            )
+        );
+    }
+
+
+    /**
+     * @dataProvider formatAdditionalInformationDataProvider
+     */
+    public function testFormatAdditionalInformation( $expectedResult, 
$violation, $expectedException = null ) {
+        $this->setExpectedException( $expectedException );
+
+        global $wgLang;
+        $wgLang = Language::factory( 'qqx' );
+        $actualResult = $this->violationContext->formatAdditionalInformation( 
$violation );
+
+        $this->assertEquals( $expectedResult, $actualResult );
+    }
+
+    /**
+     * Test cases for testFormatAdditionalInformation
+     * @return array
+     */
+    public function formatAdditionalInformationDataProvider() {
+        return array(
+            array(
+                '<p><span 
class="wbq-violations-additional-information-header">(wbqc-violation-header-parameters)</span><br
 />none</p>',
+                $this->getViolationMock(
+                    'wbqc|foobar',
+                    array()
+                )
+            ),
+            array(
+                '<p><span 
class="wbq-violations-additional-information-header">(wbqc-violation-header-parameters)</span><br
 />foo: bar</p>',
+                $this->getViolationMock(
+                    'wbqc|foobar',
+                    array(
+                        'parameters' => array(
+                            'foo' => 'bar'
+                        )
+                    )
+                )
+            ),
+            array(
+                '<p><span 
class="wbq-violations-additional-information-header">(wbqc-violation-header-parameters)</span><br
 />foo: bar<br />foobar: fubar</p>',
+                $this->getViolationMock(
+                    'wbqc|foobar',
+                    array(
+                        'parameters' => array(
+                            'foo' => 'bar',
+                            'foobar' => 'fubar'
+                        )
+                    )
+                )
+            ),
+            array(
+                '',
+                $this->getViolationMock(
+                    'wbqev|foobar',
+                    array()
+                ),
+                'InvalidArgumentException'
+            )
+        );
+    }
+
+
+    public function testGetMessage() {
+        $actualResult = $this->violationContext->getMessage( 
$this->getViolationMock() );
+        $expectedResult = '(wbqc-violation-message)';
+
+        $this->assertEquals( $expectedResult, $actualResult );
+    }
+
+
+    private function getViolationMock( $constraintId = null, 
$additionalInformation = null ) {
+        $mock = $this->getMockBuilder( 'WikibaseQuality\Violations\Violation' )
+            ->setMethods( array( 'getConstraintId', 'getAdditionalInfo' ) )
+            ->disableOriginalConstructor()
+            ->getMock();
+        $mock->expects( $this->any() )
+            ->method( 'getConstraintId' )
+            ->willReturn( $constraintId );
+        $mock->expects( $this->any() )
+            ->method( 'getAdditionalInfo' )
+            ->willReturn( $additionalInformation );
+
+        return $mock;
+    }
+}

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

Gerrit-MessageType: merged
Gerrit-Change-Id: If5086cccdefeb8a68820292e0d075496288c8931
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/WikidataQualityConstraints
Gerrit-Branch: master
Gerrit-Owner: Soeren.oldag <[email protected]>
Gerrit-Reviewer: Dominic.sauer <[email protected]>
Gerrit-Reviewer: Siebrand <[email protected]>

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

Reply via email to