package handlers import ( "bytes" "encoding/json" "net/http" "net/http/httptest" "testing" "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" "go.uber.org/zap" "gorm.io/driver/sqlite" "gorm.io/gorm" "veza-backend-api/internal/models" "veza-backend-api/internal/services" ) func setupFeatureFlagTestDB(t *testing.T) *gorm.DB { db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) assert.NoError(t, err) assert.NoError(t, db.AutoMigrate(&models.FeatureFlag{})) // Seed with one flag for toggle test assert.NoError(t, db.Create(&models.FeatureFlag{ Name: "TEST_FLAG", Enabled: false, Description: "Test", }).Error) return db } func TestFeatureFlagHandler_List(t *testing.T) { db := setupFeatureFlagTestDB(t) logger := zap.NewNop() svc := services.NewFeatureFlagService(db, logger) handler := NewFeatureFlagHandler(svc) gin.SetMode(gin.TestMode) router := gin.New() router.GET("/admin/feature-flags", handler.List) req := httptest.NewRequest("GET", "/admin/feature-flags", nil) w := httptest.NewRecorder() router.ServeHTTP(w, req) assert.Equal(t, http.StatusOK, w.Code) } func TestFeatureFlagHandler_Toggle_NotFound(t *testing.T) { db := setupFeatureFlagTestDB(t) logger := zap.NewNop() svc := services.NewFeatureFlagService(db, logger) handler := NewFeatureFlagHandler(svc) gin.SetMode(gin.TestMode) router := gin.New() router.PUT("/admin/feature-flags/:name", handler.Toggle) body, _ := json.Marshal(map[string]bool{"enabled": true}) req := httptest.NewRequest("PUT", "/admin/feature-flags/NONEXISTENT", bytes.NewReader(body)) req.Header.Set("Content-Type", "application/json") w := httptest.NewRecorder() router.ServeHTTP(w, req) assert.Equal(t, http.StatusInternalServerError, w.Code) }