package models import ( "testing" "github.com/sujit-baniya/fiber-boilerplate/app" "github.com/sujit-baniya/fiber-boilerplate/config" "github.com/sujit-baniya/fiber-boilerplate/utils" ) // El resto del proyecto inicializa app.Http en el arranque; en tests hay que // hacerlo a mano antes de tocar cualquier cosa que lea la config. func conAppKey(t *testing.T, key string) { t.Helper() anterior := app.Http app.Http = &config.AppConfig{} app.Http.Server.Key = key t.Cleanup(func() { app.Http = anterior }) } // La migración progresiva de AiConfig.ApiKey depende de que ClaveEnClaro // distinga una clave cifrada de una que todavía está en texto plano. Si esto // se rompe, el sistema empieza a mandar ciphertext como API key a OpenAI y // todos los agentes dejan de responder. func TestClaveEnClaroMigracionProgresiva(t *testing.T) { conAppKey(t, "6368616e676520746869732070617373776f726420746f206120736563726574") // 32 bytes en hex casos := []struct { nombre string guardado string esperado string descripci string }{ {"vacío", "", "", "sin clave no hay nada que descifrar"}, {"texto plano", "sk-proj-abc123", "sk-proj-abc123", "fila vieja sin cifrar, se devuelve tal cual"}, {"cifrada", utils.Encrypt("sk-proj-abc123", app.Http.Server.Key), "sk-proj-abc123", "fila nueva, se descifra"}, {"hex que no es ciphertext", "deadbeef", "deadbeef", "hex válido pero no descifrable: no debe romper"}, } for _, cas := range casos { t.Run(cas.nombre, func(t *testing.T) { cfg := &AiConfig{ApiKey: cas.guardado} if got := cfg.ClaveEnClaro(); got != cas.esperado { t.Errorf("%s: ClaveEnClaro() = %q, esperaba %q", cas.descripci, got, cas.esperado) } }) } } // Sin APP_KEY el guardado no debe romperse: se guarda en claro y se lee en // claro, que es exactamente el comportamiento previo a esta migración. func TestCifrarClaveAiSinAppKey(t *testing.T) { conAppKey(t, "") if got := CifrarClaveAi("sk-test"); got != "sk-test" { t.Errorf("CifrarClaveAi sin APP_KEY = %q, esperaba pasarla tal cual", got) } cfg := &AiConfig{ApiKey: "sk-test"} if got := cfg.ClaveEnClaro(); got != "sk-test" { t.Errorf("ClaveEnClaro sin APP_KEY = %q, esperaba pasarla tal cual", got) } }