package middlewares import "testing" // El permiso comparaba solo el último segmento de la URL, así que dos rutas // distintas terminadas igual eran indistinguibles. Estos casos fijan que la // comparación es sobre la ruta completa y corta en el separador. func TestPuedeVerRuta(t *testing.T) { permisos := []string{"/app/doc/paginas", "/app/clientes", "/status"} casos := []struct { ruta string esperado bool porque string }{ {"/app/doc/paginas", true, "coincidencia exacta"}, {"/app/doc/paginas/7", true, "el detalle cuelga de la pantalla permitida"}, {"/app/doc/paginas/", true, "la barra final no cambia nada"}, {"/app/clientes", true, "otra pantalla permitida"}, {"/status", true, "una ruta pública también puede ser un ítem del menú"}, {"/app/doc/categorias", false, "otra pantalla del mismo módulo"}, {"/app/umind", false, "sin permiso"}, {"/app/doc", false, "el padre no se hereda del hijo"}, // El bug original: comparaba solo lo que va después del último '/'. {"/app/otro/paginas", false, "termina igual pero es otra ruta"}, // El corte va en el separador, no en el prefijo de texto. {"/app/doc/paginas-privadas", false, "solo comparte el comienzo del nombre"}, {"/app/clientes-vip", false, "prefijo parecido, ruta distinta"}, } for _, cas := range casos { if got := PuedeVerRuta(cas.ruta, permisos); got != cas.esperado { t.Errorf("PuedeVerRuta(%q) = %v, esperaba %v — %s", cas.ruta, got, cas.esperado, cas.porque) } } } // Sin permisos no se entra a ningún lado (los administradores se resuelven // antes, con user.IsAdmin). func TestPuedeVerRutaSinPermisos(t *testing.T) { if PuedeVerRuta("/app/clientes", nil) { t.Error("un rol sin submódulos no debería acceder a nada") } if PuedeVerRuta("/app/clientes", []string{"", " "}) { t.Error("una URL vacía no debería habilitar nada") } }