package env import ( "os" "testing" ) func TestBool(t *testing.T) { tests := []struct { name string key string value string defaultValue bool expected bool shouldSet bool }{ // Truthy values {"true lowercase", "TEST_BOOL", "true", false, true, true}, {"true uppercase", "TEST_BOOL", "TRUE", false, true, true}, {"true mixed case", "TEST_BOOL", "TrUe", false, true, true}, {"t", "TEST_BOOL", "t", false, true, true}, {"T", "TEST_BOOL", "T", false, true, true}, {"yes", "TEST_BOOL", "yes", false, true, true}, {"YES", "TEST_BOOL", "YES", false, true, true}, {"y", "TEST_BOOL", "y", false, true, true}, {"Y", "TEST_BOOL", "Y", false, true, true}, {"on", "TEST_BOOL", "on", false, true, true}, {"ON", "TEST_BOOL", "ON", false, true, true}, {"1", "TEST_BOOL", "1", false, true, true}, {"enable", "TEST_BOOL", "enable", false, true, true}, {"ENABLE", "TEST_BOOL", "ENABLE", false, true, true}, {"enabled", "TEST_BOOL", "enabled", false, true, true}, {"ENABLED", "TEST_BOOL", "ENABLED", false, true, true}, {"active", "TEST_BOOL", "active", false, true, true}, {"ACTIVE", "TEST_BOOL", "ACTIVE", false, true, true}, {"affirmative", "TEST_BOOL", "affirmative", false, true, true}, {"AFFIRMATIVE", "TEST_BOOL", "AFFIRMATIVE", false, true, true}, // Falsy values {"false lowercase", "TEST_BOOL", "false", true, false, true}, {"false uppercase", "TEST_BOOL", "FALSE", true, false, true}, {"false mixed case", "TEST_BOOL", "FaLsE", true, false, true}, {"f", "TEST_BOOL", "f", true, false, true}, {"F", "TEST_BOOL", "F", true, false, true}, {"no", "TEST_BOOL", "no", true, false, true}, {"NO", "TEST_BOOL", "NO", true, false, true}, {"n", "TEST_BOOL", "n", true, false, true}, {"N", "TEST_BOOL", "N", true, false, true}, {"off", "TEST_BOOL", "off", true, false, true}, {"OFF", "TEST_BOOL", "OFF", true, false, true}, {"0", "TEST_BOOL", "0", true, false, true}, {"disable", "TEST_BOOL", "disable", true, false, true}, {"DISABLE", "TEST_BOOL", "DISABLE", true, false, true}, {"disabled", "TEST_BOOL", "disabled", true, false, true}, {"DISABLED", "TEST_BOOL", "DISABLED", true, false, true}, {"inactive", "TEST_BOOL", "inactive", true, false, true}, {"INACTIVE", "TEST_BOOL", "INACTIVE", true, false, true}, {"negative", "TEST_BOOL", "negative", true, false, true}, {"NEGATIVE", "TEST_BOOL", "NEGATIVE", true, false, true}, // Whitespace handling {"true with spaces", "TEST_BOOL", " true ", false, true, true}, {"false with spaces", "TEST_BOOL", " false ", true, false, true}, // Default values {"not set default true", "TEST_BOOL_NOTSET", "", true, true, false}, {"not set default false", "TEST_BOOL_NOTSET", "", false, false, false}, // Invalid values should return default {"invalid value default true", "TEST_BOOL", "invalid", true, true, true}, {"invalid value default false", "TEST_BOOL", "invalid", false, false, true}, {"empty string default true", "TEST_BOOL", "", true, true, true}, {"empty string default false", "TEST_BOOL", "", false, false, true}, {"random text default true", "TEST_BOOL", "maybe", true, true, true}, {"random text default false", "TEST_BOOL", "maybe", false, false, true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if tt.shouldSet { os.Setenv(tt.key, tt.value) defer os.Unsetenv(tt.key) } result := Bool(tt.key, tt.defaultValue) if result != tt.expected { t.Errorf("Bool() = %v, want %v", result, tt.expected) } }) } }