'use strict'; const fs = require('fs'); const glob = require('glob'); const Mocha = require('mocha'); const path = require('path'); const webdriver = require('selenium-webdriver'); const Snapshot = require('./Snapshot'); let snapshot; let takeScreenshots = false; function startDevServer() { const server = require('@stencil/dev-server/dist'); // TODO: fix after stencil-dev-server PR #16 is merged const cmdArgs = ['--config', path.join(__dirname, '../stencil.config.js'), '--no-open']; return server.run(cmdArgs); } function getTestFiles() { return new Promise((resolve, reject) => { const src = path.join(__dirname, '../src/**/*.e2e-spec.js'); glob(src, (err, files) => { if (err) { reject(err); } else { resolve(files); } }); }); } function processCommandLine() { process.argv.forEach(arg => { if (arg === '--snapshot') { takeScreenshots = true; } }); } function registerE2ETest(desc, tst) { // NOTE: Do not use an arrow function here because: https://mochajs.org/#arrow-functions it(desc, async function() { const driver = new webdriver.Builder().forBrowser('chrome').build(); await tst(driver); if (takeScreenshots) { await snapshot.takeScreenshot(driver, { name: this.test.fullTitle() }); } return driver.quit(); }); } async function run() { const mocha = new Mocha({ timeout: 5000, slow: 2000 }); processCommandLine(); snapshot = new Snapshot({ platformDefaults: { params: { height: 800, width: 400 } } }); const devServer = await startDevServer(); const files = await getTestFiles(); files.forEach(f => mocha.addFile(f)); mocha.run(function(failures) { process.on('exit', function() { process.exit(failures); // exit with non-zero status if there were failures }); devServer.close(); }); } module.exports = { register: registerE2ETest, run: run };