| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- // 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)
- }
|