package services import ( "strings" "testing" ) // El catálogo es contenido que se le muestra al cliente y que además define el // conocimiento inicial de su agente. Un título vacío o una nota sin marcadores // para completar significa que alguien va a publicar datos de ejemplo como si // fueran reales. func TestCatalogoDeRubrosEstaCompleto(t *testing.T) { if len(PlantillasRubro) < 3 { t.Fatalf("el catálogo tiene %d plantillas, muy pocas para ofrecer", len(PlantillasRubro)) } vistas := map[string]bool{} for _, p := range PlantillasRubro { if p.Clave == "" || p.Nombre == "" || p.Descripcion == "" { t.Errorf("plantilla incompleta: %+v", p.Clave) } if vistas[p.Clave] { t.Errorf("clave duplicada: %q — la segunda nunca se podría elegir", p.Clave) } vistas[p.Clave] = true if len(p.Notas) == 0 { t.Errorf("la plantilla %q no trae ninguna nota: elegirla sería igual que no elegir nada", p.Clave) } for _, n := range p.Notas { if strings.TrimSpace(n.Titulo) == "" { t.Errorf("nota sin título en %q", p.Clave) } if len(strings.TrimSpace(n.Contenido)) < 40 { t.Errorf("nota %q de %q demasiado corta: no generaría ni un fragmento", n.Titulo, p.Clave) } } } } // Los valores de ejemplo van entre corchetes justamente para que se note que // hay que reemplazarlos. Una nota sin corchetes se lee como dato real y termina // en boca del asistente. func TestLasNotasPidenSerCompletadas(t *testing.T) { for _, p := range PlantillasRubro { for _, n := range p.Notas { if !strings.Contains(n.Contenido, "[") { t.Errorf("la nota %q de %q no tiene ningún marcador [entre corchetes]: se puede confundir con información real", n.Titulo, p.Clave) } } } } // El rubro de salud no puede ofrecerse sin decir explícitamente que el // asistente no da consejo médico: es el único donde una respuesta inventada // hace daño de verdad. func TestSaludAclaraQueNoDaConsejoMedico(t *testing.T) { p, ok := PlantillaRubroPorClave("salud") if !ok { t.Fatal("falta la plantilla de salud") } junto := strings.ToLower(p.Notas[0].Titulo + " " + p.Notas[0].Contenido) if !strings.Contains(junto, "no responde consultas médicas") && !strings.Contains(junto, "no damos consejo") { t.Error("la primera nota de salud tiene que ser el límite: el asistente no da consejo médico") } } func TestPlantillaRubroPorClave(t *testing.T) { if _, ok := PlantillaRubroPorClave("no-existe"); ok { t.Error("una clave inventada no debería resolver") } p, ok := PlantillaRubroPorClave("restaurante") if !ok || p.Nombre == "" { t.Error("restaurante debería existir en el catálogo") } } func TestResumenNoFiltraElContenido(t *testing.T) { // El resumen alimenta la pantalla de elección: manda títulos, no el texto // completo de cada nota. for _, r := range ResumenPlantillasRubro() { if _, hay := r["contenido"]; hay { t.Error("el resumen no debería incluir el contenido de las notas") } if r["clave"] == "" || r["nombre"] == "" { t.Errorf("resumen incompleto: %+v", r) } } }