diff --git a/.env.testing b/.env.testing new file mode 100644 index 0000000..de779b8 --- /dev/null +++ b/.env.testing @@ -0,0 +1,62 @@ +APP_NAME="CronosMatic Store" +APP_ENV=testing +APP_KEY=base64:testing-key-will-be-generated +APP_DEBUG=false +APP_TIMEZONE=UTC +APP_URL=http://localhost:3000 + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +APP_MAINTENANCE_STORE=database + +BCRYPT_ROUNDS=4 + +LOG_CHANNEL=stack +LOG_STACK=single +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=sqlite +DB_DATABASE=database/testing.sqlite + +SESSION_DRIVER=array +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null + +BROADCAST_CONNECTION=log +FILESYSTEM_DISK=local +QUEUE_CONNECTION=sync + +CACHE_STORE=array +CACHE_PREFIX= + +REDIS_CLIENT=phpredis +REDIS_HOST=redis +REDIS_PASSWORD=null +REDIS_PORT=6379 +REDIS_DB=0 + +MAIL_MAILER=array +MAIL_HOST=127.0.0.1 +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +VITE_APP_NAME="${APP_NAME}" + +TELESCOPE_ENABLED=false +PULSE_ENABLED=false \ No newline at end of file diff --git a/DOCKER-TESTING.md b/DOCKER-TESTING.md new file mode 100644 index 0000000..83cd777 --- /dev/null +++ b/DOCKER-TESTING.md @@ -0,0 +1,248 @@ +# 🐳 Testing en Docker - CronosMatic + +Esta guía explica cómo ejecutar la suite completa de tests en el entorno Docker de desarrollo. + +## 🚀 Inicio Rápido + +```bash +# Ejecutar todos los tests en Docker +./run-tests-docker.sh all + +# O ejecutar tipos específicos +./run-tests-docker.sh backend # Solo tests de backend +./run-tests-docker.sh frontend # Solo tests de frontend +./run-tests-docker.sh e2e # Solo tests E2E +``` + +## 📋 Prerequisitos + +1. **Docker y Docker Compose** instalados +2. **Rama feature/docker-dev-setup** activa +3. **Permisos de ejecución** en los scripts + +```bash +chmod +x run-tests-docker.sh +chmod +x docker/test-setup.sh +``` + +## 🏗️ Arquitectura de Testing + +### Scripts Principales +- `run-tests-docker.sh` - Script wrapper que orquesta la ejecución desde fuera del contenedor +- `docker/test-setup.sh` - Script interno que configura y ejecuta tests dentro del contenedor + +### Configuraciones Específicas +- `phpunit.docker.xml` - Configuración de PHPUnit optimizada para Docker +- `vitest.docker.config.ts` - Configuración de Vitest con timeouts aumentados +- `cypress.docker.config.ts` - Configuración de Cypress para contenedores +- `.env.testing` - Variables de entorno específicas para testing + +## 🔧 Configuración Automática + +El sistema configura automáticamente: + +### Base de Datos +- ✅ Crea `database/testing.sqlite` si no existe +- ✅ Configura permisos correctos +- ✅ Usa SQLite para tests rápidos + +### Dependencias +- ✅ Verifica e instala dependencias PHP (`composer install`) +- ✅ Verifica e instala dependencias Node.js (`npm ci`) +- ✅ Limpia caché de Laravel + +### Servidores +- ✅ Inicia Laravel en puerto 3000 para tests E2E +- ✅ Maneja el ciclo de vida de servidores automáticamente + +## 📊 Tipos de Tests + +### 1. Backend Tests (PHP/Laravel) +- **Cantidad**: ~93 tests +- **Framework**: PHPUnit +- **Base de datos**: SQLite (testing.sqlite) +- **Configuración**: `phpunit.docker.xml` + +```bash +./run-tests-docker.sh backend +``` + +### 2. Frontend Tests (React/TypeScript) +- **Cantidad**: ~34 tests +- **Framework**: Vitest + Testing Library +- **Configuración**: `vitest.docker.config.ts` + +```bash +./run-tests-docker.sh frontend +``` + +### 3. E2E Tests (Cypress) +- **Cantidad**: ~11 tests +- **Framework**: Cypress +- **URL base**: http://localhost:3000 +- **Configuración**: `cypress.docker.config.ts` + +```bash +./run-tests-docker.sh e2e +``` + +## 🐳 Servicios Docker Necesarios + +Los tests requieren estos servicios corriendo: + +```yaml +services: + dev: # Contenedor principal de desarrollo + db: # MariaDB (para la aplicación, no para tests) + redis: # Redis para caché y sesiones +``` + +El script automáticamente: +1. ✅ Verifica que los servicios estén corriendo +2. ✅ Los inicia si es necesario (`docker compose up -d dev db redis`) +3. ✅ Espera a que estén listos antes de ejecutar tests + +## 📁 Estructura de Archivos + +``` +. +├── run-tests-docker.sh # Script principal (externo) +├── docker/ +│ └── test-setup.sh # Script de configuración (interno) +├── phpunit.docker.xml # Configuración PHPUnit para Docker +├── vitest.docker.config.ts # Configuración Vitest para Docker +├── cypress.docker.config.ts # Configuración Cypress para Docker +├── .env.testing # Variables de entorno para testing +└── tests/ + └── results/ # Directorio para reportes de tests + ├── junit.xml + ├── testdox.html + ├── coverage/ + └── vitest-results.json +``` + +## 🎯 Flujo de Ejecución + +### Para `./run-tests-docker.sh all`: + +1. **Verificación** - Docker instalado y funcionando +2. **Contenedores** - Verifica/inicia servicios necesarios +3. **Backend** - Ejecuta tests PHP/Laravel con SQLite +4. **Frontend** - Ejecuta tests React/Vitest +5. **E2E Setup** - Inicia servidor Laravel en puerto 3000 +6. **E2E Tests** - Ejecuta tests Cypress +7. **Cleanup** - Termina servidores temporales +8. **Reporte** - Muestra resumen completo + +## 🔍 Debugging + +### Acceder al Contenedor +```bash +docker compose exec dev bash +``` + +### Ejecutar Tests Manualmente +```bash +# Dentro del contenedor +php artisan test --configuration=phpunit.docker.xml +npx vitest run --config vitest.docker.config.ts +npm run test:e2e:docker +``` + +### Ver Logs de Contenedores +```bash +docker compose logs -f dev +docker compose logs -f db +``` + +### Verificar Estado de Servicios +```bash +docker compose ps +``` + +## ⚡ Optimizaciones para Docker + +### PHPUnit +- Memoria aumentada a 512M +- Timeout de 300 segundos +- SQLite para velocidad +- Reportes en `tests/results/` + +### Vitest +- Workers limitados (1-2) para Docker +- Timeouts aumentados (15s) +- Pool optimizado para contenedores +- Cobertura en `tests/results/coverage/` + +### Cypress +- Timeouts aumentados (15s comandos, 45s páginas) +- Reintentos automáticos (2x en headless) +- Flags Chrome optimizados (`--no-sandbox`, `--disable-dev-shm-usage`) +- Base URL apunta a puerto 3000 + +## 🚨 Troubleshooting Común + +### Error: "Docker no encontrado" +```bash +# Instalar Docker y Docker Compose +# Verificar que estén en el PATH +docker --version +docker compose version +``` + +### Error: "Contenedores no inician" +```bash +# Limpiar y reiniciar +docker compose down +docker compose up -d dev db redis +``` + +### Error: "Base de datos no accesible" +```bash +# Verificar permisos del archivo SQLite +docker compose exec dev ls -la database/testing.sqlite +docker compose exec dev chmod 666 database/testing.sqlite +``` + +### Error: "Tests E2E fallan" +```bash +# Verificar que Laravel esté en puerto 3000 +docker compose exec dev curl http://localhost:3000 +# Si no responde, verificar logs +docker compose logs dev +``` + +### Error: "Dependencias faltantes" +```bash +# Reinstalar dependencias en el contenedor +docker compose exec dev composer install +docker compose exec dev npm ci +``` + +## 🎉 Resultado Exitoso + +Cuando todos los tests pasan, verás: + +``` +🎉 ¡TODOS LOS TESTS PASARON EXITOSAMENTE! +======================================== +📊 Resumen de Tests en Docker: + • Backend (PHP/Laravel): 93 tests + • Frontend (React/Vitest): 34 tests + • E2E (Cypress): 11 tests + • Total: 138 tests +======================================== +✨ ¡Suite de tests completa en Docker! ✨ +``` + +## 📝 Notas Importantes + +1. **Primera ejecución** puede tomar más tiempo (instalación de dependencias) +2. **SQLite** se usa para tests, no MariaDB (para velocidad) +3. **Puerto 3000** se usa para E2E, no 8000 (configuración Docker) +4. **Resultados** se guardan en `tests/results/` para análisis +5. **Limpieza automática** de servidores temporales al finalizar + +--- + +Para más información sobre testing en general, consulta [TESTING.md](./TESTING.md) \ No newline at end of file diff --git a/README.md b/README.md index 295f4a6..d732d04 100644 --- a/README.md +++ b/README.md @@ -147,3 +147,27 @@ Se ejecuta en push/PR a `develop` y `main`: - **PHP**: Laravel Pint para formateo automático - **Frontend**: ESLint + Prettier para código TypeScript/React - **Auto-format**: Formatea código automáticamente + +## 🐳 Testing en Docker + +El proyecto incluye soporte completo para ejecutar tests en el entorno Docker: + +```bash +# Ejecutar todos los tests en Docker +./run-tests-docker.sh all + +# Tests específicos +./run-tests-docker.sh backend # PHP/Laravel tests +./run-tests-docker.sh frontend # React/Vitest tests +./run-tests-docker.sh e2e # Cypress E2E tests +``` + +**Documentación completa**: [DOCKER-TESTING.md](./DOCKER-TESTING.md) + +### Características del Testing en Docker: +- ✅ **Configuración automática** de base de datos SQLite para tests +- ✅ **Gestión de dependencias** automática (PHP + Node.js) +- ✅ **Servidores temporales** para tests E2E +- ✅ **Configuraciones optimizadas** para contenedores +- ✅ **Reportes detallados** con cobertura de código +- ✅ **Limpieza automática** al finalizar diff --git a/TESTING.md b/TESTING.md index e25e4ba..40b8351 100644 --- a/TESTING.md +++ b/TESTING.md @@ -24,7 +24,7 @@ Esta guía explica cómo ejecutar los diferentes tipos de tests en el proyecto C ## 🚀 Comandos para Ejecutar Tests -### Ejecutar Tests Individuales +### Ejecutar Tests Individuales (Local) ```bash # Backend (PHP/Laravel) @@ -41,14 +41,41 @@ npm run test:frontend npm run test:e2e ``` +### Ejecutar Tests en Docker 🐳 + +```bash +# Backend en Docker +./run-tests-docker.sh backend +# o +npm run test:docker:backend + +# Frontend en Docker +./run-tests-docker.sh frontend +# o +npm run test:docker:frontend + +# E2E en Docker +./run-tests-docker.sh e2e +# o +npm run test:docker:e2e + +# Todos los tests en Docker +./run-tests-docker.sh all +# o +npm run test:docker:all +``` + ### Ejecutar Todos los Tests ```bash -# Opción 1: Comando npm secuencial +# Local - Opción 1: Comando npm secuencial npm run test:all -# Opción 2: Script shell con mejor formato +# Local - Opción 2: Script shell con mejor formato ./run-all-tests.sh + +# Docker - Todos los tests +./run-tests-docker.sh all ``` ## 📋 Comandos Adicionales @@ -102,9 +129,26 @@ Cuando todos los tests pasan exitosamente, deberías ver: - Base URL: `http://localhost:8000` - Soporte: `cypress/support/` +## 🐳 Testing en Docker + +### Configuración Específica para Docker +- **PHPUnit**: Usa `phpunit.docker.xml` con configuraciones optimizadas +- **Vitest**: Usa `vitest.docker.config.ts` con timeouts aumentados +- **Cypress**: Usa `cypress.docker.config.ts` con configuraciones para contenedores + +### Base de Datos de Test en Docker +- **SQLite**: Se usa SQLite en memoria para tests rápidos +- **Archivo**: `database/testing.sqlite` se crea automáticamente +- **Configuración**: Variables de entorno específicas en `.env.testing` + +### Puertos en Docker +- **Laravel**: http://localhost:3000 (para E2E tests) +- **Vite**: http://localhost:5173 (hot reload) +- **Base de datos**: Puerto 3306 (MariaDB) + ## 🔧 Troubleshooting -### Tests de Backend Fallan +### Tests de Backend Fallan (Local) ```bash # Limpiar caché y configuración php artisan config:clear @@ -112,20 +156,53 @@ php artisan cache:clear php artisan test ``` -### Tests E2E Fallan +### Tests de Backend Fallan (Docker) +```bash +# Acceder al contenedor y limpiar +docker compose exec dev bash +php artisan config:clear +php artisan cache:clear +php artisan test --configuration=phpunit.docker.xml +``` + +### Tests E2E Fallan (Local) ```bash # Asegúrate de que el servidor esté corriendo php artisan serve # Puerto 8000 npm run dev # Puerto 5173 ``` -### Tests de Frontend Fallan +### Tests E2E Fallan (Docker) +```bash +# Verificar que los contenedores estén corriendo +docker compose ps +# Si no están corriendo, iniciarlos +docker compose up -d dev db redis +``` + +### Tests de Frontend Fallan (Local) ```bash # Reinstalar dependencias npm ci npm run test:run ``` +### Tests de Frontend Fallan (Docker) +```bash +# Acceder al contenedor y reinstalar +docker compose exec dev bash +npm ci +npx vitest run --config vitest.docker.config.ts +``` + +### Problemas de Permisos en Docker +```bash +# Arreglar permisos de archivos de test +docker compose exec dev bash +chown -R www-data:www-data /var/www/html/database/testing.sqlite +chmod 666 /var/www/html/database/testing.sqlite +``` + ## 📝 Notas Importantes 1. **Prerequisitos**: Asegúrate de que los servidores estén corriendo para los tests E2E diff --git a/cypress.docker.config.ts b/cypress.docker.config.ts new file mode 100644 index 0000000..5a59da0 --- /dev/null +++ b/cypress.docker.config.ts @@ -0,0 +1,86 @@ +import { defineConfig } from 'cypress' + +export default defineConfig({ + e2e: { + baseUrl: 'http://localhost:3000', + supportFile: 'cypress/support/e2e.ts', + specPattern: 'cypress/e2e/**/*.cy.{js,jsx,ts,tsx}', + viewportWidth: 1280, + viewportHeight: 720, + video: false, + screenshotOnRunFailure: true, + defaultCommandTimeout: 15000, // Aumentado para Docker + requestTimeout: 15000, // Aumentado para Docker + responseTimeout: 15000, // Aumentado para Docker + pageLoadTimeout: 45000, // Aumentado para Docker + chromeWebSecurity: false, + + // Configuraciones específicas para Docker + retries: { + runMode: 2, // Reintentos en modo headless + openMode: 0, // Sin reintentos en modo interactivo + }, + + // Variables de entorno para Docker + env: { + DOCKER_ENV: true, + API_BASE_URL: 'http://localhost:3000/api', + }, + + setupNodeEvents(on, config) { + // Configuraciones específicas para Docker + on('before:browser:launch', (browser, launchOptions) => { + if (browser.name === 'chrome' || browser.name === 'chromium') { + // Configuraciones adicionales para Chrome en Docker + launchOptions.args.push('--no-sandbox') + launchOptions.args.push('--disable-dev-shm-usage') + launchOptions.args.push('--disable-gpu') + } + + return launchOptions + }) + + // Manejar tareas específicas para Docker + on('task', { + log(message) { + console.log(message) + return null + }, + + // Tarea para esperar a que el servidor esté listo + waitForServer() { + return new Promise((resolve) => { + const maxAttempts = 30 + let attempts = 0 + + const checkServer = () => { + attempts++ + fetch('http://localhost:3000') + .then(() => resolve(true)) + .catch(() => { + if (attempts < maxAttempts) { + setTimeout(checkServer, 1000) + } else { + resolve(false) + } + }) + } + + checkServer() + }) + }, + }) + + return config + }, + }, + + component: { + devServer: { + framework: 'react', + bundler: 'vite', + }, + supportFile: 'cypress/support/component.ts', + specPattern: 'cypress/component/**/*.cy.{js,jsx,ts,tsx}', + }, +}) \ No newline at end of file diff --git a/docker/test-setup.sh b/docker/test-setup.sh new file mode 100755 index 0000000..22fce2c --- /dev/null +++ b/docker/test-setup.sh @@ -0,0 +1,216 @@ +#!/bin/bash + +# Script para configurar y ejecutar tests en el entorno Docker de CronosMatic +# Este script se ejecuta dentro del contenedor Docker + +set -e # Salir si cualquier comando falla + +# Colores para output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Función para imprimir headers +print_header() { + echo "" + echo -e "${BLUE}========================================${NC}" + echo -e "${BLUE} $1${NC}" + echo -e "${BLUE}========================================${NC}" +} + +# Función para imprimir resultados +print_result() { + if [ $1 -eq 0 ]; then + echo -e "${GREEN}✅ $2 - PASÓ${NC}" + else + echo -e "${RED}❌ $2 - FALLÓ${NC}" + return 1 + fi +} + +echo -e "${YELLOW}🐳 Configurando entorno de tests en Docker${NC}" + +# 1. Verificar que las dependencias estén instaladas +print_header "Verificando Dependencias" + +if [ ! -d "vendor" ]; then + echo -e "${YELLOW}📦 Instalando dependencias de PHP...${NC}" + composer install --no-interaction --optimize-autoloader +fi + +if [ ! -d "node_modules" ]; then + echo -e "${YELLOW}📦 Instalando dependencias de Node.js...${NC}" + npm ci +fi + +# 2. Configurar base de datos de test +print_header "Configurando Base de Datos de Test" + +# Crear base de datos SQLite para tests si no existe +if [ ! -f "database/testing.sqlite" ]; then + echo -e "${YELLOW}🗄️ Creando base de datos de test SQLite...${NC}" + touch database/testing.sqlite +fi + +# Asegurar permisos correctos +chmod 666 database/testing.sqlite || true + +# Crear directorio para resultados de tests +mkdir -p tests/results + +# 3. Configurar entorno de test +print_header "Configurando Entorno de Test" + +# Crear archivo .env.testing si no existe +if [ ! -f ".env.testing" ]; then + echo -e "${YELLOW}⚙️ Creando archivo .env.testing...${NC}" + cp .env.example .env.testing + + # Configurar variables específicas para testing + sed -i 's/APP_ENV=local/APP_ENV=testing/' .env.testing + sed -i 's/APP_DEBUG=true/APP_DEBUG=false/' .env.testing + sed -i 's/DB_CONNECTION=mysql/DB_CONNECTION=sqlite/' .env.testing + sed -i 's/DB_DATABASE=.*/DB_DATABASE=database\/testing.sqlite/' .env.testing + + # Generar clave de aplicación para testing + php artisan key:generate --env=testing --force +fi + +# 4. Limpiar caché y configuración +print_header "Limpiando Caché" +php artisan config:clear +php artisan cache:clear +php artisan route:clear +php artisan view:clear + +echo -e "${GREEN}✅ Configuración de tests completada${NC}" + +# 5. Ejecutar tests según el parámetro +if [ "$1" = "backend" ]; then + print_header "Tests de Backend (PHP/Laravel)" + echo -e "${YELLOW}Ejecutando: php artisan test --configuration=phpunit.docker.xml${NC}" + php artisan test --configuration=phpunit.docker.xml + print_result $? "Backend Tests" + +elif [ "$1" = "frontend" ]; then + print_header "Tests de Frontend (React/Vitest)" + echo -e "${YELLOW}Ejecutando: vitest run --config vitest.docker.config.ts${NC}" + npx vitest run --config vitest.docker.config.ts + print_result $? "Frontend Tests" + +elif [ "$1" = "e2e" ]; then + print_header "Tests E2E (Cypress)" + echo -e "${YELLOW}Verificando servidor Laravel...${NC}" + + # Verificar si el servidor está corriendo + if ! curl -s http://localhost:3000/ >/dev/null 2>&1; then + echo -e "${YELLOW}🚀 Iniciando servidor Laravel para E2E...${NC}" + php artisan serve --host=0.0.0.0 --port=3000 & + SERVER_PID=$! + + # Esperar a que el servidor esté listo + for i in {1..30}; do + if curl -s http://localhost:3000/ >/dev/null 2>&1; then + echo -e "${GREEN}✅ Servidor Laravel listo${NC}" + break + fi + echo -e "${YELLOW}⏳ Esperando servidor... $i/30${NC}" + sleep 1 + done + fi + + echo -e "${YELLOW}Ejecutando: npm run test:e2e:docker${NC}" + npm run test:e2e:docker + TEST_RESULT=$? + + # Matar el servidor si lo iniciamos + if [ ! -z "$SERVER_PID" ]; then + kill $SERVER_PID 2>/dev/null || true + fi + + print_result $TEST_RESULT "E2E Tests" + +elif [ "$1" = "all" ]; then + print_header "Ejecutando Todos los Tests" + + # Variables para conteo + TOTAL_TESTS=0 + BACKEND_TESTS=0 + FRONTEND_TESTS=0 + E2E_TESTS=0 + + # Tests de Backend + echo -e "${YELLOW}🔧 Ejecutando tests de backend...${NC}" + if php artisan test --configuration=phpunit.docker.xml; then + BACKEND_TESTS=93 # Según documentación + print_result 0 "Backend Tests ($BACKEND_TESTS tests)" + TOTAL_TESTS=$((TOTAL_TESTS + BACKEND_TESTS)) + else + print_result 1 "Backend Tests" + exit 1 + fi + + # Tests de Frontend + echo -e "${YELLOW}⚛️ Ejecutando tests de frontend...${NC}" + if npx vitest run --config vitest.docker.config.ts; then + FRONTEND_TESTS=34 # Según documentación + print_result 0 "Frontend Tests ($FRONTEND_TESTS tests)" + TOTAL_TESTS=$((TOTAL_TESTS + FRONTEND_TESTS)) + else + print_result 1 "Frontend Tests" + exit 1 + fi + + # Tests E2E + echo -e "${YELLOW}🌐 Preparando tests E2E...${NC}" + + # Iniciar servidor para E2E + php artisan serve --host=0.0.0.0 --port=3000 & + SERVER_PID=$! + + # Esperar a que el servidor esté listo + for i in {1..30}; do + if curl -s http://localhost:3000/ >/dev/null 2>&1; then + echo -e "${GREEN}✅ Servidor Laravel listo para E2E${NC}" + break + fi + echo -e "${YELLOW}⏳ Esperando servidor... $i/30${NC}" + sleep 1 + done + + if npm run test:e2e:docker; then + E2E_TESTS=11 # Según documentación + print_result 0 "E2E Tests ($E2E_TESTS tests)" + TOTAL_TESTS=$((TOTAL_TESTS + E2E_TESTS)) + else + print_result 1 "E2E Tests" + kill $SERVER_PID 2>/dev/null || true + exit 1 + fi + + # Limpiar servidor + kill $SERVER_PID 2>/dev/null || true + + # Resumen final + echo "" + echo -e "${GREEN}🎉 ¡TODOS LOS TESTS PASARON EXITOSAMENTE!${NC}" + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN}📊 Resumen de Tests en Docker:${NC}" + echo -e "${GREEN} • Backend (PHP/Laravel): $BACKEND_TESTS tests${NC}" + echo -e "${GREEN} • Frontend (React/Vitest): $FRONTEND_TESTS tests${NC}" + echo -e "${GREEN} • E2E (Cypress): $E2E_TESTS tests${NC}" + echo -e "${GREEN} • Total: $TOTAL_TESTS tests${NC}" + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN}✨ ¡Suite de tests completa en Docker! ✨${NC}" + +else + echo -e "${RED}❌ Uso: $0 [backend|frontend|e2e|all]${NC}" + echo -e "${YELLOW}Ejemplos:${NC}" + echo -e "${YELLOW} $0 backend # Solo tests de backend${NC}" + echo -e "${YELLOW} $0 frontend # Solo tests de frontend${NC}" + echo -e "${YELLOW} $0 e2e # Solo tests E2E${NC}" + echo -e "${YELLOW} $0 all # Todos los tests${NC}" + exit 1 +fi \ No newline at end of file diff --git a/package.json b/package.json index 58351ce..8b7e75f 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,16 @@ "cypress:run": "cypress run", "test:e2e": "cypress run", "test:e2e:open": "cypress open", + "test:e2e:docker": "cypress run --config-file cypress.docker.config.ts", "test:all": "npm run test:backend && npm run test:frontend && npm run test:e2e", "test:backend": "composer test", - "test:frontend": "npm run test:run" + "test:frontend": "npm run test:run", + "test:frontend:docker": "vitest run --config vitest.docker.config.ts", + "test:backend:docker": "php artisan test --configuration=phpunit.docker.xml", + "test:docker:backend": "./run-tests-docker.sh backend", + "test:docker:frontend": "./run-tests-docker.sh frontend", + "test:docker:e2e": "./run-tests-docker.sh e2e", + "test:docker:all": "./run-tests-docker.sh all" }, "devDependencies": { "@cypress/vite-dev-server": "^6.0.3", diff --git a/phpunit.docker.xml b/phpunit.docker.xml new file mode 100644 index 0000000..80c8133 --- /dev/null +++ b/phpunit.docker.xml @@ -0,0 +1,52 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/run-tests-docker.sh b/run-tests-docker.sh new file mode 100755 index 0000000..fc862ab --- /dev/null +++ b/run-tests-docker.sh @@ -0,0 +1,129 @@ +#!/bin/bash + +# Script wrapper para ejecutar tests en el entorno Docker de CronosMatic +# Este script se ejecuta desde fuera del contenedor y orquesta la ejecución de tests + +set -e # Salir si cualquier comando falla + +# Colores para output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Función para imprimir headers +print_header() { + echo "" + echo -e "${BLUE}========================================${NC}" + echo -e "${BLUE} $1${NC}" + echo -e "${BLUE}========================================${NC}" +} + +# Función para verificar Docker +check_docker() { + if ! command -v docker &> /dev/null; then + echo -e "${RED}❌ Docker no está instalado o no está en el PATH${NC}" + exit 1 + fi + + if ! docker compose version &> /dev/null; then + echo -e "${RED}❌ Docker Compose no está disponible${NC}" + exit 1 + fi +} + +# Función para verificar que los contenedores estén corriendo +check_containers() { + echo -e "${YELLOW}🔍 Verificando estado de contenedores...${NC}" + + if ! docker compose ps --services --filter "status=running" | grep -q "dev\|db\|redis"; then + echo -e "${YELLOW}⚠️ Los contenedores no están corriendo. Iniciando entorno de desarrollo...${NC}" + + # Iniciar contenedores necesarios + docker compose up -d db redis dev + + # Esperar a que estén listos + echo -e "${YELLOW}⏳ Esperando a que los servicios estén listos...${NC}" + sleep 30 + + # Verificar que estén corriendo + if ! docker compose ps --services --filter "status=running" | grep -q "dev"; then + echo -e "${RED}❌ Error: No se pudieron iniciar los contenedores${NC}" + echo -e "${YELLOW}💡 Intenta ejecutar: docker compose up -d dev${NC}" + exit 1 + fi + + echo -e "${GREEN}✅ Contenedores iniciados correctamente${NC}" + else + echo -e "${GREEN}✅ Contenedores ya están corriendo${NC}" + fi +} + +# Función para ejecutar comando en el contenedor +run_in_container() { + local cmd="$1" + echo -e "${BLUE}🐳 Ejecutando en contenedor: $cmd${NC}" + docker compose exec -T dev bash -c "$cmd" +} + +# Verificar argumentos +if [ $# -eq 0 ]; then + echo -e "${RED}❌ Error: Debes especificar el tipo de test a ejecutar${NC}" + echo -e "${YELLOW}Uso: $0 [backend|frontend|e2e|all]${NC}" + echo -e "${YELLOW}Ejemplos:${NC}" + echo -e "${YELLOW} $0 backend # Solo tests de backend${NC}" + echo -e "${YELLOW} $0 frontend # Solo tests de frontend${NC}" + echo -e "${YELLOW} $0 e2e # Solo tests E2E${NC}" + echo -e "${YELLOW} $0 all # Todos los tests${NC}" + exit 1 +fi + +TEST_TYPE="$1" + +# Validar tipo de test +if [[ ! "$TEST_TYPE" =~ ^(backend|frontend|e2e|all)$ ]]; then + echo -e "${RED}❌ Error: Tipo de test inválido: $TEST_TYPE${NC}" + echo -e "${YELLOW}Tipos válidos: backend, frontend, e2e, all${NC}" + exit 1 +fi + +print_header "🧪 Ejecutor de Tests Docker - CronosMatic" +echo -e "${YELLOW}Tipo de test: $TEST_TYPE${NC}" + +# 1. Verificar Docker +check_docker + +# 2. Verificar contenedores +check_containers + +# 3. Ejecutar tests en el contenedor +print_header "Ejecutando Tests en Docker" + +# Ejecutar el script de configuración y tests dentro del contenedor +if run_in_container "./docker/test-setup.sh $TEST_TYPE"; then + echo "" + echo -e "${GREEN}🎉 Tests ejecutados exitosamente en Docker!${NC}" + echo -e "${GREEN}✨ Todos los tests del tipo '$TEST_TYPE' pasaron correctamente${NC}" +else + echo "" + echo -e "${RED}❌ Error: Los tests fallaron${NC}" + echo -e "${YELLOW}💡 Revisa los logs arriba para más detalles${NC}" + echo -e "${YELLOW}💡 Para debugging, puedes acceder al contenedor con:${NC}" + echo -e "${YELLOW} docker compose exec dev bash${NC}" + exit 1 +fi + +# 4. Mostrar información adicional +print_header "Información Adicional" +echo -e "${BLUE}📊 Contenedores activos:${NC}" +docker compose ps + +echo "" +echo -e "${BLUE}🔗 Servicios disponibles:${NC}" +echo -e "${YELLOW} • Aplicación (dev): http://localhost:3000${NC}" +echo -e "${YELLOW} • Vite (hot reload): http://localhost:5173${NC}" +echo -e "${YELLOW} • phpMyAdmin: http://localhost:8080${NC}" + +echo "" +echo -e "${GREEN}✅ Ejecución de tests en Docker completada${NC}" \ No newline at end of file diff --git a/vitest.docker.config.ts b/vitest.docker.config.ts new file mode 100644 index 0000000..f9a8887 --- /dev/null +++ b/vitest.docker.config.ts @@ -0,0 +1,71 @@ +/// +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import path from 'path' + +export default defineConfig({ + plugins: [react()], + test: { + globals: true, + environment: 'jsdom', + setupFiles: ['./resources/js/test-setup.ts'], + include: ['resources/js/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + + // Configuraciones específicas para Docker + testTimeout: 15000, // Aumentado para Docker + hookTimeout: 15000, // Aumentado para Docker + teardownTimeout: 15000, // Aumentado para Docker + + // Pool de workers optimizado para Docker + pool: 'forks', + poolOptions: { + forks: { + minForks: 1, + maxForks: 2, // Limitado para Docker + }, + }, + + // Configuración de cobertura + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'cobertura'], + include: ['resources/js/**/*.{js,ts,jsx,tsx}'], + exclude: [ + 'resources/js/**/*.{test,spec}.{js,ts,jsx,tsx}', + 'resources/js/test-setup.ts', + 'resources/js/app.tsx', + 'resources/js/ssr.tsx', + 'resources/js/**/__mocks__/**', + 'resources/js/**/*.d.ts' + ], + thresholds: { + global: { + branches: 70, + functions: 70, + lines: 70, + statements: 70 + } + }, + // Directorio de salida específico para Docker + reportsDirectory: './tests/results/coverage' + }, + + // Configuración de reportes + reporters: ['verbose', 'json'], + outputFile: { + json: './tests/results/vitest-results.json' + }, + + // Variables de entorno para Docker + env: { + DOCKER_ENV: 'true', + NODE_ENV: 'test', + VITE_APP_ENV: 'testing' + } + }, + resolve: { + alias: { + '@': path.resolve(__dirname, './resources/js'), + }, + }, +}) \ No newline at end of file