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