0729e4ea1d
- dailies T2: switch ordering test to central-asia-2023 (pixelfed-1 oldest, pixelfed-22 newest) - dailies T3-T6: update KNOWN_SLUG/TITLE/CITY/COUNTRY to the real japan entry (2026-06-17) - stories S1-S7: update all italy-2025 URLs to italy-2026-demo - stories S5/S6: fix URL regex and use val-dorcia-dawn for hero sanity check - maps M5/M6: point Italy GPX map tests to italy-2026-demo (has markers + GPX) - global-setup: run make demo-load before tests so italy-2026-demo always exists - post P2: add retries:1 + test.setTimeout(60s) for intermittent FilePond upload - user: story template hero fallback for media.types config override (see user commit) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Vgmzx8VTTTmCskSpQtsLTr
103 lines
5.3 KiB
JavaScript
103 lines
5.3 KiB
JavaScript
// @ts-check
|
||
// Tests: M1–M4 — MapLibre GL canvas renders on all three map surfaces
|
||
// Requires demo data: run `make demo-load` before this suite.
|
||
const { test, expect } = require('@playwright/test');
|
||
|
||
// ── M1: Full map page renders MapLibre canvas ─────────────────────────────────
|
||
test('M1: /map page renders MapLibre GL canvas without JS errors', async ({ page }) => {
|
||
const errors = [];
|
||
page.on('pageerror', e => errors.push(e.message));
|
||
|
||
await page.goto('/trips/japan-korea-2026/map');
|
||
await expect(page.locator('canvas.maplibregl-canvas')).toBeVisible({ timeout: 10000 });
|
||
expect(errors, 'No JS errors on map page').toHaveLength(0);
|
||
});
|
||
|
||
// ── M2: Full map page — dot markers are in the DOM ───────────────────────────
|
||
test('M2: /map page has at least one dot marker', async ({ page }) => {
|
||
await page.goto('/trips/japan-korea-2026/map');
|
||
await expect(page.locator('canvas.maplibregl-canvas')).toBeVisible({ timeout: 10000 });
|
||
// Markers are added in map.on('load') — wait for first to appear in the DOM
|
||
await expect(page.locator('.maplibregl-marker').first()).toBeVisible({ timeout: 15000 });
|
||
const markerCount = await page.locator('.maplibregl-marker').count();
|
||
expect(markerCount, 'At least one marker present').toBeGreaterThan(0);
|
||
});
|
||
|
||
// ── M3: Dailies mini-map renders MapLibre canvas ─────────────────────────────
|
||
test('M3: Dailies mini-map renders MapLibre GL canvas without JS errors', async ({ page }) => {
|
||
const errors = [];
|
||
page.on('pageerror', e => errors.push(e.message));
|
||
|
||
await page.goto('/trips/japan-korea-2026/dailies');
|
||
await expect(page.locator('#feed-map canvas.maplibregl-canvas')).toBeVisible({ timeout: 10000 });
|
||
expect(errors, 'No JS errors on dailies page').toHaveLength(0);
|
||
});
|
||
|
||
// ── M4: Home map renders MapLibre canvas ─────────────────────────────────────
|
||
test('M4: Home page map renders MapLibre GL canvas without JS errors', async ({ page }) => {
|
||
const errors = [];
|
||
page.on('pageerror', e => errors.push(e.message));
|
||
|
||
await page.goto('/');
|
||
await expect(page.locator('#home-map canvas.maplibregl-canvas')).toBeVisible({ timeout: 10000 });
|
||
expect(errors, 'No JS errors on home page').toHaveLength(0);
|
||
});
|
||
|
||
// ── M5: Italy map — no JS errors with GPX present ────────────────────────────
|
||
test('M5: Italy map page renders without JS errors (GPX present)', async ({ page }) => {
|
||
const errors = [];
|
||
page.on('pageerror', e => errors.push(e.message));
|
||
|
||
await page.goto('/trips/italy-2026-demo/map');
|
||
await expect(page.locator('canvas.maplibregl-canvas')).toBeVisible({ timeout: 10000 });
|
||
// Wait for markers to confirm map.on('load') completed
|
||
await expect(page.locator('.maplibregl-marker').first()).toBeVisible({ timeout: 15000 });
|
||
// Give Promise.all time to resolve
|
||
await page.waitForTimeout(3000);
|
||
|
||
expect(errors, 'No JS errors on Italy map page').toHaveLength(0);
|
||
});
|
||
|
||
// ── M6: Italy map — journey source exists after GPX loads ────────────────────
|
||
test('M6: Italy map has a journey MapLibre source after GPX settles', async ({ page }) => {
|
||
await page.goto('/trips/italy-2026-demo/map');
|
||
await expect(page.locator('canvas.maplibregl-canvas')).toBeVisible({ timeout: 10000 });
|
||
await expect(page.locator('.maplibregl-marker').first()).toBeVisible({ timeout: 15000 });
|
||
|
||
// Wait until the journey source appears — addJourneySegments runs inside Promise.all.then()
|
||
// `var map = ...` in map.html.twig is a plain <script> var → available as window.map.
|
||
await page.waitForFunction(function () {
|
||
return window.map &&
|
||
(window.map.getSource('journey') !== undefined ||
|
||
window.map.getSource('journey-0') !== undefined);
|
||
}, { timeout: 15000 });
|
||
|
||
const hasSource = await page.evaluate(function () {
|
||
return !!(window.map.getSource('journey') || window.map.getSource('journey-0'));
|
||
});
|
||
|
||
expect(hasSource).toBe(true);
|
||
});
|
||
|
||
// ── M7: Clicking a trip-page map marker adds is-highlighted to the entry card ──
|
||
test('M7: clicking map marker briefly highlights the corresponding entry card', async ({ page }) => {
|
||
await page.goto('/trips/japan-korea-2026');
|
||
// Wait for map canvas and at least one marker
|
||
await expect(page.locator('#trip-map canvas.maplibregl-canvas')).toBeVisible({ timeout: 10000 });
|
||
await expect(page.locator('.maplibregl-marker').first()).toBeVisible({ timeout: 15000 });
|
||
|
||
// Wait for tripMap to finish animating (fitBounds animation completes)
|
||
await page.waitForFunction(function () {
|
||
return window.tripMap &&
|
||
!window.tripMap.isMoving() &&
|
||
!window.tripMap.isZooming() &&
|
||
!window.tripMap.isRotating();
|
||
}, { timeout: 15000 });
|
||
|
||
// Click the first marker
|
||
await page.locator('.maplibregl-marker').first().click();
|
||
|
||
// Within 500ms of click + delay, one journal-post should have is-highlighted
|
||
await expect(page.locator('.journal-post.is-highlighted')).toBeVisible({ timeout: 1500 });
|
||
});
|