mock_env.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // package mock_env -- обеспечивает мок-окружение для тестов
  2. package mock_env
  3. import (
  4. "os"
  5. "strings"
  6. . "gitp78su.ipnodns.ru/svi/kern/v2/kc/helpers"
  7. )
  8. // MockEnv -- объект мок-окружения
  9. type MockEnv struct {
  10. dictEnv map[string]string // Словарь переменных окружения
  11. pwd string // Текущий путь процесса
  12. fileName string // Полный путь к .env файлу
  13. strEnv string // Фактическое содержимое .env файла
  14. }
  15. // MakeEnv -- возвращает новое мок-окружение
  16. func MakeEnv() *MockEnv {
  17. sf := &MockEnv{
  18. dictEnv: map[string]string{},
  19. }
  20. sf.setPath()
  21. sf.readEnv()
  22. err := sf.parseEnv()
  23. Hassert(err == nil, "MakeEnv(): parseEnv, err=\n\t%v", err)
  24. err = sf.SetAll()
  25. Hassert(err == nil, "MakeEnv(): SetAll, err=\n\t%v", err)
  26. return sf
  27. }
  28. // Парсит полученный текст .env для установки переменных окружения
  29. func (sf *MockEnv) parseEnv() error {
  30. lstStr := strings.Split(sf.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 := sf.parseEnvStr(pair)
  40. Hassert(err == nil, "MockEnv.parseEnv(): in parse str(%v), err=\n\t%w", pair, err)
  41. }
  42. return nil
  43. }
  44. // Парсит строку окружения
  45. func (sf *MockEnv) parseEnvStr(pair string) error {
  46. lstPair := strings.Split(pair, "=")
  47. Hassert(len(lstPair) >= 2, "MockEnv.parseEnvStr(): pair(%v) not have =", pair)
  48. key := lstPair[0]
  49. Hassert(key != "", "MockEnv.parseEnvStr(): 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. Hassert(val != "", "MockEnv.parseEnvStr(): in pair(%v) val is empty", pair)
  57. sf.dictEnv[key] = val
  58. return nil
  59. }
  60. // Читает файл переменных окружения
  61. func (sf *MockEnv) readEnv() {
  62. binEnv, err := os.ReadFile(sf.fileName)
  63. Hassert(err == nil, "MockEnv.readEnv(): in read %v, err=\n\t%v", sf.fileName, err)
  64. sf.strEnv = string(binEnv)
  65. }
  66. // Устанавливает текущий путь относительно проекта в dev
  67. func (sf *MockEnv) setPath() {
  68. dir, err := os.Getwd()
  69. Hassert(err == nil, "MockEnv.setPath(): 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. Hassert(isFind, "MockEnv.setPath(): not find file .env")
  84. sf.pwd = pwd + "/bin_dev"
  85. err = os.MkdirAll(sf.pwd, 0750)
  86. Hassert(err == nil, "MockEnv.setPath(): in create PWD, err=\n\t%v", err)
  87. err = os.Chdir(sf.pwd)
  88. Hassert(err == nil, "MockEnv.setPath(): in set cwd(%v), err=\n\t%v", sf.pwd, err)
  89. sf.fileName = fileName
  90. }
  91. // Pwd -- возвращает текущий рабочий каталог процесса
  92. func (sf *MockEnv) Pwd() string {
  93. return sf.pwd
  94. }
  95. // SetAll -- поднимает все переменные окружения
  96. func (sf *MockEnv) SetAll() error {
  97. sf.ResetAll()
  98. for key, val := range sf.dictEnv {
  99. sf.Reset("key")
  100. err := os.Setenv(key, val)
  101. Hassert(err == nil, "MockEnv.SetAll(): in set env %v on key %v, err=\n\t%v", key, val, err)
  102. }
  103. return nil
  104. }
  105. // ResetAll -- сбрасывает все переменные окружения
  106. func (sf *MockEnv) ResetAll() {
  107. for key := range sf.dictEnv {
  108. sf.Reset(key)
  109. }
  110. }
  111. // Reset -- сбрасывает конкретный ключ
  112. func (sf *MockEnv) Reset(key string) {
  113. Hassert(key != "", "MockEnv.Reset(): key is empty")
  114. err := os.Unsetenv(key)
  115. Hassert(err == nil, "MockEnv.Reset(): in reset env %v, err=\n\t%v", key, err)
  116. }