==================================================== TDD: MissaoPresenter::montarJsonFrontendBase — origem_localizacao/endereco_wms no topo (M3) ==================================================== --- 1. Item origem=wms com endereco_wms -> exposto no TOPO do item (M3) --- ✅ [PASS] origem_localizacao=wms exposto no topo do item ✅ [PASS] endereco_wms exposto no topo do item ✅ [PASS] origem_localizacao CONTINUA presente dentro de dados_adicionais (não regressão do ciclo 0) --- 2. Item origem=legado (sem endereco_wms) -> origem exposta, endereco null --- ✅ [PASS] origem_localizacao=legado exposto no topo ✅ [PASS] chave endereco_wms presente mesmo quando ausente do snapshot (legado) ✅ [PASS] endereco_wms ausente -> null (legado nunca grava endereço, RN4) --- 3. Item de missão SEM a variante WMS (snapshot antigo, sem as chaves novas) -> ambos null, sem quebrar --- ✅ [PASS] chave origem_localizacao SEMPRE presente no array (mesmo null) -- contrato estável pro JS ✅ [PASS] missão sem a variante WMS -> origem_localizacao=null (regressão zero, AC8) ✅ [PASS] missão sem a variante WMS -> endereco_wms=null (regressão zero, AC8) --- 4. Múltiplos itens -> cada um mantém seu próprio valor, sem vazar entre itens --- ✅ [PASS] item 10: endereco_wms próprio, correto ✅ [PASS] item 11 (legado): endereco_wms=null, não herdou do item 10 ✅ [PASS] item 12: endereco_wms próprio, correto (não sobrescrito por item 10) --- 5. dados_adicionais como STRING JSON crua (fetch sem decode) -> ainda decodifica e expõe --- ✅ [PASS] dados_adicionais como string JSON -> origem_localizacao decodificado e exposto no topo ✅ [PASS] dados_adicionais como string JSON -> endereco_wms decodificado e exposto no topo ==================================================== RESULTADO GERAL: ✅ SUCESSO Passou: 14 Falhou: 0 ====================================================