import { test, expect } from '@playwright/test'; import { waitForMap } from '../support/app.js'; // El "mapa gris" de /fires: en staging la página no pintaba ninguna tesela, no // creaba la suscripción por viewport y se quedaba en "Actualizando…" para // siempre. Causa, encontrada reproduciéndolo con el bundle de producción en // local (con el servidor de desarrollo NO se ve): // // Tracker.autorun(() => { // if ((centerStored !== [0, 0] || geolocation.get()) && geoInit) { // center.set(centerStored || geolocation.get()); // geoInit = false; // } // // `centerStored !== [0, 0]` compara contra un array recién creado, así que es // SIEMPRE cierto. En un navegador nuevo —sin centro en localStorage y con la // geolocalización aún sin resolver— eso hacía `center.set(undefined)` y dejaba // `geoInit` en false, o sea para siempre. Un `` sin `center` no // recibe `setView`, y un mapa de Leaflet sin vista no carga capa base ni // teselas ni dispara `whenReady`, con lo que tampoco se crea la suscripción por // viewport. En desarrollo no se veía porque la geolocalización ya estaba // resuelta cuando el mapa se montaba. // // ⚠️ Estos tests solo muerden contra un bundle de PRODUCCIÓN, que es lo que // levanta el job nocturno de CI. Contra el servidor de desarrollo pasan igual. test.describe('mapa de fuegos activos', () => { test('paints its tiles', async ({ page }) => { await page.goto('/fires'); await waitForMap(page); await expect(page.locator('.leaflet-tile-loaded').first()).toBeVisible({ timeout: 60000 }); expect(await page.locator('.leaflet-tile').count()).toBeGreaterThan(0); }); test('keeps exactly one base layer, and it is on the map', async ({ page }) => { await page.goto('/fires'); await waitForMap(page); expect(await page.locator('.leaflet-control-layers-base input').count()).toBeGreaterThanOrEqual(2); expect(await page.locator('.leaflet-control-layers-base input:checked').count()).toEqual(1); // Marcada en el control pero ausente del mapa es justo el síntoma del bug. expect(await page.locator('.leaflet-tile-pane .leaflet-layer').count()).toBeGreaterThan(0); }); test('subscribes to the fires of the current viewport', async ({ page }) => { await page.goto('/fires'); await waitForMap(page); const names = await page.evaluate(() => Object.values(window.Meteor.connection._subscriptions).map(s => s.name)); expect(names).toContain('activefiresmyloc'); expect(names).toContain('activefiresunionmyloc'); }); test('does not get stuck on "Actualizando…"', async ({ page }) => { await page.goto('/fires'); await waitForMap(page); await page.waitForTimeout(5000); await expect(page.getByText('Actualizando...', { exact: false })).toHaveCount(0); }); });