Add some config tests

This commit is contained in:
Christian Claus 2018-05-22 22:08:14 +02:00
parent bddbd497c8
commit d6d8dad80a

126
app/config_test.go Normal file
View file

@ -0,0 +1,126 @@
package app
import (
"reflect"
"testing"
"github.com/spf13/viper"
"path/filepath"
"os"
"time"
"strconv"
"bytes"
"io/ioutil"
"encoding/json"
)
func TestParseConfig(t *testing.T) {
viper.Reset()
tmpDir := filepath.Join(os.TempDir(), "dave__"+strconv.FormatInt(time.Now().UnixNano(), 10))
os.Mkdir(tmpDir, 0700)
defer os.RemoveAll(tmpDir)
tests := []struct {
name string
want *Config
}{
{"default", cfg(t, tmpDir, `
address: 1.2.3.4
port: 42
prefix: /oh-de-lally
tls:
keyFile: `+ tmpDir+ `/robin.pem
certFile: `+ tmpDir+ `/tuck.pem
dir: /sherwood/forest
realm: uk
users:
lj:
password: 123
subdir: /littlejohn
srf:
password: 234
subdir: /sheriff
log:
error: true
`)},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := ParseConfig(); !reflect.DeepEqual(got, tt.want) {
gotJson, _ := json.Marshal(got)
wantJson, _ := json.Marshal(tt.want)
t.Errorf("ParseConfig() = %s, want %s", gotJson, wantJson)
}
})
}
}
func cfg(t *testing.T, tmpDir string, content string) *Config {
viper.SetConfigType("yaml")
var yamlCfg = []byte(content)
err := ioutil.WriteFile(filepath.Join(tmpDir, "config.yaml"), yamlCfg, 0600)
if err != nil {
t.Errorf("error writing test config. error = %v", err)
}
err = viper.ReadConfig(bytes.NewBuffer(yamlCfg))
if err != nil {
t.Errorf("error reading test config. error = %v", err)
}
var cfg = &Config{}
viper.Unmarshal(&cfg)
// let viper read from the tmp directory fist
viper.AddConfigPath(tmpDir)
// add dummy cert and key file
_, err = os.OpenFile(filepath.Join(tmpDir, "robin.pem"), os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
t.Errorf("error creating key file. error = %v", err)
return nil
}
_, err = os.OpenFile(filepath.Join(tmpDir, "tuck.pem"), os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
t.Errorf("error creating cert file. error = %v", err)
return nil
}
viper.AddConfigPath(tmpDir)
return cfg
}
func TestSetDefaults(t *testing.T) {
viper.Reset()
tests := []struct {
name string
value interface{}
}{
{"Address", "127.0.0.1"},
{"Port", "8000"},
{"Prefix", ""},
{"Dir", "/tmp"},
{"TLS", nil},
{"Realm", "dave"},
{"Log.Error", true},
{"Log.Create", false},
{"Log.Read", false},
{"Log.Update", false},
{"Log.Delete", false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
viper.Reset()
setDefaults()
if viper.Get(tt.name) != tt.value {
t.Errorf("Default Keys doesn't fit. name = %v, want = %v", tt.name, tt.value)
}
})
}
}