jenkins-bot has submitted this change and it was merged.
Change subject: Add unit tests and fix implemention accordingly
......................................................................
Add unit tests and fix implemention accordingly
* Add unit tests for all types of invalid input we check for.
* Add unit tests for all types of input we expand or otherwise
normalise.
* Implement InterfaceText expansion/normalisation.
* Fix bug that caused a string value in the root description property
to be considered invalid (it only accepted an object, it should
accept both).
Change-Id: I5a15080f1f924451a9dde8af96ea2922011981ec
---
M TemplateData.hooks.php
M TemplateData.php
M TemplateDataBlob.php
A tests/TemplateDataBlobTest.php
4 files changed, 199 insertions(+), 7 deletions(-)
Approvals:
Catrope: Looks good to me, approved
jenkins-bot: Verified
diff --git a/TemplateData.hooks.php b/TemplateData.hooks.php
index 2f478a9..d830948 100644
--- a/TemplateData.hooks.php
+++ b/TemplateData.hooks.php
@@ -17,6 +17,15 @@
}
/**
+ * Register unit tests
+ */
+ public static function onUnitTestsList( array &$files ) {
+ $testDir = __DIR__ . '/tests/';
+ $files = array_merge( $files, glob( "$testDir/*Test.php" ) );
+ return true;
+ }
+
+ /**
* @param Page &$page
* @param User &$user
* @param Content &$content
diff --git a/TemplateData.php b/TemplateData.php
index 44e53c7..d90eb93 100644
--- a/TemplateData.php
+++ b/TemplateData.php
@@ -33,6 +33,7 @@
// Register hooks
$wgHooks['ParserFirstCallInit'][] = 'TemplateDataHooks::onParserFirstCallInit';
$wgHooks['PageContentSave'][] = 'TemplateDataHooks::onPageContentSave';
+$wgHooks['UnitTestsList'][] = 'TemplateDataHooks::onUnitTestsList';
// Register APIs
$wgAPIModules['templatedata'] = 'ApiTemplateData';
diff --git a/TemplateDataBlob.php b/TemplateDataBlob.php
index b4f4b03..c30d353 100644
--- a/TemplateDataBlob.php
+++ b/TemplateDataBlob.php
@@ -30,8 +30,6 @@
$ti = new self( json_decode( $json ) );
$status = $ti->parse();
- // TODO: Normalise `params.*.description` to a plain object.
-
if ( !$status->isOK() ) {
// Don't save invalid data, clear it.
$ti->data = new stdClass();
@@ -72,11 +70,12 @@
}
if ( isset( $data->description ) ) {
- if ( !is_object( $data->params ) ) {
- return Status::newFatal(
'templatedata-invalid-type', 'params', 'object' );
+ if ( !is_object( $data->description ) && !is_string(
$data->description ) ) {
+ return Status::newFatal(
'templatedata-invalid-type', 'description', 'string|object' );
}
+ $data->description = self::normaliseInterfaceText(
$data->description );
} else {
- $data->description = '';
+ $data->description = self::normaliseInterfaceText( '' );
}
foreach ( $data->params as $paramName => $paramObj ) {
@@ -111,8 +110,9 @@
// and the values strings.
return Status::newFatal(
'templatedata-invalid-type', 'params.' . $paramName . '.description',
'string|object' );
}
+ $paramObj->description =
self::normaliseInterfaceText( $paramObj->description );
} else {
- $paramObj->description = '';
+ $paramObj->description =
self::normaliseInterfaceText( '' );
}
if ( isset( $paramObj->deprecated ) ) {
@@ -151,6 +151,20 @@
}
return Status::newGood();
+ }
+
+ /**
+ * Normalise a InterfaceText field in the TemplateData blob.
+ * @return stdClass|string $text
+ */
+ protected static function normaliseInterfaceText( $text ) {
+ if ( is_string( $text ) ) {
+ global $wgContLang;
+ $ret = array();
+ $ret[ $wgContLang->getCode() ] = $text;
+ return (object) $ret;
+ }
+ return $text;
}
public function getStatus() {
@@ -207,7 +221,7 @@
return $html;
}
- private function __construct( stdClass $data = null ) {
+ private function __construct( $data = null ) {
$this->data = $data;
}
diff --git a/tests/TemplateDataBlobTest.php b/tests/TemplateDataBlobTest.php
new file mode 100644
index 0000000..905bbfe
--- /dev/null
+++ b/tests/TemplateDataBlobTest.php
@@ -0,0 +1,168 @@
+<?php
+class TemplateDataBlobTest extends MediaWikiTestCase {
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->setMwGlobals( array(
+ 'wgLanguageCode' => 'en',
+ 'wgContLang' => Language::factory( 'en' ),
+ ) );
+ }
+
+ public static function provideParse() {
+ return array(
+ array(
+ '
+ {}
+ ',
+ '
+ {}
+ ',
+ 'Empty object'
+ ),
+ array(
+ '
+ {
+ "foo": "bar"
+ }
+ ',
+ '
+ {}
+ ',
+ 'Unknown properties are stripped'
+ ),
+ array(
+ '
+ {
+ "params": {
+ "foo": {}
+ }
+ }
+ ',
+ '
+ {
+ "description": {
+ "en": ""
+ },
+ "params": {
+ "foo": {
+ "description": {
+ "en": ""
+ },
+ "default": "",
+ "required": false,
+ "deprecated": false,
+ "aliases": [],
+ "clones": []
+ }
+ }
+ }
+ ',
+ 'Optional properties are added if missing'
+ ),
+ array(
+ '
+ {
+ "description": "User badge MediaWiki
developers.",
+ "params": {
+ "nickname": {
+ "description": "User
name of user who owns the badge",
+ "default": "Base page
name of the host page",
+ "required": false,
+ "aliases": [
+ "1"
+ ]
+ }
+ }
+ }
+ ',
+ '
+ {
+ "description": {
+ "en": "User badge MediaWiki
developers."
+ },
+ "params": {
+ "nickname": {
+ "description": {
+ "en": "User
name of user who owns the badge"
+ },
+ "default": "Base page
name of the host page",
+ "required": false,
+ "deprecated": false,
+ "aliases": [
+ "1"
+ ],
+ "clones": []
+ }
+ }
+ }
+ ',
+ 'InterfaceText is expanded to langcode-keyed
object, assuming content language'
+ )
+ );
+ }
+
+ /**
+ * @dataProvider provideParse
+ */
+ public function testParse( $input, $expected, $msg ) {
+ $t = TemplateDataBlob::newFromJSON( $input );
+ $actual = $t->getJSON();
+ $this->assertJsonStringEqualsJsonString(
+ $expected,
+ $actual,
+ $msg
+ );
+ }
+
+ public static function provideStatus() {
+ return array(
+ array(
+ '
+ []
+ ',
+ false,
+ 'Not an object'
+ ),
+ array(
+ '
+ {
+ "params": {}
+ }
+ ',
+ true,
+ 'Minimal valid blob'
+ ),
+ array(
+ '
+ {
+ "params": {},
+ "foo": "bar"
+ }
+ ',
+ false,
+ 'Unknown properties'
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideStatus
+ */
+ public function testStatus( $inputJSON, $isGood, $msg ) {
+ // Make sure we don't have two errors cancelling each other out
+ if ( json_decode( $inputJSON ) === null ) {
+ throw new Exception( 'Test case provided invalid JSON.'
);
+ }
+
+ $t = TemplateDataBlob::newFromJSON( $inputJSON );
+ $status = $t->getStatus();
+
+ $this->assertEquals(
+ $status->isGood(),
+ $isGood,
+ $msg
+ );
+ }
+}
--
To view, visit https://gerrit.wikimedia.org/r/59396
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I5a15080f1f924451a9dde8af96ea2922011981ec
Gerrit-PatchSet: 5
Gerrit-Project: mediawiki/extensions/TemplateData
Gerrit-Branch: master
Gerrit-Owner: Krinkle <[email protected]>
Gerrit-Reviewer: Catrope <[email protected]>
Gerrit-Reviewer: Krinkle <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits