# Estratégia de Testes

Testes desde o primeiro commit (secção 47). Pest sobre PHPUnit,
`RefreshDatabase` em todos os testes de Feature.

## Camadas

```
tests/
├── Unit/                     → Services e Actions isolados (sem DB quando possível)
├── Feature/
│   ├── Auth/                 → login, logout, password reset, MFA
│   ├── Authorization/        → roles, permissions, policies por entidade
│   ├── Tenancy/              → ⚠️ CRÍTICO — ver abaixo
│   ├── Workflows/            → Request → Quote → Approval → WO → Invoice
│   ├── Finance/               → invoices, approval, permissions
│   └── Uploads/               → ficheiros válidos/inválidos, acesso não autorizado
└── Security/
    └── CrossTenantAccessTest.php
```

## Testes de tenant isolation (obrigatórios, secção 32)

Todo o módulo novo só é considerado "feito" depois de ter, no mínimo, este
padrão de teste replicado:

```php
it('impede leitura cross-tenant de work orders', function () {
    $orgA = Organization::factory()->create();
    $orgB = Organization::factory()->create();

    $userA = User::factory()->for($orgA)->create();
    $workOrderB = WorkOrder::factory()->for($orgB)->create();

    actingAs($userA)
        ->getJson("/api/v1/work-orders/{$workOrderB->id}")
        ->assertNotFound(); // nunca 403 — não revela existência
});

it('impede update cross-tenant mesmo enviando organization_id falso', function () {
    $orgA = Organization::factory()->create();
    $orgB = Organization::factory()->create();
    $userA = User::factory()->for($orgA)->create();
    $propertyB = Property::factory()->for($orgB)->create();

    actingAs($userA)
        ->putJson("/api/v1/properties/{$propertyB->id}", [
            'organization_id' => $orgA->id, // tentativa de bypass
            'name' => 'Hacked',
        ])
        ->assertNotFound();

    expect($propertyB->fresh()->name)->not->toBe('Hacked');
});
```

Replica-se este par de testes (read + write) para: properties, assets,
maintenance_requests, work_orders, quotes, invoices, media_files.

## Checklist obrigatório após cada módulo importante (secção 58)

- [ ] Testes de feature do módulo passam
- [ ] Testes de autorização (cada role, incluindo os que NÃO devem aceder)
- [ ] Testes de tenant isolation (read + write + delete + file access)
- [ ] Validação de inputs (Form Requests com casos inválidos)
- [ ] Migration com FKs, índices e constraints revista
- [ ] Code review (sem lógica de negócio em Controller/Blade)
