mock_env.go 4.3 KB

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