# Guia de Testes e Validação — PNTP 2026

## 1. Visão Geral

Este guia descreve como testar e validar o Portal de Transparência para garantir a conformidade com todos os 181 critérios do PNTP 2026.

---

## 2. Estratégia de Testes

### 2.1 Pirâmide de Testes

```
                    ┌─────────┐
                    │  E2E    │  → Testes completos do portal
                   ┌┴─────────┴┐
                   │  Integração│  → Testes de APIs e ETL
                  ┌┴───────────┴┐
                  │   Unitários   │  → Testes de funções/componentes
                  └───────────────┘
```

### 2.2 Tipos de Testes

| Tipo | Ferramenta | Escopo |
|---|---|---|
| **Unitários** | Jest, Pytest | Funções individuais |
| **Integração** | Supertest, Requests | APIs, ETL |
| **E2E** | Cypress, Playwright | Fluxos completos do usuário |
| **Acessibilidade** | Lighthouse, axe | WCAG 2.1 |
| **Performance** | Lighthouse, WebPageTest | Carregamento, Core Web Vitals |
| **Segurança** | OWASP ZAP, Snyk | Vulnerabilidades |

---

## 3. Testes de Conformidade por Critério

### 3.1 Teste de Disponibilidade (30%)

**Objetivo:** Verificar se a informação está integralmente disponível no portal.

```javascript
// Exemplo de teste automatizado com Cypress
describe('Critério 3.1 - Receita: Previsão e Realização', () => {
  it('deve exibir tabela com prevista e realizada', () => {
    cy.visit('/transparencia/receita/previsao-realizacao');
    cy.get('table').should('exist');
    cy.get('th').should('contain', 'Receita Prevista');
    cy.get('th').should('contain', 'Receita Realizada');
  });

  it('deve ter dados do ano atual', () => {
    cy.get('tbody tr').should('have.length.greaterThan', 0);
  });

  it('deve ter dados de 3 anos anteriores', () => {
    cy.get('[data-ano="2023"]').should('exist');
    cy.get('[data-ano="2024"]').should('exist');
    cy.get('[data-ano="2025"]').should('exist');
  });

  it('deve permitir exportação', () => {
    cy.get('[data-format="xlsx"]').should('exist');
    cy.get('[data-format="csv"]').should('exist');
  });

  it('deve ter filtros', () => {
    cy.get('[name="ano"]').should('exist');
    cy.get('[name="mes"]').should('exist');
  });
});
```

### 3.2 Teste de Atualidade (30%)

**Objetivo:** Verificar se as informações estão atualizadas conforme os prazos.

```javascript
describe('Teste de Atualidade', () => {
  it('deve ter data de atualização visível', () => {
    cy.get('.atualizado-em').should('exist');
  });

  it('deve ter dados atualizados em até 30 dias', () => {
    cy.get('[data-atualizacao]').then(($el) => {
      const dataAtualizacao = new Date($el.text());
      const hoje = new Date();
      const diffDias = (hoje - dataAtualizacao) / (1000 * 60 * 60 * 24);
      expect(diffDias).to.be.lessThan(30);
    });
  });
});
```

### 3.3 Teste de Série Histórica (20%)

**Objetivo:** Verificar se existe histórico de informações dos últimos 3 anos.

```javascript
describe('Teste de Série Histórica', () => {
  it('deve ter dados de 2023, 2024 e 2025', () => {
    cy.visit('/transparencia/receita/previsao-realizacao');
    cy.get('[data-ano="2023"]').should('exist');
    cy.get('[data-ano="2024"]').should('exist');
    cy.get('[data-ano="2025"]').should('exist');
  });
});
```

### 3.4 Teste de Gravação de Relatórios (10%)

**Objetivo:** Verificar se é possível exportar dados em formato editável.

```javascript
describe('Teste de Gravação', () => {
  it('deve permitir exportar em XLSX', () => {
    cy.get('[data-format="xlsx"]').click();
    // Verificar download
  });

  it('deve permitir exportar em CSV', () => {
    cy.get('[data-format="csv"]').click();
    // Verificar download
  });
});
```

### 3.5 Teste de Filtro de Pesquisa (10%)

**Objetivo:** Verificar se os filtros funcionam corretamente.

```javascript
describe('Teste de Filtro', () => {
  it('deve filtrar por ano', () => {
    cy.get('[name="ano"]').select('2025');
    cy.get('tbody tr').each(($row) => {
      cy.wrap($row).should('contain', '2025');
    });
  });

  it('deve filtrar por nome', () => {
    cy.get('[name="nome"]').type('João');
    cy.get('tbody tr').should('have.length.greaterThan', 0);
  });
});
```

---

## 4. Testes Específicos por Dimensão

### 4.1 Dimensão 1 — Informações Prioritárias

```javascript
describe('Dimensão 1 - Informações Prioritárias', () => {
  it('1.1 - Sítio oficial próprio', () => {
    cy.visit('/');
    cy.url().should('not.contain', 'wordpress.com');
    cy.url().should('not.contain', 'wix.com');
  });

  it('1.2 - Portal da transparência', () => {
    cy.visit('/transparencia');
    cy.get('h1').should('contain', 'Transparência');
  });

  it('1.3 - Link visível na capa', () => {
    cy.visit('/');
    cy.get('a[href="/transparencia"]').should('be.visible');
  });

  it('1.4 - Ferramenta de pesquisa', () => {
    cy.visit('/');
    cy.get('[type="search"]').should('exist');
    cy.get('[type="search"]').type('receita');
    cy.get('[type="submit"]').click();
    cy.get('.search-results').should('exist');
  });
});
```

### 4.2 Dimensão 2 — Informações Institucionais

```javascript
describe('Dimensão 2 - Informações Institucionais', () => {
  it('2.1 - Estrutura organizacional', () => {
    cy.visit('/transparencia/institucional/estrutura');
    cy.get('.organograma').should('exist');
    cy.get('.data-atualizacao').should('exist');
  });

  it('2.6 - Atos normativos com filtros', () => {
    cy.visit('/transparencia/institucional/atos-normativos');
    cy.get('[name="tipo"]').should('exist');
    cy.get('[name="ano"]').should('exist');
    cy.get('[name="busca"]').should('exist');
  });
});
```

### 4.3 Dimensão 3 — Receita

```javascript
describe('Dimensão 3 - Receita', () => {
  it('3.1 - Previsão e realização na mesma tabela', () => {
    cy.visit('/transparencia/receita/previsao-realizacao');
    cy.get('th').should('contain', 'Receita Prevista');
    cy.get('th').should('contain', 'Receita Realizada');
  });

  it('3.2 - Classificação orçamentária', () => {
    cy.visit('/transparencia/receita/classificacao');
    cy.get('td').should('contain', 'Categoria Econômica');
    cy.get('td').should('contain', 'Origem');
    cy.get('td').should('contain', 'Espécie');
    cy.get('td').should('contain', 'Desdobramento');
  });

  it('3.3 - Dívida ativa', () => {
    cy.visit('/transparencia/receita/divida-ativa');
    cy.get('th').should('contain', 'Nome do Inscrito');
    cy.get('th').should('contain', 'Valor Total');
  });
});
```

### 4.4 Dimensão 4 — Despesa

```javascript
describe('Dimensão 4 - Despesa', () => {
  it('4.1 - Empenhado, liquidado, pago', () => {
    cy.visit('/transparencia/despesa/empenhado-liquidado-pago');
    cy.get('th').should('contain', 'Empenhado');
    cy.get('th').should('contain', 'Liquidado');
    cy.get('th').should('contain', 'Pago');
  });

  it('4.3 - Detalhamento de empenhos', () => {
    cy.visit('/transparencia/despesa/empenhos');
    cy.get('th').should('contain', 'Beneficiário');
    cy.get('th').should('contain', 'Valor');
    cy.get('th').should('contain', 'Objeto');
    cy.get('th').should('contain', 'Licitação');
  });
});
```

### 4.5 Dimensão 6 — Recursos Humanos

```javascript
describe('Dimensão 6 - Recursos Humanos', () => {
  it('6.1 - Relação de servidores', () => {
    cy.visit('/transparencia/recursos-humanos/servidores');
    cy.get('th').should('contain', 'Nome');
    cy.get('th').should('contain', 'Cargo');
    cy.get('th').should('contain', 'Lotação');
    cy.get('th').should('contain', 'Data de Admissão');
    cy.get('th').should('contain', 'Carga Horária');
  });

  it('6.2 - Remuneração nominal (sem login)', () => {
    cy.visit('/transparencia/recursos-humanos/remuneracao');
    cy.get('th').should('contain', 'Nome');
    cy.get('th').should('contain', 'Cargo');
    cy.get('th').should('contain', 'Remuneração');
    // Verificar que não há exigência de login
    cy.get('form[login]').should('not.exist');
  });
});
```

### 4.6 Dimensão 8 — Licitações

```javascript
describe('Dimensão 8 - Licitações', () => {
  it('8.1 - Relação de licitações', () => {
    cy.visit('/transparencia/licitacoes/relacao');
    cy.get('th').should('contain', 'Número');
    cy.get('th').should('contain', 'Modalidade');
    cy.get('th').should('contain', 'Objeto');
    cy.get('th').should('contain', 'Data');
    cy.get('th').should('contain', 'Valor');
    cy.get('th').should('contain', 'Situação');
  });

  it('8.6 - Plano de contratações anual', () => {
    cy.visit('/transparencia/licitacoes/plano-contratacoes');
    // Verificar que não é apenas declaração de não elaboração
    cy.get('.pac-data').should('exist');
  });
});
```

### 4.7 Dimensão 12 — SIC

```javascript
describe('Dimensão 12 - SIC', () => {
  it('12.3 - Formulário e-SIC sem exigências excessivas', () => {
    cy.visit('/transparencia/sic/formulario');
    cy.get('input[name="nome"]').should('exist');
    cy.get('input[name="email"]').should('exist');
    cy.get('textarea[name="pedido"]').should('exist');
    // Verificar que não exige documentos, assinatura, etc.
    cy.get('input[name="documento"]').should('not.exist');
    cy.get('input[name="assinatura"]').should('not.exist');
  });
});
```

---

## 5. Testes de Acessibilidade

### 5.1 Lighthouse

```bash
# Executar Lighthouse CI
npx lighthouse-ci \
  --preset=desktop \
  --url=https://transparencia.dominio.gov.br \
  --output=./lighthouse-report.json
```

### 5.2 Verificações Manuais

- [ ] Símbolo de acessibilidade visível
- [ ] Breadcrumb em todas as páginas
- [ ] Alto contraste funcional
- [ ] Redimensionamento de texto funcional
- [ ] Navegação por teclado
- [ ] Contraste de cores (WCAG AA)
- [ ] Textos alternativos em imagens

---

## 6. Testes de Performance

### 6.1 Core Web Vitals

| Métrica | Meta |
|---|---|
| LCP (Largest Contentful Paint) | < 2,5s |
| FID (First Input Delay) | < 100ms |
| CLS (Cumulative Layout Shift) | < 0,1 |

### 6.2 Tempo de Carregamento

```bash
# Testar tempo de carregamento
curl -o /dev/null -s -w "Tempo: %{time_total}s\n" https://transparencia.dominio.gov.br
```

---

## 7. Testes de Segurança

### 7.1 Verificações

- [ ] HTTPS obrigatório
- [ ] Headers de segurança (CSP, X-Frame-Options)
- [ ] Proteção contra XSS
- [ ] Proteção contra CSRF
- [ ] Rate limiting na API
- [ ] Sem informações sensíveis em URLs
- [ ] Backup configurado

### 7.2 Ferramentas

```bash
# OWASP ZAP
zap.py -u https://transparencia.dominio.gov.br

# Snyk
snyk test
```

---

## 8. Checklist Final de Validação

### 8.1 Requisitos Técnicos

- [ ] Sítio oficial próprio acessível
- [ ] HTTPS com certificado válido
- [ ] Portal de transparência funcional
- [ ] Ferramenta de pesquisa operacional
- [ ] Sem exigência de login
- [ ] Design responsivo
- [ ] Performance adequada
- [ ] Acessibilidade WCAG 2.1

### 8.2 Conteúdo

- [ ] Todos os critérios essenciais implementados
- [ ] Todos os critérios obrigatórios implementados
- [ ] Critérios recomendados implementados (quando possível)
- [ ] Dados atualizados conforme prazos
- [ ] Série histórica de 3 anos disponível
- [ ] Exportação em formatos editáveis funcionando
- [ ] Filtros de pesquisa funcionando

### 8.3 Testes

- [ ] Testes unitários passando
- [ ] Testes de integração passando
- [ ] Testes E2E passando
- [ ] Testes de acessibilidade passando
- [ ] Testes de performance passando
- [ ] Testes de segurança passando

---

## 9. Relatório de Conformidade

Após executar todos os testes, gerar relatório:

```json
{
  "data_avaliacao": "2026-01-15",
  "portal": "https://transparencia.dominio.gov.br",
  "criterios_totais": 181,
  "criterios_atendidos": 175,
  "criterios_nao_atendidos": 6,
  "criterios_essenciais_atendidos": 12,
  "criterios_essenciais_nao_atendidos": 0,
  "indice_transparencia": 96.7,
  "nivel": "Diamante",
  "observacoes": [
    {
      "criterio": "2.8",
      "problema": "Redes sociais não implementadas",
      "impacto": "Recomendado"
    }
  ]
}
```
