mock_env.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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. sf.SetAll()
  29. return sf
  30. }
  31. // Парсит полученный текст .env для установки переменных окружения.
  32. func (sf *MockEnv) parseEnv() {
  33. lstStr := strings.SplitSeq(sf.strEnv.String(), "\n")
  34. for val := range lstStr {
  35. pair := strings.TrimSuffix(val, "\r")
  36. if pair == "" {
  37. continue
  38. }
  39. if strings.HasPrefix(val, "#") {
  40. continue
  41. }
  42. sf.parseEnvStr(defs.TxtFix(pair))
  43. }
  44. }
  45. // Парсит строку окружения.
  46. func (sf *MockEnv) parseEnvStr(pair defs.ITxtFix) {
  47. lstPair := strings.Split(pair.String(), "=")
  48. helpers.If(len(lstPair) < 2).Hassert("MockEnv.parseEnvStr(): pair(%v) not have =", []any{pair})
  49. key := lstPair[0]
  50. helpers.If(key == "").Hassert("MockEnv.parseEnvStr(): in pair(%v) key is empty", []any{pair})
  51. lstVal := lstPair[1:]
  52. val := ""
  53. for _, val_ := range lstVal {
  54. val += val_ + "="
  55. }
  56. val = strings.TrimSuffix(val, "=")
  57. helpers.If(val == "").Hassert("MockEnv.parseEnvStr(): in pair(%v) val is empty", []any{pair})
  58. sf.dictEnv[defs.ATxt(key)] = defs.TxtFix(val)
  59. }
  60. // Читает файл переменных окружения.
  61. func (sf *MockEnv) readEnv() {
  62. binEnv, err := os.ReadFile(sf.fileName.String())
  63. helpers.If(err != nil).Hassert("MockEnv.readEnv(): in read %v, err=\n\t%v", []any{sf.fileName, err})
  64. sf.strEnv = defs.TxtFix(defs.ATxt(binEnv))
  65. }
  66. // Устанавливает текущий путь относительно проекта в dev.
  67. func (sf *MockEnv) setPath() {
  68. dir, err := os.Getwd()
  69. helpers.If(err != nil).Hassert("MockEnv.setPath(): in get PWD, err=\n\t%v", []any{err})
  70. lstDir := strings.Split(dir, "/")
  71. var pwd strings.Builder
  72. fileName := ""
  73. isFind := defs.Bool(false)
  74. for _, point := range lstDir {
  75. _, _ = pwd.WriteString(point + "/")
  76. fileName = pwd.String() + ".env"
  77. _, err := os.ReadFile(fileName)
  78. if err == nil {
  79. isFind = true
  80. break
  81. }
  82. }
  83. helpers.If(!isFind).Hassert("MockEnv.setPath(): not find file .env", []any{})
  84. sf.pwd = defs.TxtFix(pwd.String() + "/bin_dev")
  85. err = os.MkdirAll(sf.pwd.String(), 0750)
  86. helpers.If(err != nil).Hassert("MockEnv.setPath(): in create PWD, err=\n\t%v", []any{err})
  87. err = os.Chdir(sf.pwd.String())
  88. helpers.If(err != nil).Hassert("MockEnv.setPath(): in set cwd(%v), err=\n\t%v", []any{sf.pwd, err})
  89. sf.fileName = defs.TxtFix(fileName)
  90. }
  91. // Pwd -- возвращает текущий рабочий каталог процесса.
  92. func (sf *MockEnv) Pwd() defs.ITxtFix {
  93. return sf.pwd
  94. }
  95. // SetAll -- поднимает все переменные окружения.
  96. func (sf *MockEnv) SetAll() {
  97. sf.ResetAll()
  98. for key, val := range sf.dictEnv {
  99. sf.Reset(defs.TxtFix("key"))
  100. err := os.Setenv(string(key), val.String())
  101. helpers.If(err != nil).Hassert("MockEnv.SetAll(): in set env %v on key %v, err=\n\t%v", []any{key, val, err})
  102. }
  103. }
  104. // ResetAll -- сбрасывает все переменные окружения.
  105. func (sf *MockEnv) ResetAll() {
  106. for key := range sf.dictEnv {
  107. sf.Reset(defs.TxtFix(key))
  108. }
  109. }
  110. // Reset -- сбрасывает конкретный ключ.
  111. func (sf *MockEnv) Reset(key defs.ITxtFix) {
  112. helpers.If(key.Get() == "").Hassert("MockEnv.Reset(): key is empty", []any{})
  113. err := os.Unsetenv(key.String())
  114. helpers.If(err != nil).Hassert("MockEnv.Reset(): in reset env %v, err=\n\t%v", []any{key, err})
  115. }