goviper-go

Handling Viper Config File Path During Go Tests


So I have a pretty basic configuration with Viper reading a .env file from my base directory. I fatal kill the process if there's no .env file. All goes well when running my app normally. When I run my tests with go test -v ./.., the test framework seems to step into each file's directory, and calls my config init() function each time, so the viper.AddConfigPath(".") is pointing to the wrong location.

this is my directory structure:

/
  /restapi
    items.go
    items_test.go
  /util
    env.go
  main.go
  .env

env.go

package util

imports...

// global variables available via util package
var (
  Port     int
  DbURI    string
)

func init() {
  viper.SetDefault(PORT, 8080)
  viper.SetConfigFile(".env")
  viper.AddConfigPath(".")
  viper.AutomaticEnv()

  fmt.Println("---------to see in test printout")
  cwd, _ := os.Getwd()
  fmt.Println(cwd)
  fmt.Println("---------")

  if err := viper.ReadInConfig(); err != nil {
    log.Fatal("no environment file!")
  }

  Port = viper.GetInt("PORT")
  DbURI = viper.GetString("DB_URI")
}

Every package basically relies on my util package and this init function therefore runs for every test. Is there some way to have viper always pull the .env file from the base directory even when there are tests running? I've tried a few different AddConfigPath() calls. Kinda new to Go. Or is this structure setup for environment variables not going to work since it fails my tests each time?


Solution

  • So apparently the viper.SetConfigFile() call does not respect the viper.AddConfigPath() call... I modified this to using viper.SetConfigName(".env") and it would actually pick up the calls to AddConfigPath, so I could then add config paths for the current directory and parent.