Files
intotheeast-com/tests/ui/trip/trips-list.spec.js
T
m038andClaude Opus 4.8 6a73be3e49 test(trip): tighten description-clamp assertion + correct R11 coverage note
- trip-header.spec.js: replace the vacuous `toContainText('finally made
  sense')` (the tail text is in the DOM even while collapsed) with real
  clamp/un-clamp assertions — clientHeight < scrollHeight when collapsed,
  clientHeight >= scrollHeight once expanded — so the test actually proves the
  toggle changes visibility.
- trips-list.spec.js: the header comment claimed R11 coverage no fixture
  provided. Note that R11 (set-but-unresolvable cover_image) shares the exact
  else-branch the R7/AE3 fallback test exercises, so it's covered by
  construction in the shared cover macro.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RDS6t8wcpbwKvvrxykVQ5K
2026-07-07 08:35:41 +02:00

61 lines
3.1 KiB
JavaScript

// @ts-check
// Tests: U3 — trip-list card one-liner + retina cover (R5, R6, R7, R14)
// R11 (set-but-unresolvable cover_image falls back) shares the exact else-branch
// exercised by the R7/AE3 fallback test below; it is covered by construction in
// the shared cover macro rather than by a dedicated fixture here.
const { test, expect } = require('@playwright/test');
const DEMO_HREF = '/trips/italy-2026-demo'; // has a tagline, no cover_image (entry-image fallback)
const NO_TAGLINE_HREF = '/trips/slovenia-2024'; // a real trip with no tagline
const demoCard = (page) => page.locator(`.trip-card[href="${DEMO_HREF}"]`);
// ── R5: one-liner renders between the title and the meta line ──────────────────
test('U3/R5: card with a tagline shows a one-liner between title and meta', async ({ page }) => {
await page.goto('/trips');
const card = demoCard(page);
const tagline = card.locator('.trip-card-tagline');
await expect(tagline).toBeVisible();
await expect(tagline).toHaveText(/southern Tuscany by bike/);
const order = await card.evaluate((el) =>
Array.from(el.children).map((c) => c.className.split(' ')[0])
);
expect(order.indexOf('trip-card-title')).toBeLessThan(order.indexOf('trip-card-tagline'));
expect(order.indexOf('trip-card-tagline')).toBeLessThan(order.indexOf('trip-card-meta'));
});
// ── R5/AE1: a card with no tagline renders no one-liner element ────────────────
test('U3/R5/AE1: card without a tagline renders no one-liner element', async ({ page }) => {
await page.goto('/trips');
const card = page.locator(`.trip-card[href="${NO_TAGLINE_HREF}"]`);
await expect(card).toBeVisible();
await expect(card.locator('.trip-card-tagline')).toHaveCount(0);
});
// ── R6/AE5: card cover exposes a retina srcset (720w + 1440w candidates) ───────
test('U3/R6/AE5: card cover img carries a 720w/1440w srcset', async ({ page }) => {
await page.goto('/trips');
const img = demoCard(page).locator('.trip-card-cover img');
const srcset = await img.getAttribute('srcset');
expect(srcset).toContain('720w');
expect(srcset).toContain('1440w');
});
// ── R7/AE3: with no cover_image set, the card falls back to a journal image ────
test('U3/R7/AE3: card with no cover_image uses the first journal entry image', async ({ page }) => {
await page.goto('/trips');
// The demo trip sets cover_image: '' so the cover comes from the fallback.
const img = demoCard(page).locator('.trip-card-cover img');
await expect(img).toBeVisible();
const src = await img.getAttribute('src');
expect(src).toMatch(/\/images\/.+\.(jpg|jpeg|png|webp)/i);
});
// ── R14: cover alt text equals the trip title ─────────────────────────────────
test('U3/R14: card cover alt equals the trip title', async ({ page }) => {
await page.goto('/trips');
const img = demoCard(page).locator('.trip-card-cover img');
await expect(img).toHaveAttribute('alt', 'Tuscany 2026');
});