import { test, expect } from '@playwright/test'; import { TEST_ORDER, TEST_CUSTOMER, ROUTES } from './fixtures/test-data'; /** * E2E Tests - Pedidos y Fiado * MiChangarrito Frontend * * Nota: Estos tests requieren autenticacion previa * y un backend corriendo con datos de prueba */ test.describe('Pedidos - Sin Autenticacion', () => { test('redirige a login si no esta autenticado', async ({ page }) => { await page.goto(ROUTES.orders); await expect(page).toHaveURL('/login'); }); test('fiado redirige a login sin autenticacion', async ({ page }) => { await page.goto(ROUTES.fiado); await expect(page).toHaveURL('/login'); }); test('clientes redirige a login sin autenticacion', async ({ page }) => { await page.goto(ROUTES.customers); await expect(page).toHaveURL('/login'); }); }); test.describe('Pedidos - Estructura de Datos', () => { test('datos de pedido de prueba tienen estructura correcta', () => { expect(TEST_ORDER.items).toBeInstanceOf(Array); expect(TEST_ORDER.items.length).toBeGreaterThan(0); expect(TEST_ORDER.total).toBeGreaterThan(0); expect(TEST_ORDER.paymentMethod).toBeDefined(); // Verificar estructura de items const item = TEST_ORDER.items[0]; expect(item.productId).toBeDefined(); expect(item.quantity).toBeGreaterThan(0); expect(item.price).toBeGreaterThan(0); }); test('datos de cliente de prueba tienen estructura correcta', () => { expect(TEST_CUSTOMER.name).toBeDefined(); expect(TEST_CUSTOMER.phone).toBeDefined(); expect(TEST_CUSTOMER.phone.length).toBe(10); expect(TEST_CUSTOMER.creditLimit).toBeGreaterThanOrEqual(0); }); test('total del pedido es correcto', () => { // Verificar calculo: 2 * 18.00 + 1 * 25.00 = 61.00 const calculatedTotal = TEST_ORDER.items.reduce( (sum, item) => sum + item.quantity * item.price, 0 ); expect(calculatedTotal).toBe(TEST_ORDER.total); }); }); test.describe('Sistema de Fiado', () => { test('rutas de fiado protegidas', async ({ page }) => { const fiadoRoutes = [ '/fiado', '/customers', ]; for (const route of fiadoRoutes) { await page.goto(route); await expect(page).toHaveURL('/login'); } }); }); test.describe('Historial de Pedidos', () => { test('ruta de pedidos protegida', async ({ page }) => { await page.goto('/orders'); await expect(page).toHaveURL('/login'); }); test('ruta de dashboard protegida', async ({ page }) => { await page.goto(ROUTES.dashboard); await expect(page).toHaveURL('/login'); }); }); test.describe('Clientes', () => { test('ruta de clientes protegida', async ({ page }) => { await page.goto('/customers'); await expect(page).toHaveURL('/login'); }); test('validacion de limite de credito', () => { // El limite de credito debe ser un numero positivo o cero expect(TEST_CUSTOMER.creditLimit).toBeGreaterThanOrEqual(0); expect(typeof TEST_CUSTOMER.creditLimit).toBe('number'); }); }); test.describe('Metodos de Pago', () => { test('metodo de pago valido', () => { const validPaymentMethods = ['cash', 'card', 'transfer', 'fiado']; expect(validPaymentMethods).toContain(TEST_ORDER.paymentMethod); }); }); test.describe('Configuracion', () => { test('ruta de configuracion protegida', async ({ page }) => { await page.goto(ROUTES.settings); await expect(page).toHaveURL('/login'); }); }); test.describe('Rutas Completas', () => { test('todas las rutas definidas en fixtures existen', () => { const expectedRoutes = [ 'login', 'register', 'dashboard', 'products', 'orders', 'customers', 'fiado', 'inventory', 'settings', ]; for (const route of expectedRoutes) { expect(ROUTES[route as keyof typeof ROUTES]).toBeDefined(); expect(ROUTES[route as keyof typeof ROUTES]).toMatch(/^\//); } }); test('todas las rutas protegidas redirigen a login', async ({ page }) => { const protectedRoutes = [ ROUTES.dashboard, ROUTES.products, ROUTES.orders, ROUTES.customers, ROUTES.fiado, ROUTES.inventory, ROUTES.settings, ]; for (const route of protectedRoutes) { await page.goto(route); await expect(page).toHaveURL('/login'); } }); });