mockenv.go 3.9 KB

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