runner.js 2.1 KB

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