Compare commits

...

1 commit

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

View file

@ -3,6 +3,7 @@
// the default e2e test serve behavior // the default e2e test serve behavior
const path = require('path'); const path = require('path');
const {spawn} = require('child_process');
const port = (exports.port = 9528); const port = (exports.port = 9528);
@ -11,51 +12,92 @@ const port = (exports.port = 9528);
* @param {boolean} isProd * @param {boolean} isProd
*/ */
exports.serve = async function serve(root, isProd) { exports.serve = async function serve(root, isProd) {
// we build first, regardless of whether it's prod/build mode // we build first, regardless of whether it's prod/build mode
// because Vite doesn't support the concept of a "webworker server" // because Vite doesn't support the concept of a "webworker server"
const {build} = require('vite'); const {build} = require('vite');
// client build // client build
await build({ await build({
root, root,
logLevel: 'silent', logLevel: 'silent',
build: { build: {
outDir: 'dist/client', outDir: 'dist/client',
manifest: true, manifest: true,
}, },
}); });
process.env.WORKER = 'true'; process.env.WORKER = 'true';
// worker build // worker build
await build({ await build({
root, root,
logLevel: 'silent', logLevel: 'silent',
build: { build: {
ssr: 'worker.js', ssr: 'worker.js',
outDir: 'dist/worker', outDir: 'dist/worker',
}, },
}); });
delete process.env.WORKER; delete process.env.WORKER;
const {createServer} = require(path.resolve(root, 'start-worker.js')); let oxygenRunPath = process.env.OXYGEN_RUN_PATH
const {app} = await createServer(root, isProd); oxygenRunPath = '/Users/mklocke/src/github.com/Shopify/oxygen-sws/bin/oxygen-run-darwin-amd64'
return new Promise((resolve, reject) => { if (oxygenRunPath) {
try { console.info("Using oxygen run binary to perform e2e tests.");
const server = app.listen(port, () => {
resolve({ const assetPath = path.resolve(root, 'dist/client/assets');
// for test teardown const workerPath = path.resolve(root, 'dist/worker/worker.js');
async close() { try {
await new Promise((resolve) => { const child = spawn(`${oxygenRunPath}`, ['--address', `localhost:${port}`, '-a', `${assetPath}`, '-w', `${workerPath}`])
server.close(resolve); 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}`; const url = `http://localhost:${port}`;
it('shows the homepage, navigates to about, and increases the count', async () => { 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'); expect(await page.textContent('body')).toContain('Home');
await page.click('.btn'); await page.click('.btn');