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.
70 lines
3.4 KiB
JavaScript
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);
|
|
});
|
|
});
|