package database import ( "context" "os" "strings" "testing" "time" ) func TestConfigFromEnv(t *testing.T) { keys := []string{ "GO_OMNI_DB_DRIVER", "GO_OMNI_DB_DSN", "GO_OMNI_DB_MAX_OPEN_CONNS", "GO_OMNI_DB_MAX_IDLE_CONNS", "GO_OMNI_DB_CONN_MAX_LIFETIME", "GO_OMNI_DB_CONN_MAX_IDLE_TIME", "GO_OMNI_DB_PING_TIMEOUT", } for _, key := range keys { t.Setenv(key, "") _ = os.Unsetenv(key) } t.Setenv("GO_OMNI_DB_DSN", "root:secret@tcp(127.0.0.1:3306)/demo") t.Setenv("GO_OMNI_DB_MAX_OPEN_CONNS", "20") t.Setenv("GO_OMNI_DB_MAX_IDLE_CONNS", "8") t.Setenv("GO_OMNI_DB_CONN_MAX_LIFETIME", "2m") t.Setenv("GO_OMNI_DB_PING_TIMEOUT", "750ms") cfg, err := ConfigFromEnv("") if err != nil { t.Fatal(err) } if cfg.Driver != "mysql" || cfg.DSN == "" || cfg.MaxOpenConns != 20 || cfg.MaxIdleConns != 8 || cfg.ConnMaxLifetime != 2*time.Minute || cfg.PingTimeout != 750*time.Millisecond { t.Fatalf("unexpected config: %+v", cfg) } } func TestConfigFromEnvRejectsInvalidValues(t *testing.T) { t.Setenv("GO_OMNI_DB_DSN", "demo") t.Setenv("GO_OMNI_DB_MAX_OPEN_CONNS", "bad") if _, err := ConfigFromEnv(""); err == nil || !strings.Contains(err.Error(), "MAX_OPEN_CONNS") { t.Fatalf("expected invalid pool limit error, got %v", err) } t.Setenv("GO_OMNI_DB_MAX_OPEN_CONNS", "2") t.Setenv("GO_OMNI_DB_MAX_IDLE_CONNS", "3") if _, err := ConfigFromEnv(""); err == nil || !strings.Contains(err.Error(), "max idle") { t.Fatalf("expected pool relationship error, got %v", err) } t.Setenv("GO_OMNI_DB_MAX_IDLE_CONNS", "1") t.Setenv("GO_OMNI_DB_PING_TIMEOUT", "0s") if _, err := ConfigFromEnv(""); err == nil || !strings.Contains(err.Error(), "timeouts") { t.Fatalf("expected timeout error, got %v", err) } } func TestOpenValidatesBeforeLoadingDriver(t *testing.T) { _, err := Open(context.Background(), Config{Driver: "", DSN: "demo"}) if err == nil || !strings.Contains(err.Error(), "driver") { t.Fatalf("expected driver validation error, got %v", err) } }