# Redes Sociais — Estratégia de Testes

## 1. Estratégia

| Tipo | Ferramenta (v7) | Escopo |
|---|---|---|
| Feature (HTTP) | PHPUnit + `RefreshDatabase` | API pública, API do CMS, toggle de status, reordenação |
| View | Pest ou `assertSee` | presença/ausência das redes por posição |
| Unit | PHPUnit | normalização de URL, enums, resource |
| Manual | checklist no CMS | ícone, posições, appearance em cada layout |

O legado **não tem** testes automatizados para este módulo. O ponto mais sensível a testar é a
**regra de posição** (cabeçalho x rodapé), replicada em 11 templates na v6 — exatamente o que a
v7 deve unificar.

## 2. Fixtures e factories

```php
// database/factories/SocialNetworkFactory.php  (exemplo ilustrativo)
class SocialNetworkFactory extends Factory
{
    protected $model = SocialNetwork::class;

    public function definition(): array
    {
        return [
            'name' => 'Facebook',
            'icon' => 'fab fa-facebook',
            'url' => 'https://facebook.com/prefeitura',
            'is_blank' => false,
            'active' => true,
            'sort_order' => 1,
            'position' => SocialPosition::Ambos,
        ];
    }

    public function inativa(): static
    {
        return $this->state(fn () => ['active' => false]);
    }
}
```

Para testar o legado (`contents` + `links`), a factory precisa criar os dois registros:

| Tabela | Campo | Valor |
|---|---|---|
| `contents` | `title` | nome da rede |
| `contents` | `icon` | `fab fa-facebook` |
| `contents` | `status` | `true` |
| `contents` | `position_id` | 1, 2 ou 3 |
| `contents` | `category_contents_id` | id da categoria `rede-social` (26) |
| `links` | `contents_id` | id do conteúdo |
| `links` | `link` | URL |
| `links` | `isBlank` | `0`/`1` |

Seeds necessários em ambiente de teste: categoria `rede-social`, tabela `positions` com as 3
posições e as permissões `redes-sociais.*`.

## 3. Casos de teste

### 3.1 API pública / renderização

| # | Cenário | Arrange | Act | Assert |
|---|---|---|---|---|
| T1 | Redes ativas são listadas | 2 redes ativas | `GET /api/v1/redes-sociais` | 2 itens em `data` |
| T2 | Rede inativa não é listada | 1 ativa + 1 inativa | `GET /api/v1/redes-sociais` | apenas a ativa |
| T3 | Filtro por posição do rodapé | redes com posição 1, 2 e 3 | `GET /api/v1/redes-sociais?position=rodape` | posições 2 e 3 |
| T4 | Filtro por posição do cabeçalho | idem | `?position=cabecalho` | posições 1 e 3 |
| T5 | URL sem protocolo é normalizada | rede com `url = 'facebook.com/x'` | `GET /api/v1/redes-sociais` | `url` começa com `http://` |
| T6 | `is_blank` é exposto | rede com `is_blank = true` | `GET /api/v1/redes-sociais` | `is_blank = true` |
| T7 | Rede aparece no rodapé | rede com posição 2 | `GET /` e conferir o HTML do rodapé | `data[].name` presente no rodapé |
| T8 | Rede de cabeçalho não aparece no rodapé | rede com posição 1 | `GET /` | nome **ausente** no rodapé |

### 3.2 CMS

| # | Cenário | Arrange | Act | Assert |
|---|---|---|---|---|
| T9 | Criar rede válida | usuário com `redes-sociais.create` | `POST /api/v1/cms/redes-sociais` | 201, registro criado |
| T10 | Nome obrigatório | — | `POST` sem `name` | 422 em `name` |
| T11 | Ícone obrigatório | — | `POST` sem `icon` | 422 em `icon` |
| T12 | URL obrigatória e válida | — | `POST` sem `url` / com `url` inválida | 422 em `url` |
| T13 | Posição válida | — | `POST` com `position` fora do enum | 422 em `position` |
| T14 | Ordem obrigatória | — | `POST` sem `sort_order` | 422 em `sort_order` |
| T15 | Alternar status | rede ativa | `POST /api/v1/cms/redes-sociais/{id}/status` | `active` invertido; some do portal |
| T16 | Reordenar | 3 redes | `PUT /api/v1/cms/redes-sociais/reordenar` com a nova ordem | `sort_order` = 1, 2, 3 |
| T17 | Permissões | usuário sem `redes-sociais.edit` | `PUT /api/v1/cms/redes-sociais/{id}` | 403 |

### 3.3 Regressão da v6 (documenta o comportamento atual)

| # | Cenário | Assert |
|---|---|---|
| T18 | A URL é sanitizada como no legado (`sanitizeLink`) | `https://` sem ponto vira caminho relativo |
| T19 | O slug gerado a partir do nome mantém o formato `Str::slug` | `facebook-da-prefeitura` |

## 4. Fixtures de view/seed

| Item | Origem |
|---|---|
| Categoria `rede-social` | `v6/database/seeds/CategoryContentTableSeeder.php` |
| Posições (Cabeçalho, Rodapé, Ambos) | `v6/database/migrations/2023_08_17_094440_position_table_with_data.php` |
| Permissões `redes-sociais.*` | `v6/database/seeds/RolesTableSeeder.php` |
| Resource `redes-sociais` | `v6/database/seeds/ResourcesTableSeeder.php` |
| Módulo `redes-sociais` (id 29) | `v6/database/migrations/2024_11_01_150206_create_modulos_table.php` |

## 5. Como rodar

```bash
# suíte completa
php artisan test

# módulo
php artisan test --filter=SocialNetwork

# view/feature do portal
php artisan test tests/Feature/Portal/SocialNetworkTest.php

# com seed
php artisan test --filter=SocialNetwork --seed
```

Com Pest:

```bash
pest tests/Feature/Portal/SocialNetworkTest.php
```

## 6. Checklist manual (v6)

1. Em `Informações da Instituição`, abrir “Redes Sociais”.
2. Cadastrar uma rede com ícone, URL e posição “Rodapé”; confirmar na listagem.
3. Clicar no botão de status e confirmar a mudança de “Ativado” para “Desativado”.
4. Abrir o portal e conferir a rede no rodapé; repetir no cabeçalho com posição “Cabeçalho”.
5. Marcar “Abrir em nova guia” e confirmar o `target="_blank"`.
6. Testar em cada layout (`modelo1`..`modelo6` e `default`).
