package config_test import ( "FamilyHub/src/config" "os" "testing" "github.com/stretchr/testify/assert" ) type EnvFixture struct { backup map[string]string } func NewEnvFixture() *EnvFixture { env := make(map[string]string) for _, e := range os.Environ() { pair := split(e) env[pair[0]] = pair[1] } // полностью чистое окружение os.Clearenv() return &EnvFixture{backup: env} } func (e *EnvFixture) Restore() { os.Clearenv() for key, val := range e.backup { _ = os.Setenv(key, val) } } func split(s string) [2]string { var p [2]string for i := 0; i < len(s); i++ { if s[i] == '=' { p[0] = s[:i] p[1] = s[i+1:] return p } } return p } func MustSet(env map[string]string) { for k, v := range env { _ = os.Setenv(k, v) } } func MustUnset(keys ...string) { for _, k := range keys { _ = os.Unsetenv(k) } } func TestConfigLoad_Table(t *testing.T) { env := NewEnvFixture() defer env.Restore() tests := []struct { name string env map[string]string want config.Config error bool }{ { name: "ok - values set", env: map[string]string{"BOT_TOKEN": "abc", "DB_PATH": "db.sqlite"}, want: config.Config{BotToken: "abc", DBConnectionString: "db.sqlite"}, }, { name: "fail - missing token", env: map[string]string{}, // ничего нет error: true, }, { name: "default DB path applied", env: map[string]string{"BOT_TOKEN": "xyz"}, error: true, }, } for _, tc := range tests { testCase := tc t.Run(testCase.name, func(t *testing.T) { t.Parallel() os.Clearenv() MustSet(testCase.env) cfg, err := config.Load() if testCase.error { assert.Error(t, err) return } assert.NoError(t, err) assert.Equal(t, testCase.want.BotToken, cfg.BotToken) assert.Equal(t, testCase.want.DBConnectionString, cfg.DBConnectionString) }) } }