create-fusion-app/test-utils/test-utils.js (56 lines of code) (raw):

// @flow /* eslint-env jest, node */ const {spawn} = require('child_process'); const getPort = require('get-port'); const fetch = require('isomorphic-fetch'); async function startServer() { const port = await getPort(); // Spin up server const opts = { cwd: __dirname + '/../test-artifacts/test-scaffold', stdio: 'inherit', env: {...process.env}, }; const proc = spawn( './node_modules/.bin/fusion', ['dev', '--port', port, '--no-open'], opts ); const stdoutLines = []; const stderrLines = []; proc.stdout && proc.stdout.on('data', (data /*: string*/) => { stdoutLines.push(data.toString()); }); proc.stderr && proc.stderr.on('data', (data /*: string*/) => { stderrLines.push(data.toString()); }); proc.on('close', (code /*: number*/) => { if (process.env.VERBOSE) { const stdout = stdoutLines.join('\n'); const stderr = stderrLines.join('\n'); // eslint-disable-next-line no-console console.log({stdout, stderr, code}); } }); proc.on('error', e => { // eslint-disable-next-line no-console console.log(e); }); // Wait for server to start let started = false; let numTries = 0; let res, initialResponse; while (!started && numTries < 20) { await new Promise(resolve => setTimeout(resolve, 500)); try { res = await fetch(`http://localhost:${port}/`, { headers: {accept: 'text/html'}, }); initialResponse = await res.text(); started = true; } catch (e) { numTries++; } } if (!started) { throw new Error('Failed to start server'); } return {initialResponse, port, proc}; } module.exports.startServer = startServer;