← back to Gallery Agentabrams

verification/grateful-dead-gallery.e2e.js

60 lines

#!/usr/bin/env node
const { chromium } = require('/Users/macstudio3/Projects/Designer-Wallcoverings/node_modules/playwright');

const ids = [
  'long-strange-archive',
  'deadhead-print-lab',
  'wall-of-sound',
  'routes-residencies-rituals',
  'objects-golden-road',
];
const titles = [
  'The Long Strange Archive',
  'Deadhead Print Lab',
  'Wall of Sound: An Immersive Room',
  'Routes, Residencies & Rituals',
  'Objects in the Golden Road',
];

(async () => {
  const base = process.env.GALLERY_URL || 'http://127.0.0.1:8792/';
  const browser = await chromium.launch({ executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', headless: true });
  const page = await browser.newPage({ viewport: { width: 1440, height: 1100 } });
  const errors = [];
  page.on('pageerror', error => errors.push(String(error)));
  page.on('console', message => {
    if (message.type() === 'error' && !/^Failed to load resource:/.test(message.text())) errors.push(message.text());
  });
  await page.goto(base, { waitUntil: 'networkidle' });
  await page.waitForSelector('.card');
  if (await page.locator('.card').count() !== 6) throw new Error('expected six gallery cards');
  const text = await page.locator('#grid').innerText();
  for (const title of titles) if (!text.includes(title)) throw new Error(`missing gallery title: ${title}`);

  for (const id of ids) {
    const card = page.locator(`.card[data-id="${id}"]`);
    const image = card.locator('img');
    if (!await image.evaluate(node => node.complete && node.naturalWidth > 0)) throw new Error(`${id} cover failed`);
    await card.locator('.preview').click();
    await page.waitForSelector('#overlay.open');
    await page.waitForFunction(expected => {
      const frame = document.querySelector('#ovFrame');
      try { return frame.contentWindow.location.pathname.includes(expected); } catch (_) { return false; }
    }, id);
    const frame = page.frameLocator('#ovFrame');
    await frame.locator('body').waitFor();
    const bodyText = await frame.locator('body').innerText();
    if (bodyText.trim().length < 100) throw new Error(`${id} preview is empty`);
    await page.locator('#ovClose').click();
  }

  await page.selectOption('#sort', 'newest');
  await page.locator('#density').fill('2');
  const persisted = await page.evaluate(() => ({ sort: localStorage.getItem('gallery:sort'), density: localStorage.getItem('gallery:density') }));
  if (persisted.sort !== 'newest' || persisted.density !== '2') throw new Error(`controls did not persist: ${JSON.stringify(persisted)}`);
  await page.screenshot({ path: 'verification/grateful-dead-gallery-live.png', fullPage: true });
  if (errors.length) throw new Error(`browser errors: ${errors.join(' | ')}`);
  console.log(JSON.stringify({ pass: true, cards: 6, deadBuilds: ids.length, previews: ids.length, persisted, browserErrors: 0 }));
  await browser.close();
})().catch(error => { console.error(error.stack || error); process.exit(1); });