package services import ( "os" "strings" "testing" ) // Solo un SI explícito dispara el aviso. Un modelo que devuelve una // explicación, un error o cualquier otra cosa no puede despertar a nadie a las // 3 de la mañana: un aviso que no llega molesta menos que uno sin motivo. func TestEvaluarCondicionSoloAceptaSiExplicito(t *testing.T) { casos := map[string]bool{ "SI": true, "si": true, "SÍ": true, "Sí.": true, "SI, el stock está en cero": true, "NO": false, "no": false, "Sin duda no puedo determinarlo": false, "La condición parece cumplirse en algunos casos": false, "": false, "ERROR": false, "true": false, } for entrada, quiero := range casos { if got := interpretarVeredicto(entrada); got != quiero { t.Errorf("veredicto %q = %v, quiero %v", entrada, got, quiero) } } } // El ahorro que hace viable la feature: sin cambio en la respuesta, no se // llama a la IA. Sin esto, cinco vigilancias cada 5 minutos son 1440 consultas // diarias al modelo por cliente. func TestVigilanciaNoLlamaALaIASiNoCambio(t *testing.T) { b, err := os.ReadFile("umind_vigilancia_service.go") if err != nil { t.Fatal(err) } s := string(b) i := strings.Index(s, "func revisarUnaVigilancia") cuerpo := s[i:] cuerpo = cuerpo[:strings.Index(cuerpo, "\n// EvaluarCondicion")] hash := strings.Index(cuerpo, "hash == v.HashUltimo") eval := strings.Index(cuerpo, "EvaluarCondicionVigilancia") if hash < 0 || eval < 0 || hash > eval { t.Error("el corte por hash tiene que ir ANTES de evaluar con la IA") } corte := cuerpo[hash:eval] if !strings.Contains(corte, "return") { t.Error("si el hash no cambió tiene que cortar, no seguir a la evaluación") } // Se avisa al entrar en condición, no en cada chequeo que la siga // cumpliendo: una alerta cada media hora deja de leerse a la segunda. if !strings.Contains(cuerpo, "cumple && !v.EnCondicion") { t.Error("falta el flanco: sin él la misma alerta se repite en cada ciclo") } } // La vigilancia apunta a una herramienta del agente y nunca a una URL libre: // es lo que le da el blindaje anti-SSRF sin reimplementarlo. func TestVigilanciaNoAceptaURLLibre(t *testing.T) { b, err := os.ReadFile("umind_vigilancia_tools.go") if err != nil { t.Fatal(err) } s := string(b) if strings.Contains(s, `"url"`) { t.Error("la tool no puede aceptar una URL: tiene que apuntar a una herramienta ya configurada") } if !strings.Contains(s, "GetUmindHerramientaByNombre(agenteID, herramienta)") { t.Error("falta validar que la herramienta exista y sea de este agente") } }