package middlewares import ( "testing" "github.com/gofiber/fiber/v2" "github.com/valyala/fasthttp" ) // El aislamiento entre clientes es la única lógica nueva donde un bug // significa que un cliente vea los datos de otro. Estos casos cubren el // contrato de UmindScopeDe/UmindPuedeVerTenant sin necesidad de base de datos. func TestUmindPuedeVerTenant(t *testing.T) { app := fiber.New() casos := []struct { nombre string scope interface{} // lo que quedó en Locals tenantID uint esperado bool }{ {"staff ve cualquier tenant", []uint(nil), 42, true}, {"cliente ve el suyo", []uint{7, 9}, 7, true}, {"cliente ve el otro suyo", []uint{7, 9}, 9, true}, {"cliente NO ve el de otro", []uint{7, 9}, 8, false}, {"cliente sin tenants no ve nada", []uint{}, 1, false}, {"ruta sin middleware de scope no ve nada", nil, 1, false}, {"scope de tipo inesperado no ve nada", "todos", 1, false}, } for _, cas := range casos { t.Run(cas.nombre, func(t *testing.T) { c := app.AcquireCtx(&fasthttp.RequestCtx{}) defer app.ReleaseCtx(c) if cas.scope != nil { c.Locals(umindScopeKey, cas.scope) } if got := UmindPuedeVerTenant(c, cas.tenantID); got != cas.esperado { t.Errorf("UmindPuedeVerTenant(tenant %d) = %v, esperaba %v", cas.tenantID, got, cas.esperado) } }) } } // Un scope nil (staff) y uno vacío (cliente sin tenants) NO deben confundirse: // tratar el vacío como staff le daría acceso total a un cliente sin tenants. func TestScopeVacioNoEsStaff(t *testing.T) { app := fiber.New() c := app.AcquireCtx(&fasthttp.RequestCtx{}) defer app.ReleaseCtx(c) c.Locals(umindScopeKey, []uint{}) if _, esStaff := UmindScopeDe(c); esStaff { t.Fatal("un scope vacío se está tratando como staff: un cliente sin tenants vería todo") } c2 := app.AcquireCtx(&fasthttp.RequestCtx{}) defer app.ReleaseCtx(c2) c2.Locals(umindScopeKey, []uint(nil)) if _, esStaff := UmindScopeDe(c2); !esStaff { t.Fatal("un scope nil debería ser staff") } }