scripts/test-samples.ts (36 lines of code) (raw):
import { readdirSync } from 'node:fs';
import cp from 'node:child_process';
import fs from 'node:fs/promises';
import path from 'node:path';
import assert from 'node:assert';
import waitOn from 'wait-on';
import { chromium, firefox, webkit } from 'playwright';
const samplesFolder = path.join(__dirname, '../samples');
async function main() {
for (const dir of readdirSync(samplesFolder)) {
const cwd = path.join(samplesFolder, dir);
const pkg = JSON.parse(await fs.readFile(path.join(cwd, 'package.json'), { encoding: 'utf-8' }));
if ('playwright:prepare' in pkg.scripts) {
cp.execSync('yarn playwright:prepare', { cwd, stdio: 'inherit' });
}
// Running with cp.exec causes us to be unable to easily close some
// webservers in CI
const webserver = cp.spawn('yarn', ['playwright:webserver'], { cwd, stdio: 'inherit' });
console.log('Waiting for webserver to start');
await waitOn({ resources: ['http://localhost:3000'], timeout: 120_000 });
for (const browserType of [chromium, firefox, webkit]) {
console.log('samples/' + dir + ' ' + browserType.name());
const browser = await browserType.launch();
const page = await browser.newPage();
await page.goto('localhost:3000');
assert(await page.evaluate('healthCheck()'));
console.log('Sanity check passed!');
await browser.close();
}
const exited = new Promise((resolve) => {
webserver.on('close', resolve);
});
webserver.kill();
// Webserver takes a moment to close after kill signal is sent
console.log('Waiting for webserver to stop');
await exited;
}
}
main();