mock_env.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // package mock_env -- обеспечивает мок-окружение для тестов
  2. package mock_env
  3. import (
  4. "os"
  5. "strings"
  6. . "wartank/pkg/helpers"
  7. )
  8. // МокОкружение -- объект мок-окружения
  9. type МокОкружение struct {
  10. dictEnv map[string]string // Словарь переменных окружения
  11. pwd string // Текущий путь процесса
  12. fileName string // Полный путь к .env файлу
  13. strEnv string // Фактическое содержимое .env файла
  14. }
  15. // СделатьОкружение -- возвращает новое мок-окружение
  16. func СделатьОкружение() *МокОкружение {
  17. sf := &МокОкружение{
  18. dictEnv: map[string]string{},
  19. }
  20. sf.путьУст()
  21. sf.прочитатьЕнв()
  22. err := sf.parseEnv()
  23. Паника(err == nil, "СделатьОкружение(): parseEnv, err=\n\t%v", err)
  24. err = sf.SetAll()
  25. Паника(err == nil, "СделатьОкружение(): SetAll, err=\n\t%v", err)
  26. return sf
  27. }
  28. // Парсит полученный текст .env для установки переменных окружения
  29. func (сам *МокОкружение) parseEnv() error {
  30. lstStr := strings.Split(сам.strEnv, "\n")
  31. for _, val := range lstStr {
  32. pair := strings.TrimSuffix(val, "\r")
  33. if pair == "" {
  34. continue
  35. }
  36. if strings.HasPrefix(val, "#") {
  37. continue
  38. }
  39. err := сам.парситьЕнвСтр(pair)
  40. Паника(err == nil, "МокОкружение.parseEnv(): in parse str(%v), err=\n\t%w", pair, err)
  41. }
  42. return nil
  43. }
  44. // Парсит строку окружения
  45. func (сам *МокОкружение) парситьЕнвСтр(pair string) error {
  46. lstPair := strings.Split(pair, "=")
  47. Паника(len(lstPair) >= 2, "МокОкружение.парситьЕнвСтр(): pair(%v) not have =", pair)
  48. key := lstPair[0]
  49. Паника(key != "", "МокОкружение.парситьЕнвСтр(): in pair(%v) key is empty", pair)
  50. lstVal := lstPair[1:]
  51. val := ""
  52. for _, val_ := range lstVal {
  53. val += val_ + "="
  54. }
  55. val = strings.TrimSuffix(val, "=")
  56. Паника(val != "", "МокОкружение.parseEnvStr(): in pair(%v) val is empty", pair)
  57. сам.dictEnv[key] = val
  58. return nil
  59. }
  60. // Читает файл переменных окружения
  61. func (сам *МокОкружение) прочитатьЕнв() {
  62. binEnv, err := os.ReadFile(сам.fileName)
  63. Паника(err == nil, "МокОкружение.прочитатьЕнв(): in read %v, err=\n\t%v", сам.fileName, err)
  64. сам.strEnv = string(binEnv)
  65. }
  66. // Устанавливает текущий путь относительно проекта в dev
  67. func (сам *МокОкружение) путьУст() {
  68. dir, err := os.Getwd()
  69. Паника(err == nil, "МокОкружение.путьУст(): in get PWD, err=\n\t%v", err)
  70. lstDir := strings.Split(dir, "/")
  71. pwd := ""
  72. fileName := ""
  73. isFind := false
  74. for _, point := range lstDir {
  75. pwd += point + "/"
  76. fileName = pwd + ".env"
  77. _, err := os.ReadFile(fileName)
  78. if err == nil {
  79. isFind = true
  80. break
  81. }
  82. }
  83. Паника(isFind, "МокОкружение.путьУст(): not find file .env")
  84. сам.pwd = pwd + "/bin_dev"
  85. _ = os.MkdirAll(сам.pwd, 0755)
  86. err = os.Chdir(сам.pwd)
  87. Паника(err == nil, "МокОкружение.путьУст(): in set cwd(%v), err=\n\t%v", сам.pwd, err)
  88. сам.fileName = fileName
  89. }
  90. // Pwd -- возвращает текущий рабочий каталог процесса
  91. func (сам *МокОкружение) Pwd() string {
  92. return сам.pwd
  93. }
  94. // SetAll -- поднимает все переменные окружения
  95. func (сам *МокОкружение) SetAll() error {
  96. сам.СброситьВсё()
  97. for key, val := range сам.dictEnv {
  98. сам.Reset("key")
  99. err := os.Setenv(key, val)
  100. Паника(err == nil, "МокОкружение.SetAll(): in set env %v on key %v, err=\n\t%v", key, val, err)
  101. }
  102. return nil
  103. }
  104. // СброситьВсё -- сбрасывает все переменные окружения
  105. func (сам *МокОкружение) СброситьВсё() {
  106. for key := range сам.dictEnv {
  107. сам.Reset(key)
  108. }
  109. }
  110. // Reset -- сбрасывает конкретный ключ
  111. func (сам *МокОкружение) Reset(key string) {
  112. Паника(key != "", "МокОкружение.Reset(): key is empty")
  113. err := os.Unsetenv(key)
  114. Паника(err == nil, "МокОкружение.Reset(): in reset env %v, err=\n\t%v", key, err)
  115. }