// Local-only browser acceptance runner. It uses the disposable fixtures served by browser-qa.mjs. import { spawn } from 'node:child_process'; import { writeFile, mkdir } from 'node:fs/promises'; import { chromium } from 'playwright'; const server = spawn(process.execPath, ['tests/browser-qa.mjs'], { cwd: new URL('..', import.meta.url), stdio: ['ignore', 'pipe', 'inherit'] }); let output = ''; const url = await new Promise((resolve, reject) => { const timeout = setTimeout(() => reject(new Error('QA sunucusu başlatılamadı.')), 30_000); server.stdout.on('data', chunk => { output += chunk; const match = /QA_URL=(\S+)/.exec(output); if (match) { clearTimeout(timeout); resolve(match[1]); } }); server.once('exit', code => { clearTimeout(timeout); reject(new Error(`QA sunucusu ${code} koduyla kapandı.`)); }); }); const browser = await chromium.launch({ headless: true }); const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); const evidence = { url, checks: {}, scope: 'Yerel sentetik QA; gerçek başvuru veya dış sağlayıcı çağrısı yapılmadı.' }; try { const response = await page.goto(url, { waitUntil: 'networkidle' }); evidence.checks.signInStatus = response?.status(); await page.getByRole('button', { name: 'Test hesabıyla gir' }).click(); await page.waitForLoadState('networkidle'); evidence.checks.visibleCities = await Promise.all(['Giresun', 'Kayseri', 'Akdeniz', 'Aksaray', 'Tepecik'].map(async city => ({ city, count: await page.getByText(city, { exact: false }).count() }))); if (evidence.checks.visibleCities.some(item => item.count < 1)) throw new Error('Beş sentetik şehirden biri görünmedi.'); const overview = await page.goto(`${url.replace(/\/qa-signin$/, '')}/qa-overview`, { waitUntil: 'networkidle' }); evidence.checks.overviewStatus = overview?.status(); evidence.checks.overviewFrames = await page.locator('iframe[title^="Hazırlık"]').count(); if (evidence.checks.overviewFrames !== 3) throw new Error('Hazırlık özeti üç görünüm alanında açılmadı.'); } finally { await page.close(); await browser.close(); server.kill('SIGTERM'); } await mkdir('docs/quality/evidence', { recursive: true }); await writeFile('docs/quality/evidence/qa-browser-acceptance-runtime.json', JSON.stringify(evidence, null, 2) + '\n'); console.log(JSON.stringify(evidence));