test: re-point suite off retired standalone views
Phase-1 fallout: delete tests for deleted pages, re-point moved-behavior tests to the trip/home page where the content now lives. - maps.spec: keep M4/M7/M8 (home+trip maps); drop M1-3,5,6,9-11 (/map, /dailies & /stories mini-maps) - map-ux: re-point MUX4/5 sort toggle to #trip-sort-toggle on trip page - nav: N1->trip page, N2->home, drop N3 (/stats) + N5 (obsolete skip) - dailies: T1->trip page; T2->trip page with oldest-first assertion; fix T3-T6 stale entry-detail selectors (.entry-* -> .journal-post-*, pre-existing failures from an earlier entry redesign) - stories: S1/S5 -> trip feed story cards ([data-type=story]) - gpx-journey: load MapUtils from the trip page instead of /map - a11y: A4 photo strips -> trip page; drop AX3 (covered by AX2) - post/helpers: verify posted entry on the trip page (ACTIVE_TRIP_URL) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+5
-104
@@ -1,38 +1,11 @@
|
||||
// @ts-check
|
||||
// Tests: M1–M4 — MapLibre GL canvas renders on all three map surfaces
|
||||
// Tests: M4, M7, M8 — MapLibre GL renders on the two live map surfaces (home + trip page).
|
||||
// The standalone /map, /dailies mini-map and /stories mini-map surfaces were retired
|
||||
// (see docs/working/plans/2026-07-04-standalone-page-cleanup.md); their coverage now
|
||||
// lives on the trip and home maps, both driven by MapUtils.initEntryMap().
|
||||
// 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/italy-2026-demo/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/italy-2026-demo/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/italy-2026-demo/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 = [];
|
||||
@@ -43,42 +16,6 @@ test('M4: Home page map renders MapLibre GL canvas without JS errors', async ({
|
||||
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/italy-2026-demo');
|
||||
@@ -103,7 +40,7 @@ test('M7: clicking map marker briefly highlights the corresponding entry card',
|
||||
|
||||
// ── M8: Home map has GPX journey source on active trip ────────────────────────
|
||||
test('M8: home map has a journey source after GPX settles (active trip)', async ({ page }) => {
|
||||
// Requires travelling: true in user/config/site.yaml (set in Task 1).
|
||||
// Requires travelling: true in user/config/site.yaml.
|
||||
// Requires GPX files attached to the active trip (italy-2026-demo has 7).
|
||||
const errors = [];
|
||||
page.on('pageerror', e => errors.push(e.message));
|
||||
@@ -125,39 +62,3 @@ test('M8: home map has a journey source after GPX settles (active trip)', async
|
||||
expect(hasSource, 'Home map has a journey or GPX source').toBe(true);
|
||||
expect(errors, 'No JS errors on home page').toHaveLength(0);
|
||||
});
|
||||
|
||||
// ── M9: Stories mini-map renders MapLibre canvas ──────────────────────────────
|
||||
test('M9: Stories 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/italy-2026-demo/stories');
|
||||
await expect(page.locator('#stories-map canvas.maplibregl-canvas')).toBeVisible({ timeout: 10000 });
|
||||
expect(errors, 'No JS errors on stories page').toHaveLength(0);
|
||||
});
|
||||
|
||||
// ── M10: Stories mini-map has at least one story marker ──────────────────────
|
||||
test('M10: Stories mini-map has at least one story marker', async ({ page }) => {
|
||||
await page.goto('/trips/italy-2026-demo/stories');
|
||||
await expect(page.locator('#stories-map canvas.maplibregl-canvas')).toBeVisible({ timeout: 10000 });
|
||||
await expect(page.locator('#stories-map .maplibregl-marker').first()).toBeVisible({ timeout: 15000 });
|
||||
|
||||
const markerCount = await page.locator('#stories-map .maplibregl-marker').count();
|
||||
expect(markerCount, 'At least one story marker').toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
// ── M11: Dailies attribution control starts collapsed ─────────────────────────
|
||||
test('M11: Dailies mini-map attribution starts collapsed (no open attribute)', async ({ page }) => {
|
||||
await page.goto('/trips/italy-2026-demo/dailies');
|
||||
await expect(page.locator('#feed-map canvas.maplibregl-canvas')).toBeVisible({ timeout: 10000 });
|
||||
// Wait for markers (added in map.on('load')) to ensure the load callback has run,
|
||||
// which is also where removeAttribute('open') executes.
|
||||
await expect(page.locator('#feed-map .maplibregl-marker').first()).toBeVisible({ timeout: 15000 });
|
||||
await expect(page.locator('#feed-map .maplibregl-ctrl-attrib')).toBeVisible({ timeout: 10000 });
|
||||
|
||||
const hasOpen = await page.evaluate(function () {
|
||||
var attrib = document.querySelector('#feed-map .maplibregl-ctrl-attrib');
|
||||
return attrib ? attrib.hasAttribute('open') : null;
|
||||
});
|
||||
expect(hasOpen, 'Attribution is collapsed (no open attribute)').toBe(false);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user