package handlers import ( "encoding/json" "net/http" "net/http/httptest" "strings" "testing" "github.com/gin-gonic/gin" "github.com/stretchr/testify/require" "gorm.io/driver/sqlite" "gorm.io/gorm" "github.com/Wikid82/charon/backend/internal/config" "github.com/Wikid82/charon/backend/internal/models" ) func TestSecurityHandler_GetConfigAndUpdateConfig(t *testing.T) { t.Helper() // Setup DB and router db, err := gorm.Open(sqlite.Open("file::memory:?mode=memory&cache=shared"), &gorm.Config{}) require.NoError(t, err) require.NoError(t, db.AutoMigrate(&models.SecurityConfig{})) cfg := config.SecurityConfig{} h := NewSecurityHandler(cfg, db, nil) // Create a gin test context for GetConfig when no config exists w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) req := httptest.NewRequest("GET", "/security/config", http.NoBody) c.Request = req h.GetConfig(c) require.Equal(t, http.StatusOK, w.Code) var body map[string]interface{} require.NoError(t, json.Unmarshal(w.Body.Bytes(), &body)) // Should return config: null if _, ok := body["config"]; !ok { t.Fatalf("expected 'config' in response, got %v", body) } // Now update config w = httptest.NewRecorder() c, _ = gin.CreateTestContext(w) payload := `{"name":"default","admin_whitelist":"127.0.0.1/32"}` req = httptest.NewRequest("POST", "/security/config", strings.NewReader(payload)) req.Header.Set("Content-Type", "application/json") c.Request = req h.UpdateConfig(c) require.Equal(t, http.StatusOK, w.Code) // Now call GetConfig again and ensure config is returned w = httptest.NewRecorder() c, _ = gin.CreateTestContext(w) req = httptest.NewRequest("GET", "/security/config", http.NoBody) c.Request = req h.GetConfig(c) require.Equal(t, http.StatusOK, w.Code) var body2 map[string]interface{} require.NoError(t, json.Unmarshal(w.Body.Bytes(), &body2)) cfgVal, ok := body2["config"].(map[string]interface{}) if !ok { t.Fatalf("expected config object, got %v", body2["config"]) } if cfgVal["admin_whitelist"] != "127.0.0.1/32" { t.Fatalf("unexpected admin_whitelist: %v", cfgVal["admin_whitelist"]) } }