From 945c1efe37972025ad98dfb0662f29a266a6dae7 Mon Sep 17 00:00:00 2001 From: Timo Tijhof Date: Wed, 10 Dec 2014 05:58:31 +0000 Subject: [PATCH] grunt: Add Karma task for automated QUnit testing in browsers To use, ensure npm modules are up to date by running 'npm install' in tests/frontend. Then run 'grunt qunit' to run it in Chrome. To run it in both Firefox and Chrome (locally), run grunt karma:more Moved fixture from hardcoded HTML to the testrunner so that our tests don't depend on arbitrary HTML and thus also pass in browser contexts where the page only loads QUnit + test suites (e.g. Karma). Change-Id: I4e96da137340a28789b38940e75d4b6b8bc5d76a --- includes/specials/SpecialJavaScriptTest.php | 2 - tests/frontend/Gruntfile.js | 49 ++++++++++++++++++++- tests/frontend/package.json | 10 ++++- tests/qunit/data/testrunner.js | 28 ++++++++++++ 4 files changed, 84 insertions(+), 5 deletions(-) diff --git a/includes/specials/SpecialJavaScriptTest.php b/includes/specials/SpecialJavaScriptTest.php index 3dc4410620..fa719eb3f6 100644 --- a/includes/specials/SpecialJavaScriptTest.php +++ b/includes/specials/SpecialJavaScriptTest.php @@ -160,7 +160,6 @@ class SpecialJavaScriptTest extends SpecialPage { $baseHtml = <<
-
HTML; @@ -254,7 +253,6 @@ HTML; QUnit $head
-
HTML; $html .= "\n" . Html::linkedScript( $url ); diff --git a/tests/frontend/Gruntfile.js b/tests/frontend/Gruntfile.js index c011a68f88..fd89e56bfe 100644 --- a/tests/frontend/Gruntfile.js +++ b/tests/frontend/Gruntfile.js @@ -9,9 +9,13 @@ module.exports = function ( grunt ) { grunt.loadNpmTasks( 'grunt-banana-checker' ); grunt.loadNpmTasks( 'grunt-jscs' ); grunt.loadNpmTasks( 'grunt-jsonlint' ); + grunt.loadNpmTasks( 'grunt-karma' ); grunt.file.setBase( __dirname + '/../..' ); + var wgServer = process.env.MW_SERVER, + wgScriptPath = process.env.MW_SCRIPT_PATH; + grunt.initConfig( { pkg: grunt.file.readJSON( __dirname + '/package.json' ), jshint: { @@ -61,10 +65,53 @@ module.exports = function ( grunt ) { '.jshintrc' ], tasks: 'test' + }, + karma: { + options: { + proxies: ( function () { + var obj = {}; + // Set up a proxy for requests to relative urls inside wgScriptPath. Uses a + // property accessor instead of plain obj[wgScriptPath] assignment as throw if + // unset. Running grunt normally (e.g. npm test), should not fail over this. + // This ensures 'npm test' works out of the box, statically, on a git clone + // without MediaWiki fully installed or some environment variables set. + Object.defineProperty( obj, wgScriptPath, { + enumerable: true, + get: function () { + if ( !wgServer ) { + grunt.fail.fatal( 'MW_SERVER is not set' ); + } + if ( !wgScriptPath ) { + grunt.fail.fatal( 'MW_SCRIPT_PATH is not set' ); + } + return wgServer + wgScriptPath; + } + } ); + return obj; + }() ), + files: [ { + pattern: wgServer + wgScriptPath + '/index.php?title=Special:JavaScriptTest/qunit/export', + watched: false, + included: true, + served: false + } ], + frameworks: [ 'qunit' ], + reporters: [ 'dots' ], + singleRun: true, + autoWatch: false + }, + main: { + browsers: [ 'Chrome' ] + }, + more: { + browsers: [ 'Chrome', 'Firefox' ] + } } } ); grunt.registerTask( 'lint', ['jshint', 'jscs', 'jsonlint', 'banana'] ); + grunt.registerTask( 'qunit', 'karma:main' ); + grunt.registerTask( 'test', ['lint'] ); - grunt.registerTask( 'default', ['test'] ); + grunt.registerTask( 'default', 'test' ); }; diff --git a/tests/frontend/package.json b/tests/frontend/package.json index 9b15379a13..101fcd9bdb 100644 --- a/tests/frontend/package.json +++ b/tests/frontend/package.json @@ -6,10 +6,16 @@ }, "devDependencies": { "grunt": "0.4.2", + "grunt-banana-checker": "0.2.0", "grunt-contrib-jshint": "0.10.0", "grunt-contrib-watch": "0.6.1", - "grunt-banana-checker": "0.2.0", "grunt-jscs": "0.8.1", - "grunt-jsonlint": "1.0.4" + "grunt-jsonlint": "1.0.4", + "grunt-karma": "0.9.0", + "karma": "0.12.28", + "karma-chrome-launcher": "0.1.7", + "karma-firefox-launcher": "0.1.3", + "karma-qunit": "0.1.4", + "qunitjs": "1.15.0" } } diff --git a/tests/qunit/data/testrunner.js b/tests/qunit/data/testrunner.js index 7294d62b42..a11f554791 100644 --- a/tests/qunit/data/testrunner.js +++ b/tests/qunit/data/testrunner.js @@ -99,6 +99,34 @@ }; }() ); + // Extend QUnit.module to provide a fixture element. + ( function () { + var orgModule = QUnit.module; + + QUnit.module = function ( name, localEnv ) { + var fixture; + localEnv = localEnv || {}; + orgModule( name, { + setup: function () { + fixture = document.createElement( 'div' ); + fixture.id = 'qunit-fixture'; + document.body.appendChild( fixture ); + + if ( localEnv.setup ) { + localEnv.setup.call( this ); + } + }, + teardown: function () { + if ( localEnv.teardown ) { + localEnv.teardown.call( this ); + } + + fixture.parentNode.removeChild( fixture ); + } + } ); + }; + }() ); + // Initiate when enabled if ( QUnit.urlParams.completenesstest ) { -- 2.20.1