package controllers import "testing" // La validación es lo único que separa "cargué mi cuenta y anda" de un error // del proveedor que nadie sabe leer. func TestValidacionDeCuentaPropia(t *testing.T) { casos := []struct { nombre string req aiConfigPropiaReq valida bool }{ {"completa", aiConfigPropiaReq{Nombre: "Mi OpenAI", Provider: "openai", ApiKey: "sk-x", ModelName: "gpt-4o-mini"}, true}, {"sin nombre", aiConfigPropiaReq{Provider: "openai", ApiKey: "sk-x", ModelName: "gpt-4o-mini"}, false}, {"sin modelo", aiConfigPropiaReq{Nombre: "X", Provider: "openai", ApiKey: "sk-x"}, false}, {"sin clave", aiConfigPropiaReq{Nombre: "X", Provider: "openai", ModelName: "gpt-4o-mini"}, false}, // Un proveedor inventado se manda igual y falla recién contra la API, // con un mensaje que no dice "escribiste mal el nombre". {"proveedor inventado", aiConfigPropiaReq{Nombre: "X", Provider: "chatgpt-5", ApiKey: "k", ModelName: "m"}, false}, // Ollama corre contra un servidor propio: no lleva clave, pero sin URL // no hay a dónde ir. {"ollama con url y sin clave", aiConfigPropiaReq{Nombre: "X", Provider: "ollama", ModelName: "llama3.1", BaseURL: "https://o.x/v1"}, true}, {"ollama sin url", aiConfigPropiaReq{Nombre: "X", Provider: "ollama", ModelName: "llama3.1"}, false}, {"mayúsculas en el proveedor", aiConfigPropiaReq{Nombre: "X", Provider: "OpenAI", ApiKey: "k", ModelName: "m"}, true}, } for _, c := range casos { err := c.req.validar() if c.valida && err != nil { t.Errorf("%s: debería pasar, dio: %v", c.nombre, err) } if !c.valida && err == nil { t.Errorf("%s: debería rechazarse y pasó", c.nombre) } } } // Las configs globales son del staff y las comparten todos los clientes. Que un // cliente pudiera editarlas sería cambiarle el proveedor de IA a todos los // demás; que pudiera borrarlas, dejarlos sin servicio. func TestLasConfigsGlobalesNoSonDelCliente(t *testing.T) { // accesoAiConfigPropia corta cuando TenantID es nil, antes de mirar // permisos. Se comprueba la condición porque el handler necesita base. var tenantNil *uint if tenantNil != nil { t.Fatal("una config global tiene TenantID nil") } esGlobal := tenantNil == nil if !esGlobal { t.Error("una config sin tenant tiene que tratarse como global e intocable") } }