workspace-v1/shared/knowledge-base/reference/erp-inmobiliaria-legacy/gamilit/frontend/e2e/auth.spec.ts
rckrdmrd 66161b1566 feat: Workspace-v1 complete migration with NEXUS v3.4
Sistema NEXUS v3.4 migrado con:

Estructura principal:
- core/orchestration: Sistema SIMCO + CAPVED (27 directivas, 28 perfiles)
- core/catalog: Catalogo de funcionalidades reutilizables
- shared/knowledge-base: Base de conocimiento compartida
- devtools/scripts: Herramientas de desarrollo
- control-plane/registries: Control de servicios y CI/CD
- orchestration/: Configuracion de orquestacion de agentes

Proyectos incluidos (11):
- gamilit (submodule -> GitHub)
- trading-platform (OrbiquanTIA)
- erp-suite con 5 verticales:
  - erp-core, construccion, vidrio-templado
  - mecanicas-diesel, retail, clinicas
- betting-analytics
- inmobiliaria-analytics
- platform_marketing_content
- pos-micro, erp-basico

Configuracion:
- .gitignore completo para Node.js/Python/Docker
- gamilit como submodule (git@github.com:rckrdmrd/gamilit-workspace.git)
- Sistema de puertos estandarizado (3005-3199)

Generated with NEXUS v3.4 Migration System
EPIC-010: Configuracion Git y Repositorios
2026-01-04 03:37:42 -06:00

163 lines
5.6 KiB
TypeScript

import { test, expect } from '@playwright/test';
/**
* Authentication E2E Tests
*
* Critical user flow: Login → Dashboard
*/
test.describe('Authentication Flow', () => {
test.beforeEach(async ({ page }) => {
// Navigate to the app
await page.goto('/');
});
test('should display login page', async ({ page }) => {
// Check that login form is visible
await expect(page.locator('form')).toBeVisible();
await expect(page.getByRole('heading', { name: /iniciar sesión|login/i })).toBeVisible();
// Check for email and password fields
await expect(page.getByLabel(/email|correo/i)).toBeVisible();
await expect(page.getByLabel(/contraseña|password/i)).toBeVisible();
// Check for submit button
await expect(page.getByRole('button', { name: /iniciar sesión|login/i })).toBeVisible();
});
test('should show validation errors with empty form', async ({ page }) => {
// Click login button without filling form
await page.getByRole('button', { name: /iniciar sesión|login/i }).click();
// Should show validation errors
await expect(page.locator('text=/requerido|required|obligatorio/i')).toBeVisible();
});
test('should show error with invalid credentials', async ({ page }) => {
// Fill form with invalid credentials
await page.getByLabel(/email|correo/i).fill('invalid@example.com');
await page.getByLabel(/contraseña|password/i).fill('wrongpassword');
// Submit form
await page.getByRole('button', { name: /iniciar sesión|login/i }).click();
// Should show error message
// Wait for error message (may take a few seconds for API response)
await expect(
page.locator('text=/credenciales inválidas|invalid credentials|error/i')
).toBeVisible({ timeout: 5000 });
});
test('should navigate to registration page', async ({ page }) => {
// Click on register link
await page.getByRole('link', { name: /registrarse|register|crear cuenta/i }).click();
// Should be on registration page
await expect(page).toHaveURL(/\/register/);
await expect(page.getByRole('heading', { name: /registrar|register/i })).toBeVisible();
});
test.skip('should successfully login with valid credentials', async ({ page }) => {
// NOTE: This test requires a test user in the database
// Skip for now until test data setup is ready
const testEmail = 'test@example.com';
const testPassword = 'Test123!';
// Fill login form
await page.getByLabel(/email|correo/i).fill(testEmail);
await page.getByLabel(/contraseña|password/i).fill(testPassword);
// Submit form
await page.getByRole('button', { name: /iniciar sesión|login/i }).click();
// Should redirect to dashboard after successful login
await expect(page).toHaveURL(/\/dashboard/, { timeout: 10000 });
// Should display user-specific content
await expect(page.locator('text=/bienvenido|welcome/i')).toBeVisible();
});
test('should have password visibility toggle', async ({ page }) => {
const passwordInput = page.getByLabel(/contraseña|password/i);
// Password should be hidden by default
await expect(passwordInput).toHaveAttribute('type', 'password');
// Click toggle button (usually an eye icon)
const toggleButton = page.locator('button[type="button"]').filter({
has: page.locator('svg'), // Icon button
}).first();
if (await toggleButton.isVisible()) {
await toggleButton.click();
// Password should now be visible
await expect(passwordInput).toHaveAttribute('type', 'text');
}
});
});
test.describe('Registration Flow', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/register');
});
test('should display registration form', async ({ page }) => {
await expect(page.getByRole('heading', { name: /registrar|register/i })).toBeVisible();
// Check for required registration fields
await expect(page.getByLabel(/nombre|name|first name/i)).toBeVisible();
await expect(page.getByLabel(/email|correo/i)).toBeVisible();
await expect(page.getByLabel(/contraseña|password/i)).toBeVisible();
});
test('should validate password strength', async ({ page }) => {
const passwordInput = page.getByLabel(/contraseña|password/i).first();
// Type weak password
await passwordInput.fill('123');
// Should show password strength indicator or validation message
// This depends on your implementation
await expect(
page.locator('text=/débil|weak|contraseña debe|password must/i')
).toBeVisible({ timeout: 3000 });
});
test('should validate email format', async ({ page }) => {
const emailInput = page.getByLabel(/email|correo/i);
// Type invalid email
await emailInput.fill('invalid-email');
await emailInput.blur(); // Trigger validation
// Should show validation error
await expect(
page.locator('text=/email inválido|invalid email|formato/i')
).toBeVisible({ timeout: 3000 });
});
});
test.describe('Session Management', () => {
test('should handle session timeout', async ({ page }) => {
await page.goto('/');
// This test would need to:
// 1. Login
// 2. Wait for session to expire (or manipulate token)
// 3. Try to access protected route
// 4. Verify redirect to login
// Skipping for now as it requires complex setup
test.skip();
});
test('should persist session across page reloads', async ({ page }) => {
// This test would verify that after login,
// refreshing the page keeps the user logged in
test.skip();
});
});