From 5e18d925e7081f2596d54f87a6e4898001365356 Mon Sep 17 00:00:00 2001 From: Ed Sanders Date: Tue, 5 Jun 2018 21:58:25 +0100 Subject: [PATCH] build: Introduce eslint-plugin-qunit and enforce Change-Id: Iefe06cc865c458000ca5350c2d9205f5b768bac8 --- package.json | 1 + tests/qunit/.eslintrc.json | 13 ++++++++--- tests/qunit/data/testrunner.js | 6 +++-- .../jquery/jquery.textSelection.test.js | 2 +- .../mediawiki.api/mediawiki.api.test.js | 6 ++--- .../mediawiki.rcfilters/UriProcessor.test.js | 4 ++-- .../resources/mediawiki/mediawiki.Uri.test.js | 22 +++++++++---------- .../mediawiki/mediawiki.experiments.test.js | 6 ++--- .../mediawiki/mediawiki.jscompat.test.js | 4 ++-- .../mediawiki/mediawiki.loader.test.js | 4 ++-- .../mediawiki.template.mustache.test.js | 2 +- .../mediawiki/mediawiki.template.test.js | 2 +- .../resources/mediawiki/mediawiki.test.js | 2 +- 13 files changed, 42 insertions(+), 32 deletions(-) diff --git a/package.json b/package.json index 1f23b1a09b..2d425dd62e 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "deepmerge": "1.3.2", "eslint": "4.9.0", "eslint-config-wikimedia": "0.5.0", + "eslint-plugin-qunit": "3.2.1", "grunt": "1.0.1", "grunt-banana-checker": "0.6.0", "grunt-contrib-copy": "1.0.0", diff --git a/tests/qunit/.eslintrc.json b/tests/qunit/.eslintrc.json index b3a46f466a..d3aea5e501 100644 --- a/tests/qunit/.eslintrc.json +++ b/tests/qunit/.eslintrc.json @@ -1,5 +1,9 @@ { - "extends": "../../.eslintrc.json", + "extends": [ + "../../.eslintrc.json", + "plugin:qunit/recommended", + "plugin:qunit/two" + ], "env": { "qunit": true }, @@ -9,6 +13,9 @@ "rules": { "operator-linebreak": 0, "quote-props": [ "error", "as-needed" ], - "valid-jsdoc": 0 - } + "valid-jsdoc": 0, + "qunit/require-expect": 0, + "qunit/resolve-async": 0 + }, + "plugins": [ "qunit" ] } diff --git a/tests/qunit/data/testrunner.js b/tests/qunit/data/testrunner.js index 06c146c298..9074aba4ed 100644 --- a/tests/qunit/data/testrunner.js +++ b/tests/qunit/data/testrunner.js @@ -40,7 +40,7 @@ * Configuration */ - // For each test() that is asynchronous, allow this time to pass before + // For each test that is asynchronous, allow this time to pass before // killing the test and assuming timeout failure. QUnit.config.testTimeout = 60 * 1000; @@ -138,7 +138,7 @@ }() ); /** - * Reset mw.config and others to a fresh copy of the live config for each test(), + * Reset mw.config and others to a fresh copy of the live config for each test, * and restore it back to the live one afterwards. * * @param {Object} [localEnv] @@ -597,9 +597,11 @@ } ); QUnit.module( 'testrunner-each-compat', { + // eslint-disable-next-line qunit/no-setup-teardown setup: function () { this.mwHtmlLive = mw.html; }, + // eslint-disable-next-line qunit/no-setup-teardown teardown: function () { mw.html = this.mwHtmlLive; } diff --git a/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js b/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js index 32cda7eb92..1e183fbbad 100644 --- a/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js +++ b/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js @@ -224,7 +224,7 @@ function among( actual, expected, message ) { if ( Array.isArray( expected ) ) { - assert.ok( expected.indexOf( actual ) !== -1, message + ' (got ' + actual + '; expected one of ' + expected.join( ', ' ) + ')' ); + assert.equal( expected.indexOf( actual ) !== -1, true, message + ' (got ' + actual + '; expected one of ' + expected.join( ', ' ) + ')' ); } else { assert.equal( actual, expected, message ); } diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js index 7431b294ac..1d9a8294af 100644 --- a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js +++ b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js @@ -151,7 +151,7 @@ .then( function ( token ) { assert.ok( token.length, 'Got a token' ); }, function ( err ) { - assert.equal( '', err, 'API error' ); + assert.equal( err, '', 'API error' ); } ) .then( function () { assert.equal( test.server.requests.length, 0, 'Requests made' ); @@ -449,7 +449,7 @@ } ); QUnit.module( 'mediawiki.api (2)', { - setup: function () { + beforeEach: function () { var self = this, requests = this.requests = []; this.api = new mw.Api(); @@ -471,7 +471,7 @@ b: 2 } ); this.api.abort(); - assert.ok( this.requests.length === 2, 'Check both requests triggered' ); + assert.equal( this.requests.length, 2, 'Check both requests triggered' ); this.requests.forEach( function ( request, i ) { assert.ok( request.abort.calledOnce, 'abort request number ' + i ); } ); diff --git a/tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js b/tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js index 872f4ddf44..a6c56a9e9a 100644 --- a/tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js +++ b/tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js @@ -45,13 +45,13 @@ QUnit.test( 'getVersion', function ( assert ) { var uriProcessor = new mw.rcfilters.UriProcessor( new mw.rcfilters.dm.FiltersViewModel() ); - assert.ok( + assert.equal( uriProcessor.getVersion( { param1: 'foo', urlversion: '2' } ), 2, 'Retrieving the version from the URI query' ); - assert.ok( + assert.equal( uriProcessor.getVersion( { param1: 'foo' } ), 1, 'Getting version 1 if no version is specified' diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js index 918c923a7b..f2cb70b8af 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js @@ -228,9 +228,9 @@ foo: 'quux', pif: 'paf' } ); - assert.ok( uri.toString().indexOf( 'foo=quux' ) >= 0, 'extend query arguments' ); - assert.ok( uri.toString().indexOf( 'foo=bar' ) === -1, 'extend query arguments' ); - assert.ok( uri.toString().indexOf( 'pif=paf' ) >= 0, 'extend query arguments' ); + assert.equal( uri.toString().indexOf( 'foo=quux' ) !== -1, true, 'extend query arguments' ); + assert.equal( uri.toString().indexOf( 'foo=bar' ) !== -1, false, 'extend query arguments' ); + assert.equal( uri.toString().indexOf( 'pif=paf' ) !== -1, true, 'extend query arguments' ); } ); QUnit.test( '.getQueryString()', function ( assert ) { @@ -302,8 +302,8 @@ // Verify parts and total length instead of entire string because order // of iteration can vary. - assert.ok( uri.toString().indexOf( 'm=bar' ), 'toString preserves other values' ); - assert.ok( uri.toString().indexOf( 'n=x&n=y&n=z' ), 'toString parameter includes all values of an array query parameter' ); + assert.equal( uri.toString().indexOf( 'm=bar' ) !== -1, true, 'toString preserves other values' ); + assert.equal( uri.toString().indexOf( 'n=x&n=y&n=z' ) !== -1, true, 'toString parameter includes all values of an array query parameter' ); assert.equal( uri.toString().length, 'http://www.example.com/dir/?m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' ); uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', { @@ -315,8 +315,8 @@ // Verify parts and total length instead of entire string because order // of iteration can vary. - assert.ok( uri.toString().indexOf( 'm=foo&m=bar' ) >= 0, 'toString preserves other values' ); - assert.ok( uri.toString().indexOf( 'n=x&n=y&n=z' ) >= 0, 'toString parameter includes all values of an array query parameter' ); + assert.equal( uri.toString().indexOf( 'm=foo&m=bar' ) !== -1, true, 'toString preserves other values' ); + assert.equal( uri.toString().indexOf( 'n=x&n=y&n=z' ) !== -1, true, 'toString parameter includes all values of an array query parameter' ); assert.equal( uri.toString().length, 'http://www.example.com/dir/?m=foo&m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' ); // Remove query values @@ -426,10 +426,10 @@ assert.equal( uri.getHostPort(), 'www.example.com:81', 'hostport equal to host:port' ); queryString = uri.getQueryString(); - assert.ok( queryString.indexOf( 'q1=0' ) >= 0, 'query param with numbers' ); - assert.ok( queryString.indexOf( 'test1' ) >= 0, 'query param with null value is included' ); - assert.ok( queryString.indexOf( 'test1=' ) === -1, 'query param with null value does not generate equals sign' ); - assert.ok( queryString.indexOf( 'test2=value+%28escaped%29' ) >= 0, 'query param is url escaped' ); + assert.equal( queryString.indexOf( 'q1=0' ) !== -1, true, 'query param with numbers' ); + assert.equal( queryString.indexOf( 'test1' ) !== -1, true, 'query param with null value is included' ); + assert.equal( queryString.indexOf( 'test1=' ) !== -1, false, 'query param with null value does not generate equals sign' ); + assert.equal( queryString.indexOf( 'test2=value+%28escaped%29' ) !== -1, true, 'query param is url escaped' ); relativePath = uri.getRelativePath(); assert.ok( relativePath.indexOf( uri.path ) >= 0, 'path in relative path' ); diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.experiments.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.experiments.test.js index 177c3580b2..9bff988e39 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.experiments.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.experiments.test.js @@ -34,8 +34,8 @@ }; assert.equal( - 'A', getBucket( experiment, token ), + 'A', 'It returns the bucket if only one is defined.' ); @@ -44,8 +44,8 @@ experiment.enabled = false; assert.equal( - 'control', getBucket( experiment, token ), + 'control', 'It returns "control" if the experiment is disabled.' ); @@ -54,8 +54,8 @@ experiment.buckets = {}; assert.equal( - 'control', getBucket( experiment, token ), + 'control', 'It returns "control" if the experiment doesn\'t have any buckets.' ); } ); diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js index b0b2e7a851..6cb5d76e59 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js @@ -20,7 +20,7 @@ // Not that we need this. ;) // This fails on IE 6-8 // Works on IE 9, Firefox 6, Chrome 14 - QUnit.test( 'Keyword workaround: "if" as variable name using Unicode escapes', function ( assert ) { + ...( 'Keyword workaround: "if" as variable name using Unicode escapes', function ( assert ) { var orig = "another token"; \u0069\u0066 = orig; assert.deepEqual( \u0069\u0066, orig, '\\u0069\\u0066' ); @@ -31,7 +31,7 @@ // Not that we need this. ;) // This fails on IE 6-9 // Works on Firefox 6, Chrome 14 - QUnit.test( 'Keyword workaround: "if" as member variable name using Unicode escapes', function ( assert ) { + ...( 'Keyword workaround: "if" as member variable name using Unicode escapes', function ( assert ) { var orig = "another token"; var foo = {}; foo.\u0069\u0066 = orig; diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js index 42bc0a76fc..8914bd4d76 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js @@ -28,7 +28,7 @@ ); /** - * The sync style load test (for @import). This is, in a way, also an open bug for + * The sync style load test, for @import. This is, in a way, also an open bug for * ResourceLoader ("execute js after styles are loaded"), but browsers don't offer a * way to get a callback from when a stylesheet is loaded (that is, including any * `@import` rules inside). To work around this, we'll have a little time loop to check @@ -942,7 +942,7 @@ try { assert.strictEqual( cb.later(), 'Defined.', 'require works asynchrously in debug mode' ); } catch ( e ) { - assert.equal( null, String( e ), 'require works asynchrously in debug mode' ); + assert.equal( String( e ), null, 'require works asynchrously in debug mode' ); } } ); } ); diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js index cb583e7a1f..ab1d55e409 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js @@ -1,7 +1,7 @@ ( function ( mw ) { QUnit.module( 'mediawiki.template.mustache', { - setup: function () { + beforeEach: function () { // Stub register some templates this.sandbox.stub( mw.templates, 'get' ).returns( { 'test_greeting.mustache': '
{{foo}}{{>suffix}}
', diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js index a2823253e1..31f4782420 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js @@ -1,7 +1,7 @@ ( function ( mw ) { QUnit.module( 'mediawiki.template', { - setup: function () { + beforeEach: function () { var abcCompiler = { compile: function () { return 'abc default compiler'; diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js index 75dc66511e..9cbbdeb257 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js @@ -155,7 +155,7 @@ // Interacting with globals conf.set( 'globalMapChecker', 'Hi' ); - assert.ok( ( 'globalMapChecker' in window ) === false, 'Map does not its store values in the window object by default' ); + assert.equal( 'globalMapChecker' in window, false, 'Map does not its store values in the window object by default' ); globalConf = new mw.Map( true ); globalConf.set( 'anotherGlobalMapChecker', 'Hello' ); -- 2.20.1