Files
citygen/scripts/generation-browser-smoke.mjs

38 lines
2.4 KiB
JavaScript

// Run with `node --import tsx scripts/generation-browser-smoke.mjs`.
// Uses the same optional Playwright environment variables as browser-smoke.mjs.
import { createRequire } from 'node:module';
import { resolve } from 'node:path';
import assert from 'node:assert/strict';
import { create, toBinary } from '@bufbuild/protobuf';
import { CityJobSchema } from '../client/generated/city_pb.ts';
const require = createRequire(process.env.CITYGEN_BROWSER_MODULES ? resolve(process.env.CITYGEN_BROWSER_MODULES, 'package.json') : import.meta.url);
const { chromium } = require('playwright');
const browser = await chromium.launch({ headless: true, executablePath: process.env.CITYGEN_BROWSER_EXECUTABLE });
try {
const page = await browser.newPage();
const errors = []; page.on('pageerror', error => errors.push(error.message));
let posts = 0, polls = 0, failed = false;
await page.route('**/api/cities/jobs**', async route => {
if (route.request().method() === 'POST') posts++;
else polls++;
const job = create(CityJobSchema, { id: 'resume-test', cityId: 'test', status: failed ? 'failed' : 'running', stage: 'Повтор Overpass', error: failed ? 'Overpass временно недоступен' : '' });
await route.fulfill({ contentType: 'application/x-protobuf', body: Buffer.from(toBinary(CityJobSchema, job)) });
});
const url = `${process.env.CITYGEN_TEST_URL || 'http://127.0.0.1:3000'}/?create-city&job=resume-test`;
await page.goto(url);
await page.getByText('Повтор Overpass…', { exact: true }).waitFor();
await page.reload();
await page.getByText('Повтор Overpass…', { exact: true }).waitFor();
await page.getByRole('button', { name: 'Закрыть ожидание', exact: true }).click();
await page.locator('.overlay').waitFor({ state: 'hidden' });
await page.getByRole('button', { name: 'Сгенерировать', exact: true }).click();
await page.getByText('Повтор Overpass…', { exact: true }).waitFor();
failed = true;
await page.locator('.err').filter({ hasText: 'Overpass временно недоступен' }).waitFor();
assert.equal(new URL(page.url()).searchParams.has('job'), false);
assert.equal(posts, 0, 'reload and resume must not create another job');
assert.ok(polls >= 3);
assert.deepEqual(errors, []);
console.log(JSON.stringify({ generationResume: 'passed', posts, polls }));
} finally { await browser.close(); }