michangarrito/apps/frontend/e2e/navigation.spec.ts
rckrdmrd 928eb795e6 [SIMCO-V38] feat: Actualizar a SIMCO v3.8.0 + cambios apps
- HERENCIA-SIMCO.md actualizado con directivas v3.7 y v3.8
- Cambios en backend y frontend

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 08:53:05 -06:00

121 lines
3.6 KiB
TypeScript

import { test, expect } from '@playwright/test';
/**
* E2E Tests - Navegacion
* MiChangarrito Frontend
*
* Nota: Estos tests requieren autenticacion
* Se usan con un usuario de prueba pre-configurado
*/
test.describe('Navegacion Publica', () => {
test('debe cargar la aplicacion', async ({ page }) => {
await page.goto('/');
// Al no estar autenticado, debe redirigir a login
await expect(page).toHaveURL('/login');
});
test('rutas invalidas redirigen a login', async ({ page }) => {
await page.goto('/ruta-que-no-existe');
await expect(page).toHaveURL('/login');
});
test('login page tiene titulo correcto', async ({ page }) => {
await page.goto('/login');
await expect(page).toHaveTitle(/MiChangarrito/i);
});
});
test.describe('UI Responsiva', () => {
test('login se adapta a mobile', async ({ page }) => {
// Viewport mobile
await page.setViewportSize({ width: 375, height: 667 });
await page.goto('/login');
// El formulario debe ser visible y usable
await expect(page.locator('form')).toBeVisible();
await expect(page.locator('input[name="phone"]')).toBeVisible();
await expect(page.locator('input[name="pin"]')).toBeVisible();
await expect(page.locator('button[type="submit"]')).toBeVisible();
});
test('login se adapta a tablet', async ({ page }) => {
// Viewport tablet
await page.setViewportSize({ width: 768, height: 1024 });
await page.goto('/login');
await expect(page.locator('form')).toBeVisible();
});
test('login se adapta a desktop', async ({ page }) => {
// Viewport desktop
await page.setViewportSize({ width: 1920, height: 1080 });
await page.goto('/login');
await expect(page.locator('form')).toBeVisible();
});
});
test.describe('Accesibilidad', () => {
test('campos tienen labels', async ({ page }) => {
await page.goto('/login');
// Verificar que los inputs tienen labels asociados
const phoneLabel = page.locator('label[for="phone"]');
const pinLabel = page.locator('label[for="pin"]');
await expect(phoneLabel).toBeVisible();
await expect(pinLabel).toBeVisible();
});
test('formulario es navegable con teclado', async ({ page }) => {
await page.goto('/login');
// Tab al primer campo
await page.keyboard.press('Tab');
const phoneInput = page.locator('input[name="phone"]');
await expect(phoneInput).toBeFocused();
// Tab al segundo campo
await page.keyboard.press('Tab');
const pinInput = page.locator('input[name="pin"]');
await expect(pinInput).toBeFocused();
// Tab al boton
await page.keyboard.press('Tab');
const submitButton = page.locator('button[type="submit"]');
await expect(submitButton).toBeFocused();
});
test('formulario puede enviarse con Enter', async ({ page }) => {
await page.goto('/login');
// Llenar campos
await page.locator('input[name="phone"]').fill('5512345678');
await page.locator('input[name="pin"]').fill('1234');
// Enviar con Enter
await page.keyboard.press('Enter');
// El formulario debe intentar enviarse (el boton estara en estado loading)
const submitButton = page.locator('button[type="submit"]');
// Puede estar disabled durante el envio o ya haber terminado
await page.waitForTimeout(500);
});
});
test.describe('Performance', () => {
test('login carga en menos de 3 segundos', async ({ page }) => {
const startTime = Date.now();
await page.goto('/login');
await expect(page.locator('h1')).toBeVisible();
const loadTime = Date.now() - startTime;
expect(loadTime).toBeLessThan(3000);
});
});