From 570a12df4c874b6285e40f75197ca968f950469f Mon Sep 17 00:00:00 2001 From: Moriel Schottlender Date: Tue, 21 Feb 2017 17:41:15 -0800 Subject: [PATCH] RCFilters UI: Add dm.FilterItem unit tests Change-Id: I7198f38c6ce2a85c0dc5f88d5f2a5c4b43ee4663 --- .../dm/mw.rcfilters.dm.FilterItem.js | 14 ++ tests/qunit/QUnitTestResources.php | 1 + .../mediawiki.rcfilters/dm.FilterItem.test.js | 179 ++++++++++++++++++ 3 files changed, 194 insertions(+) create mode 100644 tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js index 675f4b59fe..18f1299377 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js +++ b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js @@ -63,6 +63,20 @@ /* Methods */ + /** + * Return the representation of the state of this item. + * + * @return {Object} State of the object + */ + mw.rcfilters.dm.FilterItem.prototype.getState = function () { + return { + selected: this.isSelected(), + included: this.isIncluded(), + conflicted: this.isConflicted(), + fullyCovered: this.isFullyCovered() + }; + }; + /** * Get the name of this filter * diff --git a/tests/qunit/QUnitTestResources.php b/tests/qunit/QUnitTestResources.php index 1278ecb812..94d25ee2b0 100644 --- a/tests/qunit/QUnitTestResources.php +++ b/tests/qunit/QUnitTestResources.php @@ -94,6 +94,7 @@ return [ 'tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js', 'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js', 'tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js', + 'tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js', 'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js', 'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js', 'tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js', diff --git a/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js b/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js new file mode 100644 index 0000000000..25ea98812c --- /dev/null +++ b/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js @@ -0,0 +1,179 @@ +( function ( mw ) { + QUnit.module( 'mediawiki.rcfilters - FilterItem' ); + + QUnit.test( 'Initializing filter item', function ( assert ) { + var item, + group1 = new mw.rcfilters.dm.FilterGroup( 'group1' ); + + item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 ); + assert.equal( + item.getName(), + 'filter1', + 'Filter name is retained.' + ); + assert.equal( + item.getGroupName(), + 'group1', + 'Group name is retained.' + ); + + item = new mw.rcfilters.dm.FilterItem( + 'filter1', + group1, + { + label: 'test label', + description: 'test description' + } + ); + assert.equal( + item.getLabel(), + 'test label', + 'Label information is retained.' + ); + assert.equal( + item.getLabel(), + 'test label', + 'Description information is retained.' + ); + + item = new mw.rcfilters.dm.FilterItem( + 'filter1', + group1, + { + selected: true + } + ); + assert.equal( + item.isSelected(), + true, + 'Item can be selected in the config.' + ); + item.toggleSelected( true ); + assert.equal( + item.isSelected(), + true, + 'Item can toggle its selected state.' + ); + + // Subsets + item = new mw.rcfilters.dm.FilterItem( + 'filter1', + group1, + { + subset: [ 'sub1', 'sub2', 'sub3' ] + } + ); + assert.deepEqual( + item.getSubset(), + [ 'sub1', 'sub2', 'sub3' ], + 'Subset information is retained.' + ); + assert.equal( + item.existsInSubset( 'sub1' ), + true, + 'Specific item exists in subset.' + ); + assert.equal( + item.existsInSubset( 'sub10' ), + false, + 'Specific item does not exists in subset.' + ); + assert.equal( + item.isIncluded(), + false, + 'Initial state of "included" is false.' + ); + + item.toggleIncluded( true ); + assert.equal( + item.isIncluded(), + true, + 'Item toggles its included state.' + ); + + // Conflicts + item = new mw.rcfilters.dm.FilterItem( + 'filter1', + group1, + { + conflicts: [ 'conflict1', 'conflict2', 'conflict3' ] + } + ); + assert.deepEqual( + item.getConflicts(), + [ 'conflict1', 'conflict2', 'conflict3' ], + 'Conflict information is retained.' + ); + assert.equal( + // TODO: Consider allowing for either a FilterItem or a filter name + // in this method, so it is consistent with the subset one + item.existsInConflicts( new mw.rcfilters.dm.FilterItem( 'conflict1', group1 ) ), + true, + 'Specific item exists in conflicts.' + ); + assert.equal( + item.existsInConflicts( new mw.rcfilters.dm.FilterItem( 'conflict10', group1 ) ), + false, + 'Specific item does not exists in conflicts.' + ); + assert.equal( + item.isConflicted(), + false, + 'Initial state of "conflicted" is false.' + ); + + item.toggleConflicted( true ); + assert.equal( + item.isConflicted(), + true, + 'Item toggles its conflicted state.' + ); + + // Fully covered + item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 ); + assert.equal( + item.isFullyCovered(), + false, + 'Initial state of "full coverage" is false.' + ); + item.toggleFullyCovered( true ); + assert.equal( + item.isFullyCovered(), + true, + 'Item toggles its fully coverage state.' + ); + + } ); + + QUnit.test( 'Emitting events', function ( assert ) { + var group1 = new mw.rcfilters.dm.FilterGroup( 'group1' ), + item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 ), + events = []; + + // Listen to update events + item.on( 'update', function () { + events.push( item.getState() ); + } ); + + // Do stuff + item.toggleSelected( true ); // { selected: true, included: false, conflicted: false, fullyCovered: false } + item.toggleSelected( true ); // No event (duplicate state) + item.toggleIncluded( true ); // { selected: true, included: true, conflicted: false, fullyCovered: false } + item.toggleConflicted( true ); // { selected: true, included: true, conflicted: true, fullyCovered: false } + item.toggleFullyCovered( true ); // { selected: true, included: true, conflicted: true, fullyCovered: true } + item.toggleSelected(); // { selected: false, included: true, conflicted: true, fullyCovered: true } + + // Check emitted events + assert.deepEqual( + events, + [ + { selected: true, included: false, conflicted: false, fullyCovered: false }, + { selected: true, included: true, conflicted: false, fullyCovered: false }, + { selected: true, included: true, conflicted: true, fullyCovered: false }, + { selected: true, included: true, conflicted: true, fullyCovered: true }, + { selected: false, included: true, conflicted: true, fullyCovered: true } + ], + 'Events emitted successfully.' + ); + } ); +}( mediaWiki ) ); -- 2.20.1