package config import ( "os" "strings" "testing" ) // ClearEnvForTest unsets every variable in the process environment // for the rest of the test, so a test sees only the variables it sets // itself, not whatever the developer's shell exports. When the test // ends it leaves the environment exactly as it found it: each variable // it unset is put back, and any variable added since is removed. func ClearEnvForTest(t *testing.T) { t.Helper() present := make(map[string]bool) for _, entry := range os.Environ() { key, _, _ := strings.Cut(entry, "=") present[key] = true // t.Setenv registers the restore; the Unsetenv after it is // what makes the key absent, since a key set to the empty // string is still present, and godotenv will not overwrite a // present key. t.Setenv(key, "") err := os.Unsetenv(key) if err != nil { t.Fatalf("unsetting %s: %v", key, err) } } // A variable the test adds other than through t.Setenv, as loading // a .env file does, has no restore of its own. t.Cleanup(func() { for _, entry := range os.Environ() { key, _, _ := strings.Cut(entry, "=") if present[key] { continue } err := os.Unsetenv(key) if err != nil { t.Errorf("unsetting %s: %v", key, err) } } }) }