runner.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /* eslint-disable no-undef, no-process-exit */
  2. const fs = require('fs');
  3. const path = require('path');
  4. const mkdirp = require('mkdirp');
  5. const puppeteer = require('puppeteer');
  6. const webpack = require('webpack');
  7. const config = require('../../webpack.config');
  8. const middleware = require('webpack-dev-middleware');
  9. const express = require('express');
  10. const devRoutes = require('../../server/bin/test');
  11. const app = express();
  12. const wpm = middleware(webpack(config(null, { mode: 'development' })), {
  13. logLevel: 'silent'
  14. });
  15. app.use(wpm);
  16. devRoutes(app, { middleware: wpm });
  17. function onConsole(msg) {
  18. // excluding 'log' because mocha uses it to write the json output
  19. if (msg.type() !== 'log') {
  20. console.error(msg.text());
  21. }
  22. }
  23. const server = app.listen(async function() {
  24. let exitCode = -1;
  25. const browser = await puppeteer.launch();
  26. try {
  27. const page = await browser.newPage();
  28. page.on('console', onConsole);
  29. page.on('pageerror', console.log.bind(console));
  30. await page.goto(`http://127.0.0.1:${server.address().port}/test`);
  31. await page.waitFor(() => typeof runner.testResults !== 'undefined', {
  32. polling: 1000,
  33. timeout: 15000
  34. });
  35. const results = await page.evaluate(() => runner.testResults);
  36. const coverage = await page.evaluate(() => __coverage__);
  37. if (coverage) {
  38. const dir = path.resolve(__dirname, '../../.nyc_output');
  39. mkdirp.sync(dir);
  40. fs.writeFileSync(
  41. path.resolve(dir, 'frontend.json'),
  42. JSON.stringify(coverage)
  43. );
  44. }
  45. const stats = results.stats;
  46. exitCode = stats.failures;
  47. console.log(`${stats.passes} passing (${stats.duration}ms)\n`);
  48. if (stats.failures) {
  49. console.log('Failures:\n');
  50. for (const f of results.failures) {
  51. console.log(`${f.fullTitle}`);
  52. console.log(` ${f.err.stack}\n`);
  53. }
  54. }
  55. } catch (e) {
  56. console.log(e);
  57. } finally {
  58. browser.close();
  59. server.close(() => {
  60. process.exit(exitCode);
  61. });
  62. }
  63. });