Jsahleen has uploaded a new change for review. https://gerrit.wikimedia.org/r/167333
Change subject: Categories: Unit Tests ...................................................................... Categories: Unit Tests * Adds unit tests for category adaptation * Refactors sorting for improved testability. Bug: 66666 Change-Id: Ica9021bbc317ac47a2f227b94ebacb216eaa9ef4 --- M Resources.php M modules/tools/ext.cx.tools.categories.js A tests/qunit/tools/ext.cx.tools.categories.test.js 3 files changed, 167 insertions(+), 19 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/ContentTranslation refs/changes/33/167333/1 diff --git a/Resources.php b/Resources.php index a3fc58a..851c43e 100644 --- a/Resources.php +++ b/Resources.php @@ -492,12 +492,14 @@ $modules['qunit']['ext.cx.tools.tests'] = array( 'scripts' => array( 'tests/qunit/tools/ext.cx.tools.template.test.js', - 'tests/qunit/tools/ext.cx.tools.mtabuse.test.js' + 'tests/qunit/tools/ext.cx.tools.mtabuse.test.js', + 'tests/qunit/tools/ext.cx.tools.categories.test.js', ), 'dependencies' => array( 'ext.cx.model', 'ext.cx.tools.template', - 'ext.cx.tools.mtabuse' + 'ext.cx.tools.mtabuse', + 'ext.cx.tools.categories', ), ) + $resourcePaths; diff --git a/modules/tools/ext.cx.tools.categories.js b/modules/tools/ext.cx.tools.categories.js index 506340f..fd8220d 100644 --- a/modules/tools/ext.cx.tools.categories.js +++ b/modules/tools/ext.cx.tools.categories.js @@ -454,9 +454,26 @@ character = character || '0'; number = number + ''; output = number.length >= width ? number : new Array( width - number.length + 1 ).join( character ) + number; - return output; + return 'cxCategory' + output; } + /** + * Sorts categories in alphanumerical order + * + * @param {object} categories The key/value category object to be sorted + * @return {object} + */ + function categorySort( categories ) { + var i, + sorted = {}, + keys = Object.keys( categories ); + + keys.sort(); + for ( i = 0; i < keys.length; i++ ) { + sorted[ keys[ i ] ] = categories[ keys[ i ] ]; + } + return sorted; + } /** * Retrieves categories for the source article * @@ -554,7 +571,8 @@ cache: true } ).done( function ( response ) { var redirects, - adaptedCategories = {}; + adaptedCategories = {}, + sorted = {}; if ( response.query ) { redirects = response.query.redirects || {}; @@ -581,26 +599,16 @@ } } ); } - deferred.resolve( adaptedCategories ); - } ).fail( function ( error ) { - mw.log( '[CX] Error adapting categories ' + error ); - deferred.resolve( {} ); - } ); - deferred.then( function ( adaptedCategories ) { - var i, - sorted = {}, - keys = Object.keys( adaptedCategories ); - - keys.sort(); - for ( i = 0; i < keys.length; i++ ) { - sorted[ keys[ i ] ] = adaptedCategories[ keys[ i ] ]; - } + sorted = categorySort( adaptedCategories ); categoryTool.categories.adapted = sorted; if ( categoryTool.categories.target === null ) { categoryTool.categories.target = $.extend( {}, sorted ); } - return sorted; + deferred.resolve( sorted ); + } ).fail( function ( error ) { + mw.log( '[CX] Error adapting categories ' + error ); + deferred.resolve( {} ); } ); return deferred.promise(); @@ -725,6 +733,8 @@ // Expose the CXCategoryTool (required by publishing) mw.cx.categoryTool = new CXCategoryTool( mw.cx.siteMapper ); + mw.cx.CategoryTool = CXCategoryTool; + $( function () { mw.hook( 'mw.cx.source.loaded' ).add( function () { mw.cx.categoryTool.getCategories().done( function ( categories ) { diff --git a/tests/qunit/tools/ext.cx.tools.categories.test.js b/tests/qunit/tools/ext.cx.tools.categories.test.js new file mode 100644 index 0000000..ff08eba --- /dev/null +++ b/tests/qunit/tools/ext.cx.tools.categories.test.js @@ -0,0 +1,136 @@ +/** + * @file + * @author Joel Sahleen + * @license GPL-2.0+ + */ + +( function ( $, mw ) { + 'use strict'; + + QUnit.module( 'ext.cx.tools.categories', QUnit.newMwEnvironment( { + setup: function () { + this.server = this.sandbox.useFakeServer(); + mw.cx.siteMapper = new mw.cx.SiteMapper( + mw.config.get( 'wgContentTranslationSiteTemplates' ) + ); + mw.cx.categoryTool = new mw.cx.CategoryTool( mw.cx.siteMapper ); + mw.cx.sourceLanguage = 'en'; + mw.cx.targetLanguage = 'es'; + } + } ) ); + + QUnit.test( 'Get source categories', function ( assert ) { + QUnit.expect( 3 ); + + function testGetSourceCategories( title ) { + var deferred = $.Deferred(); + + mw.cx.sourceTitle = title; + mw.cx.categoryTool.getCategories( 'source' ) + .done( function ( categories ) { + deferred.resolve( categories ); + } ); + + return deferred.promise(); + } + + QUnit.stop(); + testGetSourceCategories( 'Han Fei' ) + .done( function ( results ) { + assert.equal( Object.keys( results ).length, 13, 'Correct number of source categories retrieved (13 results)' ); + QUnit.start(); + } ); + + QUnit.stop(); + testGetSourceCategories( 'Han' ) + .done( function ( results ) { + assert.equal( Object.keys( results ).length, 1, 'Correct number of source categories retrieved (1 result)' ); + QUnit.start(); + } ); + + QUnit.stop(); + testGetSourceCategories( 'Shen Dao' ) + .done( function ( results ) { + assert.equal( Object.keys( results ).length, 6, 'Correct number of source categories retrieved (6 results)' ); + QUnit.start(); + } ); + + } ); + + QUnit.test( 'Get adapted categories', function ( assert ) { + QUnit.expect( 3 ); + + function testGetAdaptedCategories( title ) { + var deferred = $.Deferred(); + + mw.cx.sourceTitle = title; + mw.cx.categoryTool.getCategories( 'adapted' ) + .done( function ( adaptedCategories ) { + deferred.resolve( adaptedCategories ); + } ); + + return deferred.promise(); + } + + QUnit.stop(); + testGetAdaptedCategories( 'Han Fei' ) + .done( function ( results ) { + assert.equal( Object.keys( results ).length, 4, 'Correct number of adapted categories retrieved (4 results)' ); + QUnit.start(); + } ); + + QUnit.stop(); + testGetAdaptedCategories( 'Han' ) + .done( function ( results ) { + assert.equal( Object.keys( results ).length, 1, 'Correct number of adapted categories retrieved (1 result)' ); + QUnit.start(); + } ); + + QUnit.stop(); + testGetAdaptedCategories( 'Shen Dao' ) + .done( function ( results ) { + assert.equal( Object.keys( results ).length, 0, 'Correct number of adapted categories retrieved (No results)' ); + QUnit.start(); + } ); + + } ); + + QUnit.test( 'Get target categories', function ( assert ) { + QUnit.expect( 3 ); + + function testGetTargetCategories( title ) { + var deferred = $.Deferred(); + + mw.cx.sourceTitle = title; + mw.cx.categoryTool.getCategories( 'target' ) + .done( function ( adaptedCategories ) { + deferred.resolve( adaptedCategories ); + } ); + + return deferred.promise(); + } + + QUnit.stop(); + testGetTargetCategories( 'Han Fei' ) + .done( function ( results ) { + assert.equal( Object.keys( results ).length, 4, 'Correct number of target categories retrieved (4 results)' ); + QUnit.start(); + } ); + + QUnit.stop(); + testGetTargetCategories( 'Han' ) + .done( function ( results ) { + assert.equal( Object.keys( results ).length, 1, 'Correct number of target categories retrieved (1 result)' ); + QUnit.start(); + } ); + + QUnit.stop(); + testGetTargetCategories( 'Shen Dao' ) + .done( function ( results ) { + assert.equal( Object.keys( results ).length, 0, 'Correct number of target categories retrieved (No results)' ); + QUnit.start(); + } ); + + } ); + +}( jQuery, mediaWiki ) ); -- To view, visit https://gerrit.wikimedia.org/r/167333 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ica9021bbc317ac47a2f227b94ebacb216eaa9ef4 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/ContentTranslation Gerrit-Branch: master Gerrit-Owner: Jsahleen <jsahl...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits