/** * Sprint 7 item 6 — визуальная проверка breadcrumbs на edit-странице. * Логинимся, seed-demo, открываем первый товар, скриншот шапки. */ import { chromium } from 'playwright' import { makeClient, login } from '../lib/api.js' const BASE = process.env.E2E_ADMIN_URL ?? 'https://test.admin.food-market.kz' const TS = Date.now() const EMAIL = `crumb-shot-${TS}@food-market.local` const PASS = 'CrumbShot12345!' async function ensureSession() { const api = makeClient() const r = await api.post('/api/auth/signup', { email: EMAIL, password: PASS, organizationName: `CrumbShot ${TS}`, phone: '+77011190001', plan: 'start', }) if (r.status !== 200) throw new Error(`signup ${r.status}: ${JSON.stringify(r.data)}`) const sess = await login(EMAIL, PASS) await makeClient(sess.accessToken).post('/api/admin/seed-demo', {}) return sess } async function main() { const sess = await ensureSession() const browser = await chromium.launch({ headless: true }) const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: { width: 1280, height: 800 } }) const page = await ctx.newPage() await page.goto(`${BASE}/`) await page.evaluate(({ token }) => localStorage.setItem('fm.access_token', token), { token: sess.accessToken }) await page.goto(`${BASE}/catalog/products`, { waitUntil: 'domcontentloaded' }) await page.waitForLoadState('networkidle') await page.locator('tbody tr').first().waitFor({ timeout: 12000 }) await page.locator('tbody tr').first().click() await page.waitForLoadState('networkidle') await page.waitForSelector('nav[aria-label="Хлебные крошки"]', { timeout: 8000 }) await page.screenshot({ path: `reports/breadcrumbs-product-${TS}.png`, fullPage: false }) console.log(`[shot] saved → reports/breadcrumbs-product-${TS}.png`) await browser.close() } main().catch(err => { console.error(err); process.exit(1) })