- 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>
121 lines
3.6 KiB
TypeScript
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);
|
|
});
|
|
});
|