// 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(); }