> For the complete documentation index, see [llms.txt](https://senselab.gitbook.io/senselab-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://senselab.gitbook.io/senselab-docs/docs/archive/fase_8_testing_plan.md).

# FASE 8: Plan de Testing Automatizado

**Fecha de Inicio:** 21 de noviembre de 2025\
**Fecha de Actualización:** 21 de noviembre de 2025\
**Objetivo:** Implementar testing automatizado completo para garantizar calidad y estabilidad

***

## 🎯 Objetivos de la Fase

1. ✅ Crear tests de Feature para endpoints críticos
2. ⏳ Crear tests de Unit para lógica de negocio
3. ⏳ Alcanzar cobertura mínima del 70%
4. ⏳ Configurar CI/CD básico (opcional)
5. ✅ Documentar prácticas de testing

***

## 📊 Estado Actual del Testing

### Estadísticas Globales

* **Total de Tests:** 81
* **Tests Pasando:** 44 (54%)
* **Tests Fallando:** 37 (46%)
* **Duración:** \~7-11 segundos

### Progreso por Módulo

#### ✅ Tests Completados (44 pasando)

1. **AuthTest** - 11/11 tests ✅ (100%)
2. **EmpresaTest** - 8/8 tests ✅ (100%)
3. **PermissionTest** - 17/17 tests ✅ (100%)
4. **RoleTest (Unit)** - 10/10 tests ✅ (100%)
5. **UsuarioTest (Unit)** - 16/16 tests ✅ (100%)
6. **ProductoTest** - 3/12 tests ⚠️ (25%)
7. **VentaTest** - 0/7 tests ❌ (0%)

#### ⏳ Tests en Progreso

* **ProductoTest:** 9 tests fallando por errores 500 en el controlador
* **VentaTest:** 7 tests fallando por dependencias faltantes

***

## 📋 Estrategia de Testing

### Tests Feature (API Endpoints)

Probar flujos completos de usuario a través de la API

**Prioridad Alta:**

* ✅ **Autenticación** (login, logout, registro) - 11/11 ✅
* ✅ **Empresas** (CRUD + multi-tenancy) - 8/8 ✅
* ⏳ **Productos** (CRUD + búsqueda + inventario) - 3/12 ⚠️
* ⏳ **Ventas** (CRUD + anular + estadísticas) - 0/7 ❌
* ✅ **Permisos/RBAC** (gestión de roles y permisos) - 17/17 ✅

**Prioridad Media:**

* ⏳ Clientes (CRUD)
* ⏳ Inventario (entradas/salidas + kardex)
* ⏳ Cuentas por Cobrar (CRUD + abonar)
* ⏳ Proveedores
* ⏳ Órdenes de Compra

**Prioridad Baja:**

* ⏳ Asientos Contables (CRUD + mayorizar)
* ⏳ Almacenes
* ⏳ Sucursales
* ⏳ Empleados
* ⏳ Catálogos (Marcas, Unidades, etc.)
* ⏳ Configuraciones
* ⏳ Transporte

### Tests Unit (Lógica de Negocio)

Probar métodos específicos de modelos y servicios

**Completados:**

* ✅ **Usuario** (roles, permisos, autenticación) - 16/16 ✅
* ✅ **Rol** (relaciones, permisos, scopes) - 10/10 ✅

**Pendientes:**

* ⏳ Producto (cálculos de precio, validaciones)
* ⏳ Venta (cálculo de totales, impuestos)
* ⏳ AsientoContable (validación debe=haber)
* ⏳ CuentaContable (estructura jerárquica)
* ⏳ Inventario (cálculo de stock)
* ⏳ Cliente (validaciones)
* ⏳ Empresa (multi-tenancy)
* ⏳ CuentaPorCobrar (cálculo de saldos)

***

## 🏗️ Estructura de Tests Actual

```
tests/
├── Feature/
│   ├── AuthTest.php ✅ (11 tests - 100%)
│   ├── EmpresaTest.php ✅ (8 tests - 100%)
│   ├── ProductoTest.php ⚠️ (3/12 tests - 25%)
│   ├── VentaTest.php ❌ (0/7 tests - 0%)
│   └── PermissionTest.php ✅ (17 tests - 100%)
│
├── Unit/
│   ├── RoleTest.php ✅ (10 tests - 100%)
│   └── UsuarioTest.php ✅ (16 tests - 100%)
│
└── TestCase.php ✅ (con helpers mejorados)
```

***

## ✅ Tests Implementados y Funcionando

### 1. AuthTest.php (11/11 ✅)

* ✅ test\_usuario\_puede\_hacer\_login\_con\_credenciales\_validas
* ✅ test\_login\_falla\_con\_credenciales\_invalidas
* ✅ test\_login\_falla\_con\_usuario\_inexistente
* ✅ test\_login\_falla\_con\_usuario\_inactivo
* ✅ test\_login\_requiere\_email\_y\_password
* ✅ test\_usuario\_puede\_hacer\_logout
* ✅ test\_usuario\_autenticado\_puede\_obtener\_su\_informacion
* ✅ test\_login\_retorna\_permisos\_del\_usuario
* ✅ test\_token\_tiene\_tiempo\_de\_expiracion
* ✅ test\_usuario\_puede\_tener\_multiples\_tokens\_activos
* ✅ test\_logout\_solo\_elimina\_token\_actual

### 2. EmpresaTest.php (8/8 ✅)

* ✅ test\_puede\_listar\_empresas
* ✅ test\_puede\_crear\_empresa
* ✅ test\_puede\_actualizar\_empresa
* ✅ test\_puede\_ver\_empresa\_especifica
* ✅ test\_valida\_cedula\_juridica\_unica
* ✅ test\_valida\_email\_unico
* ✅ test\_requiere\_autenticacion
* ✅ test\_valida\_campos\_requeridos

### 3. PermissionTest.php (17/17 ✅)

* ✅ test\_usuario\_administrador\_tiene\_todos\_los\_permisos
* ✅ test\_usuario\_sin\_rol\_no\_tiene\_permisos
* ✅ test\_usuario\_con\_rol\_especifico\_tiene\_solo\_sus\_permisos
* ✅ test\_puede\_asignar\_rol\_a\_usuario
* ✅ test\_puede\_remover\_rol\_de\_usuario
* ✅ test\_usuario\_puede\_tener\_multiples\_roles
* ✅ test\_permisos\_se\_heredan\_de\_todos\_los\_roles
* ✅ test\_rol\_inactivo\_no\_otorga\_permisos
* ✅ test\_puede\_listar\_todos\_los\_permisos
* ✅ test\_puede\_listar\_todos\_los\_roles
* ✅ test\_puede\_asignar\_permisos\_a\_rol
* ✅ test\_puede\_remover\_permisos\_de\_rol
* ✅ test\_permisos\_agrupados\_por\_modulo
* ✅ test\_middleware\_verifica\_permisos\_correctamente
* ✅ test\_usuario\_obtiene\_lista\_de\_sus\_permisos
* ✅ test\_crear\_rol\_requiere\_nombre\_unico
* ✅ test\_solo\_usuarios\_con\_permiso\_pueden\_gestionar\_roles

### 4. RoleTest.php - Unit (10/10 ✅)

* ✅ Relaciones con permisos
* ✅ Método hasPermission()
* ✅ Scopes (activos, noEliminados)
* ✅ Normalización de datos

### 5. UsuarioTest.php - Unit (16/16 ✅)

* ✅ Relaciones con roles
* ✅ Métodos hasRole() y hasPermission()
* ✅ Autenticación Sanctum
* ✅ Validación de datos

### 6. ProductoTest.php (3/12 ⚠️)

**Pasando:**

* ✅ test\_no\_puede\_crear\_producto\_sin\_autenticacion
* ✅ test\_validacion\_campos\_requeridos\_al\_crear\_producto
* ✅ test\_puede\_eliminar\_producto\_soft\_delete

**Fallando (errores 500):**

* ❌ test\_puede\_listar\_productos\_autenticado
* ❌ test\_puede\_crear\_producto\_con\_datos\_validos
* ❌ test\_no\_puede\_crear\_producto\_con\_codigo\_duplicado
* ❌ test\_puede\_actualizar\_producto\_existente
* ❌ test\_puede\_buscar\_productos\_por\_nombre
* ❌ test\_puede\_filtrar\_productos\_por\_estado\_activo
* ❌ test\_productos\_estan\_paginados
* ❌ test\_usuario\_solo\_ve\_productos\_de\_su\_empresa
* ❌ test\_productos\_eliminados\_no\_aparecen\_en\_listado

### 7. VentaTest.php (0/7 ❌)

Todos fallando por dependencias faltantes en el controlador

***

## 🛠️ Mejoras Implementadas en TestCase

### Helpers Creados

1. **createEmpresa()** - Crea empresa con régimen tributario válido
2. **createUsuario()** - Crea usuario con roles opcionales
3. **createAdminUsuario()** - Crea usuario administrador con todos los permisos
4. **createProducto()** - Crea producto con todos los campos requeridos
5. **getCategoriaProducto()** - Obtiene o crea categoría de prueba
6. **getUnidadMedida()** - Obtiene o crea unidad de medida de prueba
7. **authenticatedJson()** - Hace peticiones JSON autenticadas
8. **seedRoles()** - Crea roles básicos
9. **seedPermisos()** - Crea permisos básicos

### Correcciones Realizadas

1. ✅ `regimen_tributario_id` ahora es required en StoreEmpresaRequest
2. ✅ `email` único en StoreEmpresaRequest
3. ✅ EmpresaResource devuelve campo `nombre` correctamente
4. ✅ Tests de Empresa usan RegimenTributario real de la BD
5. ✅ Helpers de producto con categoría y unidad de medida

***

## 🛠️ Configuración de Testing

### phpunit.xml

```xml
<env name="DB_CONNECTION" value="mysql"/>
<env name="DB_DATABASE" value="api_db_testing"/>
<env name="DB_USERNAME" value="nuevo_usuario"/>
<env name="DB_PASSWORD" value="nueva_contraseña"/>
```

### Base de Datos de Testing

* **Nombre:** `api_db_testing`
* **Estrategia:** RefreshDatabase en cada test
* **Seeders:** Se ejecutan automáticamente

***

## 📊 Métricas Actuales

### Cobertura de Código

* **Actual:** \~54% (estimado por tests pasando/total)
* **Meta Mínima:** 70%
* **Meta Ideal:** 85%
* **Áreas Críticas alcanzadas:** Autenticación (100%), RBAC (100%), Empresas (100%)

### Velocidad de Ejecución

* **Tests Feature:** \~6-8 segundos
* **Tests Unit:** \~1-2 segundos
* **Total Suite:** \~7-11 segundos ✅

### Calidad

* ⏳ 37 tests fallidos (46%)
* ⚠️ Metadata deprecation warnings (PHPUnit 12)
* ✅ Tests independientes
* ✅ Tests con RefreshDatabase

***

## 🐛 Problemas Identificados

### Errores Críticos

1. **ProductoTest (9 fallos):**
   * Error 500 en controlador ProductoController
   * Posible problema con relaciones o validaciones
2. **VentaTest (7 fallos):**
   * Dependencias faltantes (FormaPago, Cliente, Producto con stock)
   * Controlador VentaController necesita revisión
3. **Warnings PHPUnit:**
   * Metadata en doc-comments deprecado
   * Actualizar a attributes para PHPUnit 12

### Errores Menores

* Algunos tests de Producto crean datos sin usar helpers consistentemente
* Falta validación de código único en productos por empresa

***

## 🔄 Proceso de Testing

### Desarrollo Local

```bash
# Ejecutar todos los tests
php artisan test

# Ejecutar tests específicos
php artisan test --filter=AuthTest
php artisan test --filter=EmpresaTest

# Ejecutar con salida compacta
php artisan test --compact

# Tests por suite
php artisan test --testsuite=Feature
php artisan test --testsuite=Unit
```

### Antes de Commit

```bash
# Verificar que pasen todos los tests
php artisan test

# Opcional: Verificar estilo de código
./vendor/bin/phpcs

# Opcional: Analizar código estático
./vendor/bin/phpstan analyse
```

***

## 📝 Convenciones de Testing

### Nomenclatura

```php
// Feature Tests
test_puede_[accion]_[entidad]()
test_no_puede_[accion]_sin_permiso()
test_valida_[campo]_requerido()

// Unit Tests
test_[metodo]_[comportamiento_esperado]()
test_[metodo]_lanza_excepcion_cuando_[condicion]()
```

### Estructura AAA (Arrange, Act, Assert)

```php
public function test_ejemplo()
{
    // Arrange - Preparar datos
    $usuario = $this->createAdminUsuario();
    
    // Act - Ejecutar acción
    $response = $this->authenticatedJson('GET', '/api/usuarios', [], $usuario);
    
    // Assert - Verificar resultados
    $response->assertStatus(200);
}
```

***

## 🚀 Plan de Corrección (Próximos Pasos)

### Prioridad Alta (Esta Semana)

1. **Corregir ProductoTest (9 fallos)**
   * Investigar error 500 en ProductoController
   * Revisar relaciones y validaciones
   * Asegurar que todos los tests usen helpers
2. **Corregir VentaTest (7 fallos)**
   * Implementar seeders necesarios (FormaPago, etc.)
   * Revisar VentaController y dependencias
   * Crear helpers para ventas
3. **Actualizar metadata PHPUnit**
   * Cambiar `/** @test */` por `#[Test]` attribute
   * Eliminar warnings de deprecación

### Prioridad Media (Próxima Semana)

4. **Crear Tests Unit para Producto**
   * test\_calcula\_precio\_con\_impuesto()
   * test\_valida\_codigo\_unico()
   * test\_relaciones\_correctas()
5. **Crear Tests Unit para Venta**
   * test\_calcula\_subtotal()
   * test\_calcula\_total\_impuestos()
   * test\_calcula\_total\_final()
6. **Implementar más Tests Feature**
   * ClienteTest (CRUD básico)
   * ProveedorTest (CRUD básico)
   * InventarioTest (movimientos básicos)

### Prioridad Baja (Futuro)

7. **Alcanzar cobertura 70%+**
   * Tests para módulos restantes
   * Tests edge cases
   * Tests de validación exhaustiva
8. **Configurar CI/CD**
   * GitHub Actions para tests automáticos
   * Coverage reports
   * Quality gates

***

## 📈 Historial de Cambios

### 21 de noviembre de 2025

* ✅ Corregidos tests de Empresa (8/8 pasando)
* ✅ Agregados helpers de testing en TestCase
* ✅ Mejorados tests de Producto (3/12 pasando)
* ✅ Actualizada documentación FASE\_8
* 📊 Estado: 44 pasando / 37 fallando (54%)

***

**Meta Actual:** Llegar a 70 tests pasando (86%) para fin de semana **Estado:** En progreso activo 🚀


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://senselab.gitbook.io/senselab-docs/docs/archive/fase_8_testing_plan.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
