207 lines
5.4 KiB
Go
207 lines
5.4 KiB
Go
|
|
package config
|
||
|
|
|
||
|
|
import (
|
||
|
|
"os"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"github.com/stretchr/testify/assert"
|
||
|
|
"github.com/stretchr/testify/require"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestNewTestConfig(t *testing.T) {
|
||
|
|
config := NewTestConfig(t)
|
||
|
|
|
||
|
|
// Vérifier les valeurs par défaut
|
||
|
|
assert.Equal(t, 8080, config.AppPort)
|
||
|
|
assert.Equal(t, "test-jwt-secret-key-minimum-32-characters-long", config.JWTSecret)
|
||
|
|
assert.Equal(t, "postgres://test:test@localhost:5432/test_db", config.DatabaseURL)
|
||
|
|
assert.Equal(t, "redis://localhost:6379/0", config.RedisURL)
|
||
|
|
assert.Equal(t, []string{"*"}, config.CORSOrigins)
|
||
|
|
assert.Equal(t, 100, config.RateLimitLimit)
|
||
|
|
assert.Equal(t, 60, config.RateLimitWindow)
|
||
|
|
assert.Equal(t, "DEBUG", config.LogLevel)
|
||
|
|
assert.NotNil(t, config.Logger)
|
||
|
|
|
||
|
|
// Vérifier que la config est valide (selon les règles de validation)
|
||
|
|
// Note: Pour un test complet, on devrait tester que Validate() passe
|
||
|
|
// mais NewTestConfig ne crée pas une config complète avec DB/Redis
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestWithEnv(t *testing.T) {
|
||
|
|
// Sauvegarder la valeur originale si elle existe
|
||
|
|
originalValue := os.Getenv("TEST_VAR")
|
||
|
|
defer func() {
|
||
|
|
if originalValue != "" {
|
||
|
|
os.Setenv("TEST_VAR", originalValue)
|
||
|
|
} else {
|
||
|
|
os.Unsetenv("TEST_VAR")
|
||
|
|
}
|
||
|
|
}()
|
||
|
|
|
||
|
|
// Tester avec une variable qui n'existe pas
|
||
|
|
os.Unsetenv("TEST_VAR")
|
||
|
|
reset := WithEnv("TEST_VAR", "test_value")
|
||
|
|
|
||
|
|
// Vérifier que la valeur est définie
|
||
|
|
assert.Equal(t, "test_value", os.Getenv("TEST_VAR"))
|
||
|
|
|
||
|
|
// Nettoyer
|
||
|
|
reset()
|
||
|
|
assert.Empty(t, os.Getenv("TEST_VAR"))
|
||
|
|
|
||
|
|
// Tester avec une variable qui existe déjà
|
||
|
|
os.Setenv("TEST_VAR", "original_value")
|
||
|
|
reset2 := WithEnv("TEST_VAR", "new_value")
|
||
|
|
defer reset2()
|
||
|
|
|
||
|
|
// Vérifier que la nouvelle valeur est définie
|
||
|
|
assert.Equal(t, "new_value", os.Getenv("TEST_VAR"))
|
||
|
|
|
||
|
|
// Nettoyer et vérifier que l'ancienne valeur est restaurée
|
||
|
|
reset2()
|
||
|
|
assert.Equal(t, "original_value", os.Getenv("TEST_VAR"))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestWithEnv_MultipleCalls(t *testing.T) {
|
||
|
|
// Tester plusieurs appels consécutifs
|
||
|
|
os.Unsetenv("TEST_VAR")
|
||
|
|
defer os.Unsetenv("TEST_VAR")
|
||
|
|
|
||
|
|
reset1 := WithEnv("TEST_VAR", "value1")
|
||
|
|
assert.Equal(t, "value1", os.Getenv("TEST_VAR"))
|
||
|
|
|
||
|
|
reset2 := WithEnv("TEST_VAR", "value2")
|
||
|
|
assert.Equal(t, "value2", os.Getenv("TEST_VAR"))
|
||
|
|
|
||
|
|
reset2()
|
||
|
|
assert.Equal(t, "value1", os.Getenv("TEST_VAR"))
|
||
|
|
|
||
|
|
reset1()
|
||
|
|
assert.Empty(t, os.Getenv("TEST_VAR"))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestResetEnv(t *testing.T) {
|
||
|
|
// Définir quelques variables de test
|
||
|
|
testVars := map[string]string{
|
||
|
|
"APP_ENV": "test",
|
||
|
|
"APP_PORT": "9000",
|
||
|
|
"JWT_SECRET": "test-secret",
|
||
|
|
"DATABASE_URL": "postgres://test",
|
||
|
|
"REDIS_URL": "redis://test",
|
||
|
|
"CORS_ALLOWED_ORIGINS": "http://test",
|
||
|
|
"RATE_LIMIT_LIMIT": "200",
|
||
|
|
"RATE_LIMIT_WINDOW": "120",
|
||
|
|
"LOG_LEVEL": "ERROR",
|
||
|
|
}
|
||
|
|
|
||
|
|
// Sauvegarder les valeurs originales
|
||
|
|
originalValues := make(map[string]string)
|
||
|
|
for key := range testVars {
|
||
|
|
originalValues[key] = os.Getenv(key)
|
||
|
|
}
|
||
|
|
defer func() {
|
||
|
|
// Restaurer les valeurs originales
|
||
|
|
for key, value := range originalValues {
|
||
|
|
if value != "" {
|
||
|
|
os.Setenv(key, value)
|
||
|
|
} else {
|
||
|
|
os.Unsetenv(key)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}()
|
||
|
|
|
||
|
|
// Définir les variables de test
|
||
|
|
for key, value := range testVars {
|
||
|
|
os.Setenv(key, value)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Vérifier qu'elles sont définies
|
||
|
|
for key, expectedValue := range testVars {
|
||
|
|
assert.Equal(t, expectedValue, os.Getenv(key), "Variable %s should be set", key)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Réinitialiser
|
||
|
|
ResetEnv()
|
||
|
|
|
||
|
|
// Vérifier qu'elles sont toutes unset
|
||
|
|
for key := range testVars {
|
||
|
|
assert.Empty(t, os.Getenv(key), "Variable %s should be unset", key)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestWithMultipleEnv(t *testing.T) {
|
||
|
|
// Sauvegarder les valeurs originales
|
||
|
|
originalValues := make(map[string]string)
|
||
|
|
testKeys := []string{"TEST_VAR1", "TEST_VAR2", "TEST_VAR3"}
|
||
|
|
for _, key := range testKeys {
|
||
|
|
originalValues[key] = os.Getenv(key)
|
||
|
|
}
|
||
|
|
defer func() {
|
||
|
|
// Restaurer les valeurs originales
|
||
|
|
for key, value := range originalValues {
|
||
|
|
if value != "" {
|
||
|
|
os.Setenv(key, value)
|
||
|
|
} else {
|
||
|
|
os.Unsetenv(key)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}()
|
||
|
|
|
||
|
|
// Définir quelques variables avec des valeurs existantes
|
||
|
|
os.Setenv("TEST_VAR1", "original1")
|
||
|
|
os.Unsetenv("TEST_VAR2")
|
||
|
|
os.Unsetenv("TEST_VAR3")
|
||
|
|
|
||
|
|
// Utiliser WithMultipleEnv
|
||
|
|
reset := WithMultipleEnv(map[string]string{
|
||
|
|
"TEST_VAR1": "new1",
|
||
|
|
"TEST_VAR2": "new2",
|
||
|
|
"TEST_VAR3": "new3",
|
||
|
|
})
|
||
|
|
defer reset()
|
||
|
|
|
||
|
|
// Vérifier que les nouvelles valeurs sont définies
|
||
|
|
assert.Equal(t, "new1", os.Getenv("TEST_VAR1"))
|
||
|
|
assert.Equal(t, "new2", os.Getenv("TEST_VAR2"))
|
||
|
|
assert.Equal(t, "new3", os.Getenv("TEST_VAR3"))
|
||
|
|
|
||
|
|
// Nettoyer
|
||
|
|
reset()
|
||
|
|
|
||
|
|
// Vérifier que les valeurs originales sont restaurées
|
||
|
|
assert.Equal(t, "original1", os.Getenv("TEST_VAR1"))
|
||
|
|
assert.Empty(t, os.Getenv("TEST_VAR2"))
|
||
|
|
assert.Empty(t, os.Getenv("TEST_VAR3"))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestWithMultipleEnv_Empty(t *testing.T) {
|
||
|
|
// Tester avec une map vide
|
||
|
|
reset := WithMultipleEnv(map[string]string{})
|
||
|
|
require.NotNil(t, reset)
|
||
|
|
|
||
|
|
// La fonction de cleanup devrait fonctionner sans erreur
|
||
|
|
reset()
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestNewTestConfig_Logger(t *testing.T) {
|
||
|
|
config := NewTestConfig(t)
|
||
|
|
require.NotNil(t, config.Logger)
|
||
|
|
|
||
|
|
// Vérifier que le logger fonctionne
|
||
|
|
config.Logger.Info("test log message")
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestNewTestConfig_Isolation(t *testing.T) {
|
||
|
|
// Tester que chaque appel crée une nouvelle instance
|
||
|
|
config1 := NewTestConfig(t)
|
||
|
|
config2 := NewTestConfig(t)
|
||
|
|
|
||
|
|
// Modifier config1
|
||
|
|
config1.AppPort = 9000
|
||
|
|
config1.LogLevel = "ERROR"
|
||
|
|
|
||
|
|
// Vérifier que config2 n'est pas affecté
|
||
|
|
assert.Equal(t, 8080, config2.AppPort)
|
||
|
|
assert.Equal(t, "DEBUG", config2.LogLevel)
|
||
|
|
}
|