jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/348166 )
Change subject: TagMultiselectWidget: Redo data validation for Tag* and Menu*
......................................................................
TagMultiselectWidget: Redo data validation for Tag* and Menu*
The menu adds options to consider, but we still want to make
sure we are testing on the basics
(arbitrary/duplicates/allowed list/etc). Make sure that the
isAllowedData method is running properly in the base class
and also in the Menu class.
Also, add unit tests for data validation.
Change-Id: Id32f37d9bf1828cae616effabf3c2377697cd6fe
---
M src/widgets/MenuTagMultiselectWidget.js
M src/widgets/TagMultiselectWidget.js
M tests/index.php
A tests/widgets/MenuTagMultiselectWidget.test.js
M tests/widgets/TagMultiselectWidget.test.js
5 files changed, 102 insertions(+), 14 deletions(-)
Approvals:
jenkins-bot: Verified
VolkerE: Looks good to me, approved
Jforrester: Looks good to me, but someone else must approve
diff --git a/src/widgets/MenuTagMultiselectWidget.js
b/src/widgets/MenuTagMultiselectWidget.js
index 51a8986..9785221 100644
--- a/src/widgets/MenuTagMultiselectWidget.js
+++ b/src/widgets/MenuTagMultiselectWidget.js
@@ -222,11 +222,15 @@
};
/**
- * @inheritdoc
+ * Get the allowed values list
+ *
+ * @return {string[]} Allowed data values
*/
-OO.ui.MenuTagMultiselectWidget.prototype.isAllowedData = function ( data ) {
- return
OO.ui.MenuTagMultiselectWidget.parent.prototype.isAllowedData.call( this, data
) &&
- !!this.menu.getItemFromData( data );
+OO.ui.MenuTagMultiselectWidget.prototype.getAllowedValues = function () {
+ var menuDatas = this.menu.getItems().map( function ( menuItem ) {
+ return menuItem.getData();
+ } );
+ return this.allowedValues.concat( menuDatas );
};
/**
diff --git a/src/widgets/TagMultiselectWidget.js
b/src/widgets/TagMultiselectWidget.js
index 1aafda5..2a76ef1 100644
--- a/src/widgets/TagMultiselectWidget.js
+++ b/src/widgets/TagMultiselectWidget.js
@@ -473,11 +473,9 @@
* Check whether a given value is allowed to be added
*
* @param {string|Object} data Requested value
- * @return {boolean} Value exists in the allowed values list
+ * @return {boolean} Value is allowed
*/
OO.ui.TagMultiselectWidget.prototype.isAllowedData = function ( data ) {
- var hash = OO.getHash( data );
-
if ( this.allowArbitrary ) {
return true;
}
@@ -492,7 +490,7 @@
// Check with allowed values
if (
this.getAllowedValues().some( function ( value ) {
- return hash === OO.getHash( value );
+ return data === value;
} )
) {
return true;
diff --git a/tests/index.php b/tests/index.php
index e7b80f6..650e684 100644
--- a/tests/index.php
+++ b/tests/index.php
@@ -39,6 +39,7 @@
<script src="./Process.test.js"></script>
<script src="./mixins/FlaggedElement.test.js"></script>
<script src="./widgets/TagMultiselectWidget.test.js"></script>
+ <script src="./widgets/MenuTagMultiselectWidget.test.js"></script>
<!-- JS/PHP comparison tests -->
<script>OO.ui.JSPHPTestSuite = <?php echo $testSuiteJSON; ?></script>
<script src="./JSPHP.test.standalone.js"></script>
diff --git a/tests/widgets/MenuTagMultiselectWidget.test.js
b/tests/widgets/MenuTagMultiselectWidget.test.js
new file mode 100644
index 0000000..639cda9
--- /dev/null
+++ b/tests/widgets/MenuTagMultiselectWidget.test.js
@@ -0,0 +1,43 @@
+( function () {
+ QUnit.module( 'MenuTagMultiselectWidget' );
+
+ QUnit.test( 'isAllowedData', 4, function ( assert ) {
+ var widget;
+
+ widget = new OO.ui.MenuTagMultiselectWidget( {
+ options: [
+ { data: 'foo', label: 'Foo' },
+ { data: 'bar', label: 'Bar' },
+ { data: 'baz', label: 'Baz' }
+ ]
+ } );
+
+ assert.ok(
+ widget.isAllowedData( 'foo' ),
+ 'Data in menu items is allowed'
+ );
+
+ widget.addTag( 'foo' );
+ assert.ok(
+ !widget.isAllowedData( 'foo' ),
+ 'Data in menu but also duplicate is not allowed (for
allowDuplicates: false)'
+ );
+ assert.ok(
+ !widget.isAllowedData( 'blip' ),
+ 'Data not in menu is not allowed'
+ );
+
+ widget = new OO.ui.MenuTagMultiselectWidget( {
+ options: [
+ { data: 'foo', label: 'Foo' },
+ { data: 'bar', label: 'Bar' },
+ { data: 'baz', label: 'Baz' }
+ ],
+ allowedValues: [ 'something', 'else' ]
+ } );
+ assert.ok(
+ widget.isAllowedData( 'something' ),
+ 'Data from allowed values is allowed'
+ );
+ } );
+}() );
diff --git a/tests/widgets/TagMultiselectWidget.test.js
b/tests/widgets/TagMultiselectWidget.test.js
index a2557cd..c37c7bd 100644
--- a/tests/widgets/TagMultiselectWidget.test.js
+++ b/tests/widgets/TagMultiselectWidget.test.js
@@ -43,6 +43,50 @@
);
} );
+ QUnit.test( 'isAllowedData', 5, function ( assert ) {
+ var widget;
+
+ widget = new OO.ui.TagMultiselectWidget( {
+ allowArbitrary: true
+ } );
+ assert.ok(
+ widget.isAllowedData( '123foobar' ),
+ 'isAllowedData: allowArbitrary:true, random options are
valid'
+ );
+
+ widget = new OO.ui.TagMultiselectWidget( {
+ allowArbitrary: false,
+ allowedValues: [ 'foo', 'bar' ]
+ } );
+
+ assert.ok(
+ !widget.isAllowedData( '123foobar' ),
+ 'isAllowedData: allowArbitrary:false, data not in
allowedValues is invalid'
+ );
+ assert.ok(
+ widget.isAllowedData( 'foo' ),
+ 'isAllowedData: allowArbitrary:false, data in
allowedValues valid'
+ );
+
+ widget.addTag( 'foo' );
+ assert.ok(
+ !widget.isAllowedData( 'foo' ),
+ 'isAllowedData: allowDuplicates:false, duplicate values
are invalid even if they are in allowedValues'
+ );
+
+ widget = new OO.ui.TagMultiselectWidget( {
+ allowArbitrary: false,
+ allowedValues: [ 'foo', 'bar' ],
+ allowDuplicates: true
+ } );
+
+ widget.addTag( 'foo' );
+ assert.ok(
+ widget.isAllowedData( 'foo' ),
+ 'isAllowedData: allowDuplicates:true allows duplicate
values'
+ );
+ } );
+
QUnit.test( 'addTag', 7, function ( assert ) {
var widget,
getItemDatas = function ( items ) {
@@ -195,9 +239,8 @@
'Getting the next item from the first item.'
);
- assert.equalDomElement(
- widget.getNextItem( items[ items.length - 1 ] )[ 0 ],
- widget.input.$input[ 0 ],
+ assert.ok(
+ widget.getNextItem( items[ items.length - 1 ] ) ===
widget.input,
'Getting the next item from the last item, returns the
input.$input element (if inputPosition:inline or inputPosition:outline)'
);
@@ -219,9 +262,8 @@
widget.setValue( [ 'foo', 'bar', 'baz' ] );
items = widget.getItems();
- assert.equalDomElement(
- widget.getPreviousItem( items[ 0 ] )[ 0 ],
- widget.input.$input[ 0 ],
+ assert.ok(
+ widget.getPreviousItem( items[ 0 ] ) === widget.input,
'Getting the previous item from the first item returns
the input.$input element (if inputPosition:inline or inputPosition:outline)'
);
assert.strictEqual(
--
To view, visit https://gerrit.wikimedia.org/r/348166
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Id32f37d9bf1828cae616effabf3c2377697cd6fe
Gerrit-PatchSet: 2
Gerrit-Project: oojs/ui
Gerrit-Branch: master
Gerrit-Owner: Mooeypoo <[email protected]>
Gerrit-Reviewer: Jforrester <[email protected]>
Gerrit-Reviewer: VolkerE <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits