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

Reply via email to