todos-contra-el-fuego-web/e2e/tests/fires-map.spec.js
vjrj 1153556f47
All checks were successful
build-image / test (push) Successful in 3m17s
build-image / build (push) Successful in 13m23s
revert(maps): deshacer el arreglo del mapa gris — empeoraba staging
Desplegado en staging, el "montar el control de capas una sola vez" resultó
peor que el bug que arreglaba: /fires seguía en gris Y además la portada y
/zones —que sí pintaban— se quedaron también sin teselas. Con la clave real, el
control acaba montándose después de que el mapa ya esté montado, y entonces no
se le añade ninguna capa base. O sea que la carrera no se arregla retrasando el
montaje: solo cambia de sitio.

Staging revertido a la imagen anterior y comprobado que vuelve a estar como
estaba (portada 36 teselas, /zones 18, /fires 0).

Se conserva todo lo aprendido, que es lo que vale: el bug se reproduce en local
poniendo una clave de Google en settings-ci.json (15 teselas sin clave, 0 con
ella), NO es cosa del navegador sin pantalla, y e2e/tests/fires-map.spec.js lo
deja como test.fixme para que aparezca en cada ejecución. El arreglo bueno pasa
por decidir el conjunto de capas base ANTES de montar el mapa.
2026-08-02 00:27:58 +02:00

70 lines
3.4 KiB
JavaScript

import { test, expect } from '@playwright/test';
import { waitForMap } from '../support/app.js';
// ⛔ BUG ABIERTO: el mapa de /fires se queda EN GRIS cuando hay clave de Google
// Maps configurada — ni teselas, ni fuegos, ni suscripción por viewport, con el
// "Actualizando…" eterno. Es lo que se ve en staging.
//
// Lo que SÍ está establecido (2026-08-01):
//
// 1. NO es el navegador sin pantalla. El mismo Playwright headless pinta la
// portada y /zones de staging, y pinta /fires perfectamente contra un
// servidor local sin clave. La nota del plan que lo achacaba a eso es falsa.
// 2. Depende de la clave de Google. Basta con poner una clave (aunque sea
// falsa) en settings-ci.json para reproducirlo en local: 15 teselas sin
// clave, 0 con ella. Por eso settings-ci.json lleva una: para que esto se
// vea aquí y no solo en staging.
// 3. El control de capas se monta con dos capas base y, al resolverse la clave,
// se le añaden tres de Google. En esa segunda pasada react-leaflet se deja
// por el camino la capa base marcada.
// 4. Montar el control UNA sola vez, esperando a la clave, arregla el caso
// local pero ROMPE staging todavía más: allí la portada y /zones —que
// funcionaban— se quedan también sin teselas, porque entonces el control
// aparece después de que el mapa ya esté montado. Probado en staging,
// revertido: no basta con mover el momento del montaje.
//
// El arreglo bueno pasa por que el conjunto de capas base esté decidido ANTES de
// montar el mapa (resolver la clave más arriba, o que GoogleMutantLayer sepa no
// hacer nada sin clave).
//
// Quedan como test.fixme para que salgan como pendientes en cada ejecución en
// vez de desaparecer en una nota. Quitar el .fixme al arreglarlo.
test.describe('mapa de fuegos activos', () => {
test.fixme('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.fixme('offers every base layer and keeps the checked one', async ({ page }) => {
await page.goto('/fires');
await waitForMap(page);
const layers = page.locator('.leaflet-control-layers-base input');
expect(await layers.count()).toBeGreaterThanOrEqual(2);
// Exactamente una marcada, y el mapa con teselas: si la marcada se hubiera
// perdido, seguiría marcada en el control pero no habría teselas.
const checked = await page.locator('.leaflet-control-layers-base input:checked').count();
expect(checked).toEqual(1);
expect(await page.locator('.leaflet-tile').count()).toBeGreaterThan(0);
});
test.fixme('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.fixme('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);
});
});