=== Teste E2E: cadastro de processo — PASSO 2 (validação, sem gravar) === ▶ 1. Dados válidos ✅ mínimo (só contexto, área e formulário) → ok — [] ✅ dados devolvidos idênticos à fonte (contexto, formulário) ✅ sem nome nem responsável → NULL (o nome NÃO é obrigatório) ✅ caminho da área devolvido ✅ completo → ok, textos aparados ✅ ids em texto são aceitos e vazio/espaços viram NULL ✅ nome com 255 caracteres → ok (limite do model) ✅ área Específica + formulário SI&TI → ok — [] ▶ 2. Regras do model (mensagens do próprio model) ✅ e-mail inválido → erro do model no campo — "Email do responsável" não é um endereço de e-mail válido. ✅ só esse erro (o resto está válido) — ["email_responsavel:regra_do_model"] ✅ nome com 256 caracteres → erro do model ✅ nome do responsável com 256 caracteres → erro do model ▶ 3. Campos obrigatórios trazem as opções válidas ✅ tudo vazio → só o contexto é cobrado (o resto depende dele) — ["contexto_id:obrigatorio"] ✅ opções de contexto = os ativos do cliente 297 (paridade) ✅ sem área → cobra a área com as que RESPONDEM (paridade) — ["scope_id:obrigatorio"] ✅ sem formulário → cobra o formulário com os possíveis da área (paridade) — ["inventario_dados_id:obrigatorio"] ✅ tipos estranhos (texto, lista, zero, objeto) não quebram: tratados como não informados — ["contexto_id:obrigatorio"] ▶ 4. Tenant e Soft Delete ✅ contexto de OUTRO cliente → só contexto_invalido (sem vazar scope/formulário) — ["contexto_id:contexto_invalido"] ✅ opções oferecidas são só os contextos dela ✅ área de OUTRO cliente no contexto dela → scope_invalido — ["scope_id:scope_invalido"] ✅ contexto INATIVO do próprio cliente → contexto_invalido ✅ área INATIVA → scope_invalido ✅ nenhuma área inativa entre as opções ✅ área de OUTRO contexto (mesmo cliente) → scope_invalido ▶ 5. Formulário fora da lista (o servidor impõe; a tela só limitava o dropdown) ✅ formulário RIPD → formulario_invalido com as opções certas — ["inventario_dados_id:formulario_invalido"] ✅ formulário SI&TI numa área Geral → formulario_invalido com as opções certas — ["inventario_dados_id:formulario_invalido"] ✅ formulário INATIVO → formulario_invalido com as opções certas — ["inventario_dados_id:formulario_invalido"] ✅ formulário inexistente → formulario_invalido com as opções certas — ["inventario_dados_id:formulario_invalido"] ▶ 6. Vários problemas na mesma mensagem (o usuário deu tudo de uma vez) ✅ formulário inválido + e-mail inválido + nome longo → os 3 de uma vez — ["email_responsavel:regra_do_model","inventario_dados_id:formulario_invalido","nome:regra_do_model"] ▶ 7. Área que NÃO responde inventário → recusa e mostra as que podem (usuário 1052) ✅ scope que não responde → scope_nao_responde — ["scope_id:scope_nao_responde"] ✅ a mensagem cita a área ✅ opções = as áreas do contexto que respondem (paridade) — 59 vs 59 ✅ a área que não responde NÃO está nas opções ✅ nenhuma inativa nas opções ✅ além disso, o e-mail inválido também é apontado na mesma resposta — ["scope_id:scope_nao_responde","email_responsavel:regra_do_model"] ✅ escolhendo uma das opções (com o formulário dela), passa — geral_especifico da área: 2 [] ▶ 8. Sem usuário identificado ✅ contexto sem usuário → usuario_invalido e nada mais ▶ 9. Somente leitura ✅ a classe não contém nenhuma instrução de escrita ✅ nenhuma tabela mudou (inventario_scope, scope, log, agent_acao_pendente, inventario_dados) — {"inventario_scope":83818,"scope":10641,"log":2480628,"agent_acao_pendente":0,"inventario_dados":62} → {"inventario_scope":83818,"scope":10641,"log":2480628,"agent_acao_pendente":0,"inventario_dados":62} === Resultado: 39 ok, 0 falha(s) ===