From ae5e324be8078927bf088bc9dae37189a6ecea6f Mon Sep 17 00:00:00 2001 From: Jesse Hallam Date: Fri, 13 Apr 2018 10:56:09 -0400 Subject: MM-9977: test config.SetDefaults leaves nothing nil (#8610) * MM-9977: test config.SetDefaults leaves nothing nil * clarify test default config test cases * comment re: allowing nil slice * extend config SetDefaults to handle partially initialized configs --- model/config_test.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'model/config_test.go') diff --git a/model/config_test.go b/model/config_test.go index 1f917af27..b7533145b 100644 --- a/model/config_test.go +++ b/model/config_test.go @@ -4,11 +4,57 @@ package model import ( + "fmt" + "reflect" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +func TestConfigDefaults(t *testing.T) { + t.Parallel() + + t.Run("somewhere nil when uninitialized", func(t *testing.T) { + c := Config{} + require.False(t, checkNowhereNil(t, "config", c)) + }) + + t.Run("nowhere nil when initialized", func(t *testing.T) { + c := Config{} + c.SetDefaults() + require.True(t, checkNowhereNil(t, "config", c)) + }) + + t.Run("nowhere nil when partially initialized", func(t *testing.T) { + var recursivelyUninitialize func(*Config, string, reflect.Value) + recursivelyUninitialize = func(config *Config, name string, v reflect.Value) { + if v.Type().Kind() == reflect.Ptr { + // Set every pointer we find in the tree to nil + v.Set(reflect.Zero(v.Type())) + require.True(t, v.IsNil()) + + // SetDefaults on the root config should make it non-nil, otherwise + // it means that SetDefaults isn't being called recursively in + // all cases. + config.SetDefaults() + if assert.False(t, v.IsNil(), "%s should be non-nil after SetDefaults()", name) { + recursivelyUninitialize(config, fmt.Sprintf("(*%s)", name), v.Elem()) + } + + } else if v.Type().Kind() == reflect.Struct { + for i := 0; i < v.NumField(); i++ { + recursivelyUninitialize(config, fmt.Sprintf("%s.%s", name, v.Type().Field(i).Name), v.Field(i)) + } + } + } + + c := Config{} + c.SetDefaults() + recursivelyUninitialize(&c, "config", reflect.ValueOf(&c).Elem()) + }) +} + func TestConfigDefaultFileSettingsDirectory(t *testing.T) { c1 := Config{} c1.SetDefaults() -- cgit v1.2.3-1-g7c22