mockenv.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package mockenv
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "os"
  6. "strings"
  7. )
  8. /*
  9. Мок-объект для инициализации переменных окружения
  10. */
  11. var (
  12. vars = []string{
  13. "STAGE",
  14. }
  15. path, _ = os.Getwd()
  16. selfPath = `/wartank/` // Путь к своему проекту
  17. fileEnv = ".env"
  18. )
  19. // MockEnv -- мок-объект для переменных окружения
  20. type MockEnv struct {
  21. dict map[string]string
  22. }
  23. // NewMockEnv -- возвращает новый *MockEnv
  24. func NewMockEnv() *MockEnv {
  25. sf := &MockEnv{
  26. dict: make(map[string]string),
  27. }
  28. return sf
  29. }
  30. // InitFake -- инициализация фейковыми данными
  31. func (sf *MockEnv) InitFake() {
  32. sf.dict = make(map[string]string)
  33. i := 0
  34. for _, var_ := range vars {
  35. os.Unsetenv(var_)
  36. strVal := fmt.Sprint(i)
  37. os.Setenv(var_, strVal)
  38. if var_ == "STAGE" {
  39. os.Unsetenv(var_)
  40. os.Setenv(var_, "local")
  41. }
  42. sf.dict[var_] = strVal
  43. i++
  44. }
  45. }
  46. // InitLocal -- читает из локального окружения файл, заполняет переменные
  47. func (sf *MockEnv) InitLocal() error {
  48. strData, err := sf.readFile()
  49. if err != nil {
  50. return fmt.Errorf("MockEnv.InitLocal(): при чтении файла, err=\n\t%w", err)
  51. }
  52. dict, err := sf.getPairs(strData)
  53. if err != nil {
  54. return fmt.Errorf("MockEnv.InitLocal(): при получении пар ключ:значение, err=\n\t%w", err)
  55. }
  56. sf.initEnv(dict)
  57. sf.dict = dict
  58. sf.checkStage()
  59. return nil
  60. }
  61. // Проверяет наличие поля STAGE
  62. func (sf *MockEnv) checkStage() {
  63. stage, ok := sf.dict["STAGE"]
  64. if !ok {
  65. panic(fmt.Errorf("MockEnv.checkStage(): не установлена переменная STAGE"))
  66. }
  67. if stage != "local" {
  68. panic(fmt.Errorf("MockEnv.checkStage(): не локальное окружение, STAGE=%q", stage))
  69. }
  70. }
  71. // Инициализирует все заданные переменные окружения
  72. func (sf *MockEnv) initEnv(mapEnv map[string]string) {
  73. // Здесь не должен быть nil НИКОГДА
  74. for key, value := range mapEnv {
  75. os.Unsetenv(key)
  76. os.Setenv(key, value)
  77. }
  78. }
  79. // Готовит словарь значений
  80. func (sf *MockEnv) getPairs(strData string) (map[string]string, error) {
  81. lstData := strings.Split(strData, "\n")
  82. mapEnv := make(map[string]string)
  83. for _, line := range lstData {
  84. if line == "" {
  85. continue
  86. }
  87. lstPart := strings.Split(line, `="`)
  88. if len(lstPart) != 2 {
  89. return nil, fmt.Errorf("MockEnv.getPairs(): в параметре %q неправильный формат", line)
  90. }
  91. key := lstPart[0]
  92. if key == "" {
  93. return nil, fmt.Errorf("MockEnv.getPairs(): пустой ключ в строке %q", line)
  94. }
  95. value := lstPart[1]
  96. value = value[:len(value)-1]
  97. if value == "" {
  98. return nil, fmt.Errorf("MockEnv.getPairs(): пустое значение в строке %q", line)
  99. }
  100. mapEnv[key] = value
  101. }
  102. if len(mapEnv) == 0 {
  103. return nil, fmt.Errorf("MockEnv.getPairs(): len dict == 0")
  104. }
  105. return mapEnv, nil
  106. }
  107. // Читает файл окружения
  108. func (sf *MockEnv) readFile() (string, error) {
  109. if !strings.Contains(path, selfPath) {
  110. return "", fmt.Errorf("MockEnv.readFile(): неправильный путь проекта")
  111. }
  112. pt := path
  113. lstPath := strings.Split(pt, selfPath)
  114. if len(lstPath) != 2 {
  115. return "", fmt.Errorf("MockEnv.readFile(): плохой путь к файлу окружения %q", path)
  116. }
  117. pt = lstPath[0]
  118. fileName := pt + selfPath + fileEnv
  119. binData, err := ioutil.ReadFile(fileName)
  120. if err != nil {
  121. return "", fmt.Errorf("MockEnv.readFile(): при чтении файла %q .env, err=%w", fileName, err)
  122. }
  123. return string(binData), nil
  124. }
  125. // Unset -- удаляет все переменные окружения сервиса
  126. func (sf *MockEnv) Unset() {
  127. for key := range sf.dict {
  128. os.Unsetenv(key)
  129. }
  130. }