// package mock_env -- обеспечивает мок-окружение для тестов package mock_env import ( "os" "strings" . "wartank/pkg/helpers" ) // МокОкружение -- объект мок-окружения type МокОкружение struct { dictEnv map[string]string // Словарь переменных окружения pwd string // Текущий путь процесса fileName string // Полный путь к .env файлу strEnv string // Фактическое содержимое .env файла } // СделатьОкружение -- возвращает новое мок-окружение func СделатьОкружение() *МокОкружение { sf := &МокОкружение{ dictEnv: map[string]string{}, } sf.путьУст() sf.прочитатьЕнв() err := sf.parseEnv() Паника(err == nil, "СделатьОкружение(): parseEnv, err=\n\t%v", err) err = sf.SetAll() Паника(err == nil, "СделатьОкружение(): SetAll, err=\n\t%v", err) return sf } // Парсит полученный текст .env для установки переменных окружения func (сам *МокОкружение) parseEnv() error { lstStr := strings.Split(сам.strEnv, "\n") for _, val := range lstStr { pair := strings.TrimSuffix(val, "\r") if pair == "" { continue } if strings.HasPrefix(val, "#") { continue } err := сам.парситьЕнвСтр(pair) Паника(err == nil, "МокОкружение.parseEnv(): in parse str(%v), err=\n\t%w", pair, err) } return nil } // Парсит строку окружения func (сам *МокОкружение) парситьЕнвСтр(pair string) error { lstPair := strings.Split(pair, "=") Паника(len(lstPair) >= 2, "МокОкружение.парситьЕнвСтр(): pair(%v) not have =", pair) key := lstPair[0] Паника(key != "", "МокОкружение.парситьЕнвСтр(): in pair(%v) key is empty", pair) lstVal := lstPair[1:] val := "" for _, val_ := range lstVal { val += val_ + "=" } val = strings.TrimSuffix(val, "=") Паника(val != "", "МокОкружение.parseEnvStr(): in pair(%v) val is empty", pair) сам.dictEnv[key] = val return nil } // Читает файл переменных окружения func (сам *МокОкружение) прочитатьЕнв() { binEnv, err := os.ReadFile(сам.fileName) Паника(err == nil, "МокОкружение.прочитатьЕнв(): in read %v, err=\n\t%v", сам.fileName, err) сам.strEnv = string(binEnv) } // Устанавливает текущий путь относительно проекта в dev func (сам *МокОкружение) путьУст() { dir, err := os.Getwd() Паника(err == nil, "МокОкружение.путьУст(): in get PWD, err=\n\t%v", err) lstDir := strings.Split(dir, "/") pwd := "" fileName := "" isFind := false for _, point := range lstDir { pwd += point + "/" fileName = pwd + ".env" _, err := os.ReadFile(fileName) if err == nil { isFind = true break } } Паника(isFind, "МокОкружение.путьУст(): not find file .env") сам.pwd = pwd + "/bin_dev" _ = os.MkdirAll(сам.pwd, 0755) err = os.Chdir(сам.pwd) Паника(err == nil, "МокОкружение.путьУст(): in set cwd(%v), err=\n\t%v", сам.pwd, err) сам.fileName = fileName } // Pwd -- возвращает текущий рабочий каталог процесса func (сам *МокОкружение) Pwd() string { return сам.pwd } // SetAll -- поднимает все переменные окружения func (сам *МокОкружение) SetAll() error { сам.СброситьВсё() for key, val := range сам.dictEnv { сам.Reset("key") err := os.Setenv(key, val) Паника(err == nil, "МокОкружение.SetAll(): in set env %v on key %v, err=\n\t%v", key, val, err) } return nil } // СброситьВсё -- сбрасывает все переменные окружения func (сам *МокОкружение) СброситьВсё() { for key := range сам.dictEnv { сам.Reset(key) } } // Reset -- сбрасывает конкретный ключ func (сам *МокОкружение) Reset(key string) { Паника(key != "", "МокОкружение.Reset(): key is empty") err := os.Unsetenv(key) Паника(err == nil, "МокОкружение.Reset(): in reset env %v, err=\n\t%v", key, err) }