jenkins-bot has submitted this change and it was merged. Change subject: Basic snaklistview QUnit tests ......................................................................
Basic snaklistview QUnit tests Change-Id: I5bdf69d199c494df377633e97c2b0b33ab4845c0 --- M lib/WikibaseLib.hooks.php M lib/resources/jquery.wikibase/jquery.wikibase.snaklistview.js A lib/tests/qunit/jquery.wikibase/jquery.wikibase.snaklistview.tests.js 3 files changed, 703 insertions(+), 5 deletions(-) Approvals: Tobias Gritschacher: Looks good to me, approved jenkins-bot: Verified diff --git a/lib/WikibaseLib.hooks.php b/lib/WikibaseLib.hooks.php index 6f041a0..5a01da5 100644 --- a/lib/WikibaseLib.hooks.php +++ b/lib/WikibaseLib.hooks.php @@ -164,6 +164,15 @@ ), ); + $testModules['qunit']['jquery.wikibase.snaklistview.tests'] = $moduleBase + array( + 'scripts' => array( + 'tests/qunit/jquery.wikibase/jquery.wikibase.snaklistview.tests.js', + ), + 'dependencies' => array( + 'jquery.wikibase.snaklistview', + ), + ); + $testModules['qunit']['jquery.wikibase.wbtooltip.tests'] = $moduleBase + array( 'scripts' => array( 'tests/qunit/jquery.wikibase/jquery.wikibase.wbtooltip.tests.js', diff --git a/lib/resources/jquery.wikibase/jquery.wikibase.snaklistview.js b/lib/resources/jquery.wikibase/jquery.wikibase.snaklistview.js index 4a3fe0f..63c4268 100644 --- a/lib/resources/jquery.wikibase/jquery.wikibase.snaklistview.js +++ b/lib/resources/jquery.wikibase/jquery.wikibase.snaklistview.js @@ -108,14 +108,14 @@ this.$listview.addClass( 'wb-snaklistview-listview-new' ); } - this.createListView(); + this._createListView(); }, /** * (Re-)creates the listview widget managing the snakview widgets. * @since 0.4 */ - createListView: function() { + _createListView: function() { var self = this, $listviewParent = null; @@ -233,7 +233,7 @@ // Re-create the list view to restore snakviews that have been removed during // editing: - this.createListView(); + this._createListView(); } else { $.each( this._listview.items(), function( i, item ) { var $item = $( item ), @@ -310,7 +310,7 @@ var wasInEditMode = this.isInEditMode(); this._snakList = snakList; - this.createListView(); + this._createListView(); if( wasInEditMode ) { this.startEditing(); @@ -366,7 +366,9 @@ var self = this, snakList = new wb.SnakList(); - if ( !this.isValid() || !this._snakList ) { + if( !this._snakList && this._listview.items().length === 0 ) { + return true; + } else if ( !this.isValid() || !this._snakList ) { return false; } diff --git a/lib/tests/qunit/jquery.wikibase/jquery.wikibase.snaklistview.tests.js b/lib/tests/qunit/jquery.wikibase/jquery.wikibase.snaklistview.tests.js new file mode 100644 index 0000000..bdc8052 --- /dev/null +++ b/lib/tests/qunit/jquery.wikibase/jquery.wikibase.snaklistview.tests.js @@ -0,0 +1,687 @@ +/** + * @since 0.4 + * @file + * @ingroup WikibaseLib + * @licence GNU GPL v2+ + * @author H. Snater < mediaw...@snater.com > + */ +( function( $, mw, wb, dv ) { + 'use strict'; + + var snakLists = [ + new wb.SnakList( [ + new wb.PropertyValueSnak( 'p1', new dv.StringValue( 'a' ) ), + new wb.PropertyValueSnak( 'p2', new dv.StringValue( 'b' ) ), + new wb.PropertyValueSnak( 'p3', new dv.StringValue( 'c' ) ) + ] ), + new wb.SnakList( [ + new wb.PropertyValueSnak( 'p4', new dv.StringValue( 'd' ) ) + ] ) + ]; + + /** + * Generates a snaklistview widget suitable for testing. + * + * @param {wikibase.SnakList} [value] + * @return {jQuery} + */ + function createSnaklistview( value ) { + return $( '<div/>' ) + .addClass( 'test_snaklistview' ) + .snaklistview( { value: ( value || null ) } ); + } + + /** + * Sets a snak list on a given snaklistview retaining the initial snak list (since it gets + * overwritten by using value() to set a snak list). + * + * @param {jquery.wikibase.snaklistview} snaklistview + * @param {wikibase.SnakList} value + * @return {jquery.wikibase.snaklistview} + */ + function setValueKeepingInitial( snaklistview, value ) { + var initialValue = snaklistview._snakList; + + snaklistview.value( value ); + snaklistview._snakList = initialValue; + + return snaklistview; + } + + QUnit.module( 'jquery.wikibase.snaklistview', window.QUnit.newWbEnvironment( { + teardown: function() { + $( '.test_snaklistview' ).each( function( i, node ) { + var $node = $( node ), + snaklistview = $node.data( 'snaklistview' ); + + if( snaklistview ) { + snaklistview.destroy(); + } + + $node.remove(); + } ); + } + } ) ); + + QUnit.test( 'Initialize and destroy', function( assert ) { + var $node = createSnaklistview(), + snaklistview = $node.data( 'snaklistview' ); + + assert.ok( + snaklistview !== undefined, + 'Initialized snaklistview widget.' + ); + + assert.strictEqual( + snaklistview.value(), + null, + 'Snaklistview contains no snaks.' + ); + + assert.strictEqual( + snaklistview.isValid(), + true, + 'Snaklistview is valid.' + ); + + assert.strictEqual( + snaklistview.isInitialValue(), + true, + 'Snaklistview holds initial value.' + ); + + assert.strictEqual( + snaklistview.isInEditMode(), + false, + 'Snaklistview is not in edit mode.' + ); + + snaklistview.destroy(); + + assert.ok( + $node.data( 'listview' ) === undefined, + 'Destroyed listview.' + ); + } ); + + QUnit.test( 'Setting and getting value while not in edit mode', function( assert ) { + var $node = createSnaklistview(), + snaklistview = $node.data( 'snaklistview' ); + + assert.strictEqual( + snaklistview.value(), + null, + 'Snaklistview is empty.' + ); + + assert.ok( + snaklistview.value( snakLists[0] ).equals( snakLists[0] ), + 'Set snak list.' + ); + + assert.ok( + snaklistview.value().equals( snakLists[0] ), + 'Verified set snak list.' + ); + + assert.ok( + !snaklistview.isInEditMode(), + 'Snaklistview is not in edit mode.' + ); + + assert.ok( + snaklistview.value( snakLists[1] ).equals( snakLists[1] ), + 'Overwrote snak list.' + ); + + assert.ok( + snaklistview.value().equals( snakLists[1] ), + 'Verified set snak list.' + ); + + assert.ok( + snaklistview.value( new wb.SnakList() ), + 'Set empty snak list.' + ); + + assert.strictEqual( + snaklistview.value(), + null, + 'Verified snaklistview being empty.' + ); + } ); + + QUnit.test( 'Setting value while in edit mode', function( assert ) { + var $node = createSnaklistview(), + snaklistview = $node.data( 'snaklistview' ); + + snaklistview.startEditing(); + + assert.ok( + snaklistview.isInEditMode(), + 'Snaklistview is in edit mode.' + ); + + assert.strictEqual( + snaklistview.value(), + null, + 'Snaklistview is empty.' + ); + + assert.ok( + snaklistview.value( snakLists[0] ).equals( snakLists[0] ), + 'Set snak list.' + ); + + assert.ok( + snaklistview.value().equals( snakLists[0] ), + 'Verified set snak list.' + ); + + assert.ok( + snaklistview.isInEditMode(), + 'Snaklistview is in edit mode.' + ); + + assert.ok( + snaklistview.value( snakLists[1] ).equals( snakLists[1] ), + 'Overwrote snak list.' + ); + + assert.ok( + snaklistview.value().equals( snakLists[1] ), + 'Verified set snak list.' + ); + + assert.ok( + snaklistview.isInEditMode(), + 'Snaklistview is in edit mode.' + ); + + assert.ok( + snaklistview.value( new wb.SnakList() ), + 'Set empty snak list.' + ); + + assert.strictEqual( + snaklistview.value(), + null, + 'Verified snaklistview being empty.' + ); + + assert.ok( + snaklistview.isInEditMode(), + 'Snaklistview is in edit mode.' + ); + } ); + + QUnit.test( 'isInitialValue()', function( assert ) { + var $node = createSnaklistview(), + snaklistview = $node.data( 'snaklistview' ); + + assert.strictEqual( + snaklistview.isInitialValue(), + true, + 'Empty snak list has initial value.' + ); + + snaklistview = setValueKeepingInitial( snaklistview, snakLists[0] ); + + assert.strictEqual( + snaklistview.isInitialValue(), + false, + 'snaklistview does not have the initial value after setting a value.' + ); + + snaklistview = setValueKeepingInitial( snaklistview, new wb.SnakList() ); + + assert.ok( + snaklistview.isInitialValue(), + 'snaklistview has initial value again after resetting to an empty snak list.' + ); + + snaklistview.destroy(); + $node.remove(); + + $node = createSnaklistview( snakLists[0] ); + snaklistview = $node.data( 'snaklistview' ); + + assert.strictEqual( + snaklistview.isInitialValue(), + true, + 'Snak list initialized with a snak list has initial value.' + ); + + snaklistview = setValueKeepingInitial( snaklistview, snakLists[1] ); + + assert.strictEqual( + snaklistview.isInitialValue(), + false, + 'snaklistview does not have the initial value after overwriting its value.' + ); + + snaklistview = setValueKeepingInitial( snaklistview, new wb.SnakList() ); + + assert.ok( + !snaklistview.isInitialValue(), + 'snaklistview does not have the initial value after setting value to an empty snak list.' + ); + + snaklistview = setValueKeepingInitial( + snaklistview, wb.SnakList.newFromJSON( snakLists[0].toJSON() ) + ); + + assert.ok( + snaklistview.isInitialValue(), + 'snaklistview has initial value again after setting to a copy of the initial snak list.' + ); + } ); + + QUnit.test( 'Basic start and stop editing', 7, function( assert ) { + var $node = createSnaklistview(), + snaklistview = $node.data( 'snaklistview' ); + + QUnit.stop( 2 ); + + $node.on( 'snaklistviewstartediting', function( e ) { + assert.ok( + true, + 'Triggered "startediting" event.' + ); + + QUnit.start(); + } ); + + $node.on( 'snaklistviewafterstartediting', function( e ) { + assert.ok( + true, + 'Triggered "afterstartediting" event.' + ); + + QUnit.start(); + } ); + + snaklistview.startEditing(); + + assert.strictEqual( + snaklistview.isInEditMode(), + true, + 'Entered edit mode.' + ); + + // Should not trigger any events since in edit mode already: + snaklistview.startEditing(); + + QUnit.stop( 2 ); + + $node.on( 'snaklistviewstopediting', function( e ) { + assert.ok( + true, + 'Triggered "stopediting" event.' + ); + + QUnit.start(); + } ); + + $node.on( 'snaklistviewafterstopediting', function( e ) { + assert.ok( + true, + 'Triggered "afterstopediting" event.' + ); + + QUnit.start(); + } ); + + snaklistview.stopEditing(); + + assert.strictEqual( + snaklistview.isInEditMode(), + false, + 'Left edit mode.' + ); + + assert.strictEqual( + snaklistview.value(), + null, + 'Snaklistview is still empty.' + ); + + // Should not trigger any events since not in edit mode: + snaklistview.stopEditing(); + } ); + + QUnit.test( 'Basic start and stop editing of filled snaklistview', 7, function( assert ) { + var $node = createSnaklistview( snakLists[0] ), + snaklistview = $node.data( 'snaklistview' ); + + QUnit.stop( 2 ); + + $node.on( 'snaklistviewstartediting', function( e ) { + assert.ok( + true, + 'Triggered "startediting" event.' + ); + + QUnit.start(); + } ); + + $node.on( 'snaklistviewafterstartediting', function( e ) { + assert.ok( + true, + 'Triggered "afterstartediting" event.' + ); + + QUnit.start(); + } ); + + snaklistview.startEditing(); + + assert.strictEqual( + snaklistview.isInEditMode(), + true, + 'Entered edit mode.' + ); + + // Should not trigger any events since in edit mode already: + snaklistview.startEditing(); + + QUnit.stop( 2 ); + + $node.on( 'snaklistviewstopediting', function( e ) { + assert.ok( + true, + 'Triggered "stopediting" event.' + ); + + QUnit.start(); + } ); + + $node.on( 'snaklistviewafterstopediting', function( e ) { + assert.ok( + true, + 'Triggered "afterstopediting" event.' + ); + + QUnit.start(); + } ); + + snaklistview.stopEditing(); + + assert.strictEqual( + snaklistview.isInEditMode(), + false, + 'Left edit mode.' + ); + + assert.strictEqual( + snaklistview.isInitialValue(), + true, + 'Snaklistview is still empty.' + ); + + // Should not trigger any events since not in edit mode: + snaklistview.stopEditing(); + } ); + + QUnit.test( 'enterNewItem()', function( assert ) { + var $node = createSnaklistview(), + snaklistview = $node.data( 'snaklistview' ); + + QUnit.stop( 3 ); + + $node.on( 'snaklistviewstartediting', function( e ) { + assert.ok( + true, + 'Triggered "startediting" event.' + ); + QUnit.start(); + } ); + + $node.on( 'snaklistviewafterstartediting', function( e ) { + assert.ok( + true, + 'Triggered "afterstartediting" event.' + ); + QUnit.start(); + } ); + + $node.on( 'snaklistviewchange', function( e ) { + assert.ok( + true, + 'Triggered "change" event.' + ); + QUnit.start(); + } ); + + snaklistview.enterNewItem(); + + assert.ok( + snaklistview.isInEditMode(), + 'Verified snaklistview being in edit mode.' + ); + + assert.ok( + !snaklistview.isInitialValue(), + 'Snaklistview does not feature its initial value anymore.' + ); + + assert.ok( + !snaklistview.isValid(), + 'Snaklistview is not valid due to pending value.' + ); + } ); + + QUnit.test( 'cancelEditing()', function( assert ) { + var $node = createSnaklistview(), + snaklistview = $node.data( 'snaklistview' ); + + // Since cancelEditing is just a short-cut, there is no need for particular testing expect + // for verifying the actual short-cut behaviour. + snaklistview.stopEditing = function( dropValue ) { + assert.strictEqual( + dropValue, + true, + 'Called stopEditing with dropValue flag set to TRUE.' + ); + }; + + snaklistview.startEditing(); + snaklistview.cancelEditing(); + } ); + + QUnit.test( 'Stopping edit mode dropping value', function( assert ) { + var $node = createSnaklistview(), + snaklistview = $node.data( 'snaklistview' ); + + // Start with empty snaklistview, set a snak list and stop edit mode: + snaklistview.startEditing(); + snaklistview = setValueKeepingInitial( snaklistview, snakLists[0] ); + + snaklistview.stopEditing( true ); + + assert.ok( + !snaklistview.isInEditMode(), + 'Left edit mode.' + ); + + assert.ok( + snaklistview.isInitialValue(), + 'Verified reset to initial value.' + ); + + // Start with a filled snaklistview, set a snak list and stop edit mode: + snaklistview.value( snakLists[0] ); + + snaklistview.startEditing(); + snaklistview = setValueKeepingInitial( snaklistview, snakLists[1] ); + + snaklistview.stopEditing( true ); + + assert.ok( + !snaklistview.isInEditMode(), + 'Left edit mode.' + ); + + assert.ok( + snaklistview.isInitialValue(), + 'Verified reset to initial value.' + ); + + // Set an empty snak list and stop edit mode. + snaklistview.startEditing(); + snaklistview = setValueKeepingInitial( snaklistview, new wb.SnakList() ); + + snaklistview.stopEditing( true ); + + assert.ok( + !snaklistview.isInEditMode(), + 'Left edit mode.' + ); + + assert.ok( + snaklistview.isInitialValue(), + 'Verified reset to initial value.' + ); + } ); + + QUnit.test( 'Stopping edit mode retaining value', function( assert ) { + var $node = createSnaklistview(), + snaklistview = $node.data( 'snaklistview' ); + + // Start with empty snaklistview, set a snak list and stop edit mode: + snaklistview.startEditing(); + snaklistview = setValueKeepingInitial( snaklistview, snakLists[0] ); + + snaklistview.stopEditing(); + + assert.ok( + !snaklistview.isInEditMode(), + 'Left edit mode.' + ); + + assert.ok( + !snaklistview.isInitialValue(), + 'Snaklistview\'s value changed.' + ); + + assert.ok( + snakLists[0].equals( snaklistview.value() ), + 'Verified new value.' + ); + + snaklistview.startEditing(); + snaklistview = setValueKeepingInitial( snaklistview, snakLists[1] ); + + snaklistview.stopEditing(); + + assert.ok( + !snaklistview.isInEditMode(), + 'Left edit mode.' + ); + + assert.ok( + !snaklistview.isInitialValue(), + 'Snaklistview\'s value changed.' + ); + + assert.ok( + snakLists[1].equals( snaklistview.value() ), + 'Verified new value.' + ); + + // Set an empty snak list and stop edit mode. + snaklistview.startEditing(); + snaklistview = setValueKeepingInitial( snaklistview, new wb.SnakList() ); + + snaklistview.stopEditing(); + + assert.ok( + !snaklistview.isInEditMode(), + 'Left edit mode.' + ); + + assert.ok( + snaklistview.isInitialValue(), + 'Snaklistview\'s value is the initial value.' + ); + + assert.strictEqual( + snaklistview.value(), + null, + 'Snaklistview is empty.' + ); + } ); + + QUnit.test( 'Dis- and enabling', function( assert ) { + var $node = createSnaklistview( snakLists[0] ), + snaklistview = $node.data( 'snaklistview' ); + + /** + * Returns a string representing the state a snaklistview's snakviews are in. + * + * @param {jquery.wikibase.snaklistview} snaklistview + * @return {string} + */ + function getSnakviewStates( snaklistview ) { + var snakviews = snaklistview._listview.value(), + isDisabled = true, + isEnabled = true; + + for( var i = 0; i < snakviews.length; i++ ) { + isDisabled = isDisabled && snakviews[i].isDisabled(); + isEnabled = isEnabled && !snakviews[i].isDisabled(); + } + + if( isDisabled && !isEnabled ) { + return 'disabled'; + } else if( !isDisabled && isEnabled ) { + return 'enabled'; + } else { + return 'mixed'; + } + } + + assert.equal( + getSnakviewStates( snaklistview ), + 'enabled', + 'snaklistview\'s snakviews are enabled.' + ); + + $node.on( 'snaklistviewdisable', function( e ) { + assert.ok( + true, + 'Triggered "disable" event.' + ); + QUnit.start(); + } ); + + $node.on( 'snaklistviewenable', function( e ) { + assert.ok( + true, + 'Triggered "enable" event.' + ); + QUnit.start(); + } ); + + QUnit.stop(); + + snaklistview.disable(); + + assert.equal( + getSnakviewStates( snaklistview ), + 'disabled', + 'Disabled snaklistview\'s snakviews.' + ); + + QUnit.stop(); + + snaklistview.enable(); + + assert.equal( + getSnakviewStates( snaklistview ), + 'enabled', + 'Eabled snaklistview\'s snakviews.' + ); + } ); + +} )( jQuery, mediaWiki, wikibase, dataValues ); -- To view, visit https://gerrit.wikimedia.org/r/80364 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I5bdf69d199c494df377633e97c2b0b33ab4845c0 Gerrit-PatchSet: 7 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Henning Snater <henning.sna...@wikimedia.de> Gerrit-Reviewer: Daniel Werner <daniel.wer...@wikimedia.de> Gerrit-Reviewer: Tobias Gritschacher <tobias.gritschac...@wikimedia.de> Gerrit-Reviewer: jenkins-bot _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits