UNPKG

@dillonkearns/elm-graphql

Version:

<img src="https://cdn.jsdelivr.net/gh/martimatix/logo-graphqelm/logo.svg" alt="dillonearns/elm-graphql logo" width="40%" align="right">

68 lines (56 loc) 2.39 kB
const {test} = require('ava'); const puppeteer = require('puppeteer'); const childProcess = require("child_process"); let devServerProcess = null; function startServer() { // Ideally we would use webpack dev server's NodeJS API to start the server, but I couldn't // get HMR to work in that case. So we will settle for just spawning the server in a separate process. const command = "npx webpack-dev-server --mode development --port 3333"; devServerProcess = childProcess.exec(command, {cwd: __dirname}, (error, stdout, stderr) => { if (error) { console.error(`failed to launch dev server process; error: ${error}`); } }); } test.before(async () => { global.browser = await puppeteer.launch({ headless: true, // default is true; set to false when debugging failed tests slowMo: 50, // introduce a little delay between each operation dumpio: false, // default is false; set to true when debugging failed tests args: ['--no-sandbox'] // required for CI builds }); }); test.beforeEach(async t => { // TODO [kl] if we ever do multiple webpack tests, we will need to randomize the server listen port t.context.httpServer = startServer(); t.context.serverUrl = 'http://127.0.0.1:3333'; const page = await browser.newPage(); // TODO [kl] get rid of the brittle sleep. find a better way // a one-second delay on my computer is fine, but CircleCI needs more than that. console.log("wait for the server to be ready"); await page.waitFor(5000); console.log("done sleeping"); page.on('pageerror', error => { console.log("BROWSER: uncaught exception: " + error); }); page.on('requestfailed', request => { console.log("BROWSER: request failed: " + request.url()); }); page.on('response', response => { if (!response.ok()) console.error("BROWSER: response: " + response.url() + " " + response.status()); }); t.context.page = page; }); test.afterEach(async t => { await t.context.page.close(); }); test.afterEach.always(async t => { devServerProcess.kill() }); test.after.always(async () => { if (typeof browser !== "undefined") { // normally browser will be defined, but it might not be if a `before` hook failed await browser.close(); } });