diff --git a/includes/ThanksHooks.php b/includes/ThanksHooks.php
index 7851446f..20a6d9c2 100644
--- a/includes/ThanksHooks.php
+++ b/includes/ThanksHooks.php
@@ -32,6 +32,15 @@ class ThanksHooks {
'targets' => [ 'desktop', 'mobile' ],
];
}
+ $testModules['qunit']['tests.ext.thanks.thank'] = [
+ 'localBasePath' => dirname( __DIR__ ),
+ 'remoteExtPath' => 'Thanks',
+ 'dependencies' => [ 'ext.thanks' ],
+ 'scripts' => [
+ 'tests/qunit/test_ext.thanks.thank.js',
+ ],
+ 'targets' => [ 'desktop' ],
+ ];
return true;
}
diff --git a/tests/qunit/test_ext.thanks.thank.js b/tests/qunit/test_ext.thanks.thank.js
new file mode 100644
index 00000000..ee3e2e75
--- /dev/null
+++ b/tests/qunit/test_ext.thanks.thank.js
@@ -0,0 +1,61 @@
+QUnit.module( 'Thanks thank', QUnit.newMwEnvironment( {
+ setup: function () {
+ this.server = this.sandbox.useFakeServer();
+ this.server.respondImmediately = true;
+ }
+} ) );
+
+QUnit.test( 'thanked cookie', function ( assert ) {
+ var $thankLink = $( '' ),
+ $thankLinkNonExisting = $( '' );
+ $.cookie( mw.thanks.thanked.cookieName, escape( '17,11' ) );
+
+ assert.deepEqual( mw.thanks.thanked.load(), [ '17', '11' ], 'gets cookie with two values' );
+
+ // Makes the 0 100th element
+ $.cookie( mw.thanks.thanked.cookieName, escape( '9,'.repeat( mw.thanks.thanked.maxHistory - 1 ) + '0' ) );
+
+ assert.strictEqual( mw.thanks.thanked.load()[ mw.thanks.thanked.maxHistory - 1 ], '0', 'loads ' + mw.thanks.thanked.maxHistory + ' ids from a cookie' );
+ mw.thanks.thanked.push( $thankLink );
+ assert.strictEqual( mw.thanks.thanked.load().length, mw.thanks.thanked.maxHistory, 'cuts a cookie to ' + mw.thanks.thanked.maxHistory + ' values' );
+ assert.strictEqual( mw.thanks.thanked.load()[ mw.thanks.thanked.maxHistory - 1 ], $thankLink.attr( mw.thanks.thanked.attrName ), 'adds a new value to cookie to the end' );
+
+ assert.strictEqual( mw.thanks.thanked.contains( $thankLink ), true, 'cookie contains id and returns true' );
+ assert.strictEqual( mw.thanks.thanked.contains( $thankLinkNonExisting ), false, 'cookie does not contains id and returns false' );
+} );
+QUnit.test( 'gets user gender', function ( assert ) {
+ this.server.respond( /user1/, function ( request ) {
+ request.respond( 200, { 'Content-Type': 'application/json' },
+ '{"batchcomplete":"","query":{"users":[{"userid":1,"name":"user1","gender":"male"}]}}'
+ );
+ } );
+ this.server.respond( /user2/, function ( request ) {
+ request.respond( 200, { 'Content-Type': 'application/json' },
+ '{"batchcomplete":"","query":{"users":[{"userid":2,"name":"user2","gender":"unknown"}]}}'
+ );
+ } );
+ this.server.respond( /user3/, function ( request ) {
+ request.respond( 200, { 'Content-Type': 'application/json' },
+ '{"batchcomplete":"","query":{"users":[{"name":"user3","missing":""}]}}'
+ );
+ } );
+
+ // eslint-disable-next-line vars-on-top
+ var maleUser = mw.thanks.getUserGender( 'user1' ),
+ unknownGenderUser = mw.thanks.getUserGender( 'user2' ),
+ nonExistingUser = mw.thanks.getUserGender( 'user3' ),
+ callbackDone = assert.async( 3 );
+
+ maleUser.then( function ( recipientGender ) {
+ assert.strictEqual( recipientGender, 'male', 'gets a proper gender for existing male user' );
+ callbackDone();
+ } );
+ unknownGenderUser.then( function ( recipientGender ) {
+ assert.strictEqual( recipientGender, 'unknown', 'gets a unknown gender for a existing unknown gender user' );
+ callbackDone();
+ } );
+ nonExistingUser.then( function ( recipientGender ) {
+ assert.strictEqual( recipientGender, 'unknown', 'gets a unknown gender for non-existing user' );
+ callbackDone();
+ } );
+} );