You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
senzapaura_es/e2e/panel.e2e.ts

77 lines
2.9 KiB

El panel se va a su propio dominio y su propio proceso Estaba mal hecho y el síntoma era el `if` sobre `/admin` que acabó metido en el layout de la web pública: la web sabiendo que existe el panel, al revés de como debe ser. Ahora son dos aplicaciones del mismo repositorio. Lo que las separa son tres líneas de `vite.config.ts`: con `APP=panel`, las rutas salen de `src/panel/rutas`, los hooks de `src/panel/hooks.server.ts` y el resultado va a `build-panel/`. El servidor público se compila sin las rutas del panel, así que en `senzapaura.es` no es que `/admin` esté protegido: no existe, y hay una prueba que lo comprueba pidiéndolo. Comparten `src/lib` —esquema, consultas, acceso—, que es lo que evita mantener las migraciones por duplicado. Para que eso funcione, dos cosas que resolvían rutas del sitio salen de en medio: la navegación, a `$lib/navegacion`, y los tipos ambientales, que ahora son dos porque el `PageData` del sitio lleva carrito y favoritos y el del panel no. El precio de otro dominio es que el panel necesita su propia página de entrar: la cookie se emite para el host y no para el dominio padre, que es justo lo que hace que la sesión del panel no viaje en las peticiones de la web. Usa el mismo código de `$lib/server/auth`, con una diferencia: solo manda código a una cuenta que ya administre, y contesta lo mismo exista o no. Si dijera «esa cuenta no administra», el formulario sería una forma cómoda de averiguar cuál sí. Y con dominio propio, el 404 de ayer pasa a ser un 403 con el motivo escrito: esconder el panel de quien ya está en `admin.senzapaura.es` no engaña a nadie, y a esa rama solo llega alguien que administraba y ha dejado de administrar. Dos servidores en las pruebas, uno por proyecto, con su `baseURL`: una prueba del panel no puede pedir por accidente una página del sitio. Aparte, la prueba de contacto otra vez. El arreglo de ayer no valía —comprobar que el texto está escrito no impide que lo borren un instante después—, así que el layout marca con `data-hidratado` el momento en que Svelte toma el control y la prueba espera a eso. Quince pasadas con cuatro trabajadores, sin un fallo. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
4 weeks ago
import { expect, test } from '@playwright/test';
/*
* El panel, desde fuera.
*
* Corre contra su propio servidor —el proyecto «panel» de la configuración—,
* que es otra aplicación compilada aparte. Aquí solo se comprueba la puerta:
* quién puede pasar una vez dentro lo deciden `esAdmin` y `exigirAdmin`, y eso
* se prueba en `administracion.spec.ts`, donde se pueden montar las tres
* situaciones sin necesitar un buzón de correo.
*/
test.describe('El panel', () => {
for (const accept of ['application/json', 'text/html']) {
test(`un POST anónimo no ejecuta acciones con ${accept}`, async ({ request, baseURL }) => {
const respuesta = await request.post('/artistas?/crear', {
headers: { origin: baseURL!, accept },
form: { nombre: '', slug: '' },
maxRedirects: 0
});
if (accept === 'application/json') {
// SvelteKit representa la redirección de una acción mejorada en JSON.
expect(respuesta.status()).toBe(200);
expect(await respuesta.json()).toMatchObject({
type: 'redirect',
status: 303,
location: expect.stringMatching(/^\/entrar/)
});
} else {
expect(respuesta.status()).toBe(303);
expect(respuesta.headers().location).toMatch(/^\/entrar/);
}
expect(await respuesta.text()).not.toContain('Escribe un nombre');
});
}
El panel se va a su propio dominio y su propio proceso Estaba mal hecho y el síntoma era el `if` sobre `/admin` que acabó metido en el layout de la web pública: la web sabiendo que existe el panel, al revés de como debe ser. Ahora son dos aplicaciones del mismo repositorio. Lo que las separa son tres líneas de `vite.config.ts`: con `APP=panel`, las rutas salen de `src/panel/rutas`, los hooks de `src/panel/hooks.server.ts` y el resultado va a `build-panel/`. El servidor público se compila sin las rutas del panel, así que en `senzapaura.es` no es que `/admin` esté protegido: no existe, y hay una prueba que lo comprueba pidiéndolo. Comparten `src/lib` —esquema, consultas, acceso—, que es lo que evita mantener las migraciones por duplicado. Para que eso funcione, dos cosas que resolvían rutas del sitio salen de en medio: la navegación, a `$lib/navegacion`, y los tipos ambientales, que ahora son dos porque el `PageData` del sitio lleva carrito y favoritos y el del panel no. El precio de otro dominio es que el panel necesita su propia página de entrar: la cookie se emite para el host y no para el dominio padre, que es justo lo que hace que la sesión del panel no viaje en las peticiones de la web. Usa el mismo código de `$lib/server/auth`, con una diferencia: solo manda código a una cuenta que ya administre, y contesta lo mismo exista o no. Si dijera «esa cuenta no administra», el formulario sería una forma cómoda de averiguar cuál sí. Y con dominio propio, el 404 de ayer pasa a ser un 403 con el motivo escrito: esconder el panel de quien ya está en `admin.senzapaura.es` no engaña a nadie, y a esa rama solo llega alguien que administraba y ha dejado de administrar. Dos servidores en las pruebas, uno por proyecto, con su `baseURL`: una prueba del panel no puede pedir por accidente una página del sitio. Aparte, la prueba de contacto otra vez. El arreglo de ayer no valía —comprobar que el texto está escrito no impide que lo borren un instante después—, así que el layout marca con `data-hidratado` el momento en que Svelte toma el control y la prueba espera a eso. Quince pasadas con cuatro trabajadores, sin un fallo. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
4 weeks ago
test('sin sesión no se ve, se manda a entrar', async ({ page }) => {
await page.goto('/');
await expect(page).toHaveURL(/\/entrar/);
await expect(page.getByRole('heading', { name: 'Panel' })).toBeVisible();
await expect(page.getByLabel('Correo')).toBeVisible();
});
test('y se vuelve a donde se iba, no a la portada', async ({ page }) => {
await page.goto('/?ver=pendientes');
const url = new URL(page.url());
expect(url.pathname).toBe('/entrar');
expect(url.searchParams.get('volverA')).toBe('/?ver=pendientes');
});
test('no dice qué cuenta administra', async ({ page }) => {
// La respuesta es la misma exista o no la cuenta. Si dijera «esa cuenta no
// administra», el formulario sería una forma cómoda de averiguar cuál sí.
await page.goto('/entrar');
await page.getByLabel('Correo').fill('nadie-de-aqui@example.com');
await page.getByRole('button', { name: 'Mandar el código' }).click();
await expect(page.getByText(/si esa cuenta administra/i)).toBeVisible();
await expect(page.getByLabel('Código')).toBeVisible();
});
test('nada de aquí se indexa', async ({ request }) => {
const robots = await request.get('/robots.txt');
expect(await robots.text()).toContain('Disallow: /');
});
test('no lleva la navegación del sitio', async ({ page }) => {
// Es una herramienta, no una página de la web: sin cabecera de secciones,
// sin reproductor y sin pie.
await page.goto('/entrar');
await expect(page.getByRole('navigation', { name: 'Principal' })).toHaveCount(0);
await expect(page.getByRole('region', { name: 'Reproductor' })).toHaveCount(0);
await expect(page.locator('footer')).toHaveCount(0);
});
});

Powered by TurnKey Linux.