Causa raíz, encontrada reproduciéndolo con el bundle de producción en local
—con el servidor de desarrollo NO se ve, y por eso llevaba semanas dándose por
un artefacto del navegador sin pantalla:
if ((centerStored !== [0, 0] || geolocation.get()) && geoInit) {
center.set(centerStored || geolocation.get());
geoInit = false;
}
`centerStored !== [0, 0]` compara contra un array recién creado: es SIEMPRE
cierto. En un navegador nuevo —sin centro en localStorage y con la
geolocalización todavía sin resolver— eso hacía `center.set(undefined)` y dejaba
`geoInit` en false, o sea para siempre. Un `<MapContainer>` 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 creaba la suscripción por
viewport. En desarrollo no pasaba porque la geolocalización llegaba a tiempo.
Y de paso el "Actualizando…" que no se quitaba nunca: las suscripciones se
creaban dentro de un `Tracker.autorun` ANIDADO en el withTracker. La computación
de fuera no dependía de `mapSize`, así que `loading` se calculaba con
`subscription` a undefined y no volvía a recalcularse; además cada pasada del
withTracker dejaba otro autorun sin parar. Ahora las suscripciones se crean en
la propia computación reactiva, que es donde Meteor sabe pararlas al invalidarse.
MapReady, además, vigila el contenedor con un ResizeObserver: su comprobación de
tamaño solo podía reintentar con el evento `resize` de Leaflet, que no se emite
si nadie llama a invalidateSize(). No era la causa de esto, pero hacía que la
comprobación no sirviera de nada.
La suite e2e deja de usar selectores por id: TestUtils.testId() los devuelve solo
en desarrollo, así que contra el bundle de producción —lo que levanta el job
nocturno— no existían y la suite entera habría fallado esta noche.
Verificado contra bundle de producción: /fires pasa de 0 teselas y 0 capas a 12
teselas, capa base y las dos suscripciones por viewport, sin "Actualizando…".
90 tests de servidor, 16 e2e y smoke REST byte-idéntico.
54 lines
2.3 KiB
JavaScript
54 lines
2.3 KiB
JavaScript
import { test, expect } from '@playwright/test';
|
|
import { signUp, NAV } from '../support/app.js';
|
|
|
|
// Through the navbar, not page.goto('/profile'): a cold load of that URL bounces
|
|
// to /subscriptions (the Authenticated wrapper decides before Meteor has resumed
|
|
// the login token). Worth its own fix, but it is not what this spec is about.
|
|
const openProfile = async (page) => {
|
|
await page.locator(NAV.perfil).click();
|
|
await page.waitForURL('**/profile', { timeout: 30000 });
|
|
};
|
|
|
|
const chooseLanguage = async (page, name) => {
|
|
await page.locator('.lang-selector').first().click();
|
|
await page.getByRole('button', { name }).click();
|
|
};
|
|
|
|
// The site is bilingual (es/en) and the language belongs to the account, not to
|
|
// the browser session: notifications and emails go out in it too.
|
|
test.describe('cambio de idioma', () => {
|
|
test('the interface follows the language chosen in the profile', async ({ page }) => {
|
|
await signUp(page);
|
|
await expect(page.locator(NAV.zonas)).toHaveText('Zonas vigiladas');
|
|
|
|
await openProfile(page);
|
|
await chooseLanguage(page, 'English');
|
|
|
|
await expect(page.locator(NAV.zonas)).toHaveText('Monitored areas', { timeout: 30000 });
|
|
});
|
|
|
|
test('going back to Spanish works too', async ({ page }) => {
|
|
await signUp(page);
|
|
await openProfile(page);
|
|
await chooseLanguage(page, 'English');
|
|
await expect(page.locator(NAV.zonas)).toHaveText('Monitored areas', { timeout: 30000 });
|
|
|
|
await chooseLanguage(page, 'Español');
|
|
await expect(page.locator(NAV.zonas)).toHaveText('Zonas vigiladas', { timeout: 30000 });
|
|
});
|
|
|
|
// KNOWN BUG, kept as a failing-by-design test instead of being quietly dropped:
|
|
// users.setLang does store the choice on the account, and Login.js applies it
|
|
// when you log in — but a plain reload of an already-logged-in session falls
|
|
// back to the browser's locale. Someone who picked English sees Spanish again
|
|
// on the next page load.
|
|
test.fixme('the chosen language survives a reload', async ({ page }) => {
|
|
await signUp(page);
|
|
await openProfile(page);
|
|
await chooseLanguage(page, 'English');
|
|
await expect(page.locator(NAV.zonas)).toHaveText('Monitored areas', { timeout: 30000 });
|
|
|
|
await page.reload();
|
|
await expect(page.locator(NAV.zonas)).toHaveText('Monitored areas', { timeout: 30000 });
|
|
});
|
|
});
|