# 🧪 Testes Automatizados - GestorEasy v3

## 📋 Visão Geral

Este documento descreve a estrutura de testes automatizados do sistema ERP GestorEasy v3.

## 🚀 Instalação

### Pré-requisitos
- PHP 8.1 ou superior
- Composer
- SQLite (para testes)

### Instalação das Dependências

```bash
composer install
```

## 🏃 Executando Testes

### Todos os Testes

```bash
# Linux/Mac
./tests/run-tests.sh

# Windows
tests\run-tests.bat

# Ou usando Composer
composer test
```

### Testes Específicos

```bash
# Testes de um módulo específico
vendor/bin/phpunit tests/Modules/Auth

# Testes de uma classe específica
vendor/bin/phpunit tests/Modules/Auth/AuthTest.php

# Testes com verbose
vendor/bin/phpunit --verbose

# Testes com cobertura
composer test-coverage
```

## 📁 Estrutura de Testes

```
tests/
├── bootstrap.php              # Bootstrap dos testes
├── TestCase.php               # Classe base para testes
├── Core/                      # Testes do core do sistema
├── Modules/                   # Testes dos módulos
│   ├── Auth/
│   ├── Clientes/
│   ├── Produtos/
│   ├── Estoque/
│   ├── Vendas/
│   ├── PCP/
│   ├── CRMAvancado/
│   └── Workflows/
├── Integration/               # Testes de integração
└── Unit/                      # Testes unitários
```

## 🧪 Tipos de Testes

### 1. Testes Unitários
Testam unidades individuais de código (classes, métodos).

**Exemplo:**
```php
public function testCreateUser(): void {
    $userId = $this->createTestUser();
    $this->assertIsInt($userId);
}
```

### 2. Testes de Integração
Testam a integração entre diferentes componentes.

**Exemplo:**
```php
public function testCreateSalesOrder(): void {
    $clientId = $this->createTestClient();
    $productId = $this->createTestProduct();
    // ... criar pedido
}
```

### 3. Testes Funcionais
Testam funcionalidades completas do sistema.

## 📊 Cobertura de Testes

### Módulos com Testes
- ✅ Auth
- ✅ Clientes
- ✅ Produtos
- ✅ Estoque
- ✅ Vendas
- ✅ PCP
- ✅ CRMAvancado
- ✅ Workflows

### Módulos Pendentes
- ⏳ Compras
- ⏳ Financeiro
- ⏳ Fiscal
- ⏳ SPED
- ⏳ BI
- ⏳ Ecommerce
- ⏳ Integrações

## 🔧 Configuração

### PHPUnit

O arquivo `phpunit.xml` contém a configuração dos testes:

```xml
<phpunit bootstrap="tests/bootstrap.php">
    <testsuites>
        <testsuite name="Core">
            <directory>tests/Core</directory>
        </testsuite>
        <testsuite name="Modules">
            <directory>tests/Modules</directory>
        </testsuite>
    </testsuites>
</phpunit>
```

### Ambiente de Teste

Os testes usam SQLite em memória para isolamento e performance:

```php
$this->pdo = new PDO('sqlite::memory:');
```

## 🎯 Boas Práticas

### 1. Nomenclatura
- Classes de teste: `*Test.php`
- Métodos de teste: `test*()`
- Testes descritivos: `testCreateUserWithValidData()`

### 2. Estrutura AAA
- **Arrange**: Preparar dados
- **Act**: Executar ação
- **Assert**: Verificar resultado

### 3. Isolamento
- Cada teste é independente
- Usar `setUp()` e `tearDown()`
- Não depender de outros testes

### 4. Dados de Teste
- Usar factories/helpers
- Criar dados realistas
- Limpar após cada teste

## 📈 Métricas

### Cobertura de Código

```bash
composer test-coverage
```

Isso gerará um relatório em `coverage/index.html`.

### Meta de Cobertura
- **Mínimo**: 70%
- **Ideal**: 80%+
- **Crítico**: 90%+

## 🐛 Debugging

### Executar Teste Específico

```bash
vendor/bin/phpunit tests/Modules/Auth/AuthTest.php::testCreateUser
```

### Modo Verbose

```bash
vendor/bin/phpunit --verbose
```

### Parar no Primeiro Erro

```bash
vendor/bin/phpunit --stop-on-failure
```

## 📝 Escrevendo Testes

### Exemplo Básico

```php
<?php

namespace Tests\Modules\MeuModulo;

use Tests\TestCase;

class MeuModuloTest extends TestCase {
    
    public function testMinhaFuncionalidade(): void {
        // Arrange
        $dados = ['campo' => 'valor'];
        
        // Act
        $resultado = minhaFuncao($dados);
        
        // Assert
        $this->assertNotNull($resultado);
        $this->assertEquals('valor esperado', $resultado);
    }
}
```

### Helpers Disponíveis

```php
// Criar usuário de teste
$userId = $this->createTestUser(['email' => 'test@example.com']);

// Criar produto de teste
$productId = $this->createTestProduct(['codigo' => 'PROD001']);

// Criar cliente de teste
$clientId = $this->createTestClient(['nome' => 'Test Client']);
```

## 🚨 Problemas Comuns

### 1. Testes Falhando
- Verificar se as tabelas foram criadas
- Verificar dados de teste
- Verificar isolamento de tenant

### 2. Erros de Autoload
- Executar `composer dump-autoload`
- Verificar namespaces

### 3. Problemas com Banco de Dados
- Verificar se SQLite está habilitado
- Verificar permissões

## 📚 Recursos

- [PHPUnit Documentation](https://phpunit.de/documentation.html)
- [Testing Best Practices](https://phpunit.de/documentation.html)
- [Test-Driven Development](https://en.wikipedia.org/wiki/Test-driven_development)

## 🤝 Contribuindo

Ao adicionar novos testes:
1. Seguir a estrutura existente
2. Usar nomes descritivos
3. Adicionar documentação
4. Garantir isolamento
5. Executar todos os testes antes de commitar

## 📊 Status

- **Total de Testes**: 30+
- **Módulos Cobertos**: 8/46
- **Cobertura de Código**: 0% (a ser implementado)
- **Última Atualização**: 2025-01-27

