package models import "testing" // El rol vive en dos lados (la columna Rol y el flag EsPortalPartner del // Role). Consultarlos por separado se contradecía: el dashboard elegía el // layout con uno y los proyectos con el otro. EsPartner es ahora la única // definición, y estos casos fijan cuál gana. func TestEsPartner(t *testing.T) { casos := []struct { nombre string user *PortalUser esperado bool }{ {"nil no es partner", nil, false}, {"sin Role, rol partner", &PortalUser{Rol: "partner"}, true}, {"sin Role, rol cliente", &PortalUser{Rol: "cliente"}, false}, {"con Role, el flag manda aunque el rol diga cliente", &PortalUser{Rol: "cliente", Role: &Roles{EsPortalPartner: true}}, true}, {"con Role, el flag manda aunque el rol diga partner", &PortalUser{Rol: "partner", Role: &Roles{EsPortalPartner: false}}, false}, } for _, cas := range casos { t.Run(cas.nombre, func(t *testing.T) { if got := cas.user.EsPartner(); got != cas.esperado { t.Errorf("EsPartner() = %v, esperaba %v", got, cas.esperado) } }) } } // El alcance del portal se deriva de EsPartner: un desajuste acá es que un // usuario vea proyectos de un cliente que no le corresponde. func TestGetClienteIDsForPortalUser(t *testing.T) { cid := uint(7) casos := []struct { nombre string user *PortalUser esperado []uint }{ {"nil no ve nada", nil, []uint{}}, {"cliente ve el suyo", &PortalUser{Rol: "cliente", ClienteID: &cid}, []uint{7}}, {"cliente sin ClienteID no ve nada", &PortalUser{Rol: "cliente"}, []uint{}}, {"partner ve los de sus accesos", &PortalUser{Rol: "partner", PortalAccesos: []PortalAcceso{{ClienteID: 3}, {ClienteID: 9}}}, []uint{3, 9}}, {"partner sin accesos no ve nada", &PortalUser{Rol: "partner"}, []uint{}}, } for _, cas := range casos { t.Run(cas.nombre, func(t *testing.T) { got := GetClienteIDsForPortalUser(cas.user) if len(got) != len(cas.esperado) { t.Fatalf("= %v, esperaba %v", got, cas.esperado) } for i := range got { if got[i] != cas.esperado[i] { t.Errorf("= %v, esperaba %v", got, cas.esperado) } } }) } }