diff --git a/Makefile b/Makefile index 232b4be574..c2a744ceed 100644 --- a/Makefile +++ b/Makefile @@ -5,10 +5,10 @@ NYC := "node_modules/.bin/nyc" ifdef COVERAGE define test_node - $(NYC) --no-clean --report-dir coverage/reports/$(1) $(MOCHA) +$(NYC) --no-clean --report-dir coverage/reports/$(1) $(MOCHA) endef else - test_node := $(MOCHA) +test_node := $(MOCHA) endif TM_BUNDLE = JavaScript\ mocha.tmbundle @@ -32,7 +32,7 @@ lint: test-node: test-bdd test-tdd test-qunit test-exports test-unit test-integration test-jsapi test-compilers test-requires test-reporters test-only test-global-only -test-browser: clean mocha.js test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-exports +test-browser: clean mocha.js test-browser-unit test-browser-bdd test-browser-qunit test-browser-tdd test-browser-esm test: lint test-node test-browser @@ -42,15 +42,19 @@ test-browser-unit: test-browser-bdd: @printf "==> [Test :: Browser :: BDD]\n" - MOCHA_UI=bdd $(MAKE) test-browser-unit + MOCHA_TEST=bdd $(MAKE) test-browser-unit test-browser-qunit: @printf "==> [Test :: Browser :: QUnit]\n" - MOCHA_UI=qunit $(MAKE) test-browser-unit + MOCHA_TEST=qunit $(MAKE) test-browser-unit test-browser-tdd: @printf "==> [Test :: Browser :: TDD]\n" - MOCHA_UI=tdd $(MAKE) test-browser-unit + MOCHA_TEST=tdd $(MAKE) test-browser-unit + +test-browser-esm: + @printf "==> [Test :: Browser :: ESM]\n" + MOCHA_TEST=esm $(MAKE) test-browser-unit test-jsapi: @printf "==> [Test :: JS API]\n" diff --git a/karma.conf.js b/karma.conf.js index 25169630c2..1dba3a7b83 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -35,20 +35,24 @@ module.exports = function (config) { preprocessors: { 'test/**/*.js': ['browserify'] }, - browserify: Object.assign({insertGlobalVars: bundlerOptions.insertGlobalVars}, - { - debug: true, - configure: function configure (b) { - build(b) - .on('bundled', function (err, content) { - if (!err && bundleDirpath) { - // write bundle to directory for debugging - fs.writeFileSync(path.join(bundleDirpath, 'bundle.' + - Date.now() + '.js'), content); - } - }); - } - }), + browserify: Object.assign({ + insertGlobalVars: bundlerOptions.insertGlobalVars + }, { + debug: true, + configure: function configure (b) { + build(b) + .on('bundled', function (err, content) { + if (err) { + throw err; + } + if (bundleDirpath) { + // write bundle to directory for debugging + fs.writeFileSync(path.join(bundleDirpath, 'mocha.' + Date.now() + + '.js'), content); + } + }); + } + }), reporters: ['mocha'], colors: true, browsers: ['PhantomJS'], @@ -63,18 +67,8 @@ module.exports = function (config) { } }; - // see https://github.com/saucelabs/karma-sauce-example - - // We define the browser to run on the Saucelabs Infrastructure - // via the environment variables BROWSER and PLATFORM. - // PLATFORM is e.g. "Windows" - // BROWSER is expected to be in the format "@", - // e.g. "MicrosoftEdge@latest" - // See https://wiki.saucelabs.com/display/DOCS/Platform+Configurator#/ - // for available browsers. - - // TO RUN LOCALLY, execute: - // `CI=1 SAUCE_USERNAME= SAUCE_ACCESS_KEY= BROWSER= PLATFORM= make test-browser` + // TO RUN AGAINST SAUCELABS LOCALLY, execute: + // `CI=1 SAUCE_USERNAME= SAUCE_ACCESS_KEY= make test-browser` var env = process.env; var sauceConfig; @@ -86,8 +80,8 @@ module.exports = function (config) { if (env.SAUCE_USERNAME && env.SAUCE_ACCESS_KEY) { // correlate build/tunnel with Travis sauceConfig = { - build: 'TRAVIS #' + env.TRAVIS_BUILD_NUMBER + - ' (' + env.TRAVIS_BUILD_ID + ')', + build: 'TRAVIS #' + env.TRAVIS_BUILD_NUMBER + ' (' + + env.TRAVIS_BUILD_ID + ')', tunnelIdentifier: env.TRAVIS_JOB_NUMBER, startConnect: false }; @@ -96,8 +90,7 @@ module.exports = function (config) { console.error('No SauceLabs credentials present'); } } else if (env.APPVEYOR) { - console.error('AppVeyor detected'); - bundleDirpath = path.join(baseBundleDirpath, process.env.APPVEYOR_BUILD_ID); + throw new Error('no browser tests should run on AppVeyor!'); } else { console.error('Local/unknown environment detected'); bundleDirpath = path.join(baseBundleDirpath, 'local'); @@ -124,21 +117,50 @@ module.exports = function (config) { addSauceTests(cfg); } - // the MOCHA_UI env var will determine if we're running interface-specific - // tests. since you can only load one at a time, each must be run separately. - // each has its own set of acceptance tests and a fixture. - // the "bdd" fixture is used by default. - var ui = env.MOCHA_UI; - if (ui) { - if (cfg.sauceLabs) { - cfg.sauceLabs.testName = 'Interface "' + ui + '" integration tests'; - } - cfg.files = [ - 'test/browser-fixtures/' + ui + '.fixture.js', - 'test/interfaces/' + ui + '.spec.js' - ]; - } else if (cfg.sauceLabs) { - cfg.sauceLabs.testName = 'Unit Tests'; + /* the MOCHA_TEST env var will be set for "special" cases of tests. + * these may require different interfaces or other setup which make + * them unable to be batched w/ the rest. + */ + var MOCHA_TEST = env.MOCHA_TEST; + switch (MOCHA_TEST) { + case 'bdd': + case 'tdd': + case 'qunit': + if (cfg.sauceLabs) { + cfg.sauceLabs.testName = + 'Interface "' + MOCHA_TEST + '" Integration Tests'; + } + cfg.files = [ + 'test/browser-fixtures/' + MOCHA_TEST + '.fixture.js', + 'test/interfaces/' + MOCHA_TEST + '.spec.js' + ]; + break; + + case 'esm': + // for now we will only run against Chrome to test this. + if (cfg.sauceLabs) { + cfg.sauceLabs.testName = 'ESM Integration Tests'; + cfg.browsers = ['chrome@latest']; + var launcher = cfg.customLaunchers['chrome@latest']; + cfg.customLaunchers = { + 'chrome@latest': launcher + }; + } else if (!env.TRAVIS) { + cfg.browsers = ['Chrome']; + } else { + console.error( + 'skipping ESM tests & exiting; no SauceLabs nor local run detected'); + process.exit(0); + } + cfg.files = [ + 'test/browser-fixtures/esm.fixture.html', + 'test/browser-specific/esm.spec.js' + ]; + break; + default: + if (cfg.sauceLabs) { + cfg.sauceLabs.testName = 'Unit Tests'; + } } config.set(cfg); diff --git a/test/browser-fixtures/esm.fixture.html b/test/browser-fixtures/esm.fixture.html new file mode 100644 index 0000000000..caf03c9ee5 --- /dev/null +++ b/test/browser-fixtures/esm.fixture.html @@ -0,0 +1,7 @@ + + diff --git a/test/browser-specific/esm.spec.js b/test/browser-specific/esm.spec.js new file mode 100644 index 0000000000..d7460f8090 --- /dev/null +++ b/test/browser-specific/esm.spec.js @@ -0,0 +1,5 @@ +'use strict'; + +it('should register a global if it did not fail', function () { + expect(window.MOCHA_IS_OK).to.be.ok(); +});