package config import ( "os" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestLoad(t *testing.T) { // Sauvegarder les valeurs originales originalDBPassword := os.Getenv("DB_PASSWORD") originalJWTSecret := os.Getenv("JWT_SECRET") originalAppPort := os.Getenv("APP_PORT") // Nettoyer après le test defer func() { if originalDBPassword != "" { os.Setenv("DB_PASSWORD", originalDBPassword) } else { os.Unsetenv("DB_PASSWORD") } if originalJWTSecret != "" { os.Setenv("JWT_SECRET", originalJWTSecret) } else { os.Unsetenv("JWT_SECRET") } if originalAppPort != "" { os.Setenv("APP_PORT", originalAppPort) } else { os.Unsetenv("APP_PORT") } }() // Définir les variables requises os.Setenv("DB_PASSWORD", "test_password") os.Setenv("JWT_SECRET", "test_secret") config, err := Load() require.NoError(t, err) require.NotNil(t, config) // Vérifier les valeurs par défaut assert.Equal(t, 8080, config.AppPort) assert.Equal(t, "development", config.AppEnv) assert.Equal(t, "localhost", config.DBHost) assert.Equal(t, 5432, config.DBPort) assert.Equal(t, "veza", config.DBUser) assert.Equal(t, "veza_db", config.DBName) assert.Equal(t, "redis://localhost:6379", config.RedisURL) // Vérifier les valeurs requises assert.Equal(t, "test_password", config.DBPassword) assert.Equal(t, "test_secret", config.JWTSecret) } func TestLoad_WithCustomValues(t *testing.T) { // Sauvegarder les valeurs originales originalDBPassword := os.Getenv("DB_PASSWORD") originalJWTSecret := os.Getenv("JWT_SECRET") originalAppPort := os.Getenv("APP_PORT") originalDBHost := os.Getenv("DB_HOST") originalDBPort := os.Getenv("DB_PORT") // Nettoyer après le test defer func() { if originalDBPassword != "" { os.Setenv("DB_PASSWORD", originalDBPassword) } else { os.Unsetenv("DB_PASSWORD") } if originalJWTSecret != "" { os.Setenv("JWT_SECRET", originalJWTSecret) } else { os.Unsetenv("JWT_SECRET") } if originalAppPort != "" { os.Setenv("APP_PORT", originalAppPort) } else { os.Unsetenv("APP_PORT") } if originalDBHost != "" { os.Setenv("DB_HOST", originalDBHost) } else { os.Unsetenv("DB_HOST") } if originalDBPort != "" { os.Setenv("DB_PORT", originalDBPort) } else { os.Unsetenv("DB_PORT") } }() // Définir des valeurs personnalisées os.Setenv("DB_PASSWORD", "custom_password") os.Setenv("JWT_SECRET", "custom_secret") os.Setenv("APP_PORT", "9090") os.Setenv("DB_HOST", "custom_host") os.Setenv("DB_PORT", "3306") config, err := Load() require.NoError(t, err) assert.Equal(t, 9090, config.AppPort) assert.Equal(t, "custom_host", config.DBHost) assert.Equal(t, 3306, config.DBPort) assert.Equal(t, "custom_password", config.DBPassword) assert.Equal(t, "custom_secret", config.JWTSecret) } func TestLoad_MissingRequiredVariable_DBPassword(t *testing.T) { // Sauvegarder les valeurs originales originalDBPassword := os.Getenv("DB_PASSWORD") originalJWTSecret := os.Getenv("JWT_SECRET") // Nettoyer après le test defer func() { if originalDBPassword != "" { os.Setenv("DB_PASSWORD", originalDBPassword) } else { os.Unsetenv("DB_PASSWORD") } if originalJWTSecret != "" { os.Setenv("JWT_SECRET", originalJWTSecret) } else { os.Unsetenv("JWT_SECRET") } }() // Supprimer les variables requises os.Unsetenv("DB_PASSWORD") os.Setenv("JWT_SECRET", "test_secret") // Devrait paniquer assert.Panics(t, func() { _, _ = Load() }, "Should panic when DB_PASSWORD is missing") } func TestLoad_MissingRequiredVariable_JWTSecret(t *testing.T) { // Sauvegarder les valeurs originales originalDBPassword := os.Getenv("DB_PASSWORD") originalJWTSecret := os.Getenv("JWT_SECRET") // Nettoyer après le test defer func() { if originalDBPassword != "" { os.Setenv("DB_PASSWORD", originalDBPassword) } else { os.Unsetenv("DB_PASSWORD") } if originalJWTSecret != "" { os.Setenv("JWT_SECRET", originalJWTSecret) } else { os.Unsetenv("JWT_SECRET") } }() // Supprimer les variables requises os.Setenv("DB_PASSWORD", "test_password") os.Unsetenv("JWT_SECRET") // Devrait paniquer assert.Panics(t, func() { _, _ = Load() }, "Should panic when JWT_SECRET is missing") } func TestGetEnv(t *testing.T) { // Sauvegarder la valeur originale originalValue := os.Getenv("TEST_VAR") defer func() { if originalValue != "" { os.Setenv("TEST_VAR", originalValue) } else { os.Unsetenv("TEST_VAR") } }() // Test avec valeur définie os.Setenv("TEST_VAR", "test_value") assert.Equal(t, "test_value", getEnv("TEST_VAR", "default")) // Test sans valeur (devrait retourner défaut) os.Unsetenv("TEST_VAR") assert.Equal(t, "default", getEnv("TEST_VAR", "default")) } func TestGetEnvInt(t *testing.T) { // Sauvegarder la valeur originale originalValue := os.Getenv("TEST_INT") defer func() { if originalValue != "" { os.Setenv("TEST_INT", originalValue) } else { os.Unsetenv("TEST_INT") } }() // Test avec valeur entière valide os.Setenv("TEST_INT", "42") assert.Equal(t, 42, getEnvInt("TEST_INT", 10)) // Test sans valeur (devrait retourner défaut) os.Unsetenv("TEST_INT") assert.Equal(t, 10, getEnvInt("TEST_INT", 10)) // Test avec valeur invalide (devrait retourner défaut) os.Setenv("TEST_INT", "not_a_number") assert.Equal(t, 10, getEnvInt("TEST_INT", 10)) } func TestGetEnvRequired(t *testing.T) { // Sauvegarder la valeur originale originalValue := os.Getenv("TEST_REQUIRED") defer func() { if originalValue != "" { os.Setenv("TEST_REQUIRED", originalValue) } else { os.Unsetenv("TEST_REQUIRED") } }() // Test avec valeur définie os.Setenv("TEST_REQUIRED", "required_value") assert.Equal(t, "required_value", getEnvRequired("TEST_REQUIRED")) // Test sans valeur (devrait paniquer) os.Unsetenv("TEST_REQUIRED") assert.Panics(t, func() { _ = getEnvRequired("TEST_REQUIRED") }, "Should panic when required variable is missing") } func TestLoad_DefaultValues(t *testing.T) { // Sauvegarder les valeurs originales originalDBPassword := os.Getenv("DB_PASSWORD") originalJWTSecret := os.Getenv("JWT_SECRET") originalAppEnv := os.Getenv("APP_ENV") originalRedisURL := os.Getenv("REDIS_URL") // Nettoyer après le test defer func() { if originalDBPassword != "" { os.Setenv("DB_PASSWORD", originalDBPassword) } else { os.Unsetenv("DB_PASSWORD") } if originalJWTSecret != "" { os.Setenv("JWT_SECRET", originalJWTSecret) } else { os.Unsetenv("JWT_SECRET") } if originalAppEnv != "" { os.Setenv("APP_ENV", originalAppEnv) } else { os.Unsetenv("APP_ENV") } if originalRedisURL != "" { os.Setenv("REDIS_URL", originalRedisURL) } else { os.Unsetenv("REDIS_URL") } }() // Définir seulement les variables requises os.Setenv("DB_PASSWORD", "test") os.Setenv("JWT_SECRET", "secret") // Supprimer les variables optionnelles pour tester les valeurs par défaut os.Unsetenv("APP_ENV") os.Unsetenv("REDIS_URL") config, err := Load() require.NoError(t, err) // Vérifier que les valeurs par défaut sont utilisées assert.Equal(t, "development", config.AppEnv) assert.Equal(t, "redis://localhost:6379", config.RedisURL) }