feat: finally got e2e tests working all the time thanks to some help! Committing here for reference before we get npm going properly

This commit is contained in:
Marc Klocke 2021-11-08 15:30:36 -07:00
parent e728ff78c4
commit d2c2647ae8
3 changed files with 82 additions and 40 deletions

View file

@ -4,7 +4,7 @@ import type {Config} from '@jest/types';
const config: Config.InitialOptions = {
preset: 'ts-jest',
testMatch: ['**/playground/**/*.(spec|test).[jt]s?(x)'],
testTimeout: process.env.CI ? 30000 : 10000,
testTimeout: process.env.CI ? 30000 : 1000000,
watchPathIgnorePatterns: ['<rootDir>/temp'],
globalSetup: './scripts/jest-e2e-setup.js',
globalTeardown: './scripts/jest-e2e-teardown.js',

View file

@ -3,6 +3,7 @@
// the default e2e test serve behavior
const path = require('path');
const {spawn} = require('child_process');
const port = (exports.port = 9528);
@ -11,51 +12,92 @@ const port = (exports.port = 9528);
* @param {boolean} isProd
*/
exports.serve = async function serve(root, isProd) {
// we build first, regardless of whether it's prod/build mode
// because Vite doesn't support the concept of a "webworker server"
const {build} = require('vite');
// we build first, regardless of whether it's prod/build mode
// because Vite doesn't support the concept of a "webworker server"
const {build} = require('vite');
// client build
await build({
root,
logLevel: 'silent',
build: {
outDir: 'dist/client',
manifest: true,
},
});
// client build
await build({
root,
logLevel: 'silent',
build: {
outDir: 'dist/client',
manifest: true,
},
});
process.env.WORKER = 'true';
process.env.WORKER = 'true';
// worker build
await build({
root,
logLevel: 'silent',
build: {
ssr: 'worker.js',
outDir: 'dist/worker',
},
});
// worker build
await build({
root,
logLevel: 'silent',
build: {
ssr: 'worker.js',
outDir: 'dist/worker',
},
});
delete process.env.WORKER;
delete process.env.WORKER;
const {createServer} = require(path.resolve(root, 'start-worker.js'));
const {app} = await createServer(root, isProd);
let oxygenRunPath = process.env.OXYGEN_RUN_PATH
oxygenRunPath = '/Users/mklocke/src/github.com/Shopify/oxygen-sws/bin/oxygen-run-darwin-amd64'
return new Promise((resolve, reject) => {
try {
const server = app.listen(port, () => {
resolve({
// for test teardown
async close() {
await new Promise((resolve) => {
server.close(resolve);
if (oxygenRunPath) {
console.info("Using oxygen run binary to perform e2e tests.");
const assetPath = path.resolve(root, 'dist/client/assets');
const workerPath = path.resolve(root, 'dist/worker/worker.js');
try {
const child = spawn(`${oxygenRunPath}`, ['--address', `localhost:${port}`, '-a', `${assetPath}`, '-w', `${workerPath}`])
await child.unref();
child.on('error', (err) => {
console.error('Failed to start subprocess.', err);
});
},
await new Promise(resolve => {
child.on('message', (message) => {
resolve();
})
child.stdout.on('data', (data) => {
resolve();
});
});
console.log("Oxygen Started")
return {
async close() {
console.log('killed')
child.kill();
},
};
} catch (e) {
console.error(e)
}
} else {
console.info("Using miniflare to perform e2e tests.");
const {createServer} = require(path.resolve(root, 'start-worker.js'));
const {app} = await createServer(root, isProd);
return new Promise((resolve, reject) => {
try {
const server = app.listen(port, () => {
resolve({
// for test teardown
async close() {
await new Promise((resolve) => {
server.close(resolve);
});
},
});
});
} catch (e) {
reject(e);
}
});
});
} catch (e) {
reject(e);
}
});
};

View file

@ -3,7 +3,7 @@ import {port} from './serve';
const url = `http://localhost:${port}`;
it('shows the homepage, navigates to about, and increases the count', async () => {
await page.goto(url + '/');
await page.goto(url + '/', { waitUntil: 'networkidle' });
expect(await page.textContent('body')).toContain('Home');
await page.click('.btn');