feat: add basic config loader
This commit is contained in:
168
config_test.go
Normal file
168
config_test.go
Normal file
@@ -0,0 +1,168 @@
|
||||
package yourconfig_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/kjuulh/yourconfig"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestLoad(t *testing.T) {
|
||||
t.Run("no types", func(t *testing.T) {
|
||||
type Config struct {
|
||||
SomeItem string
|
||||
someOtherItem string
|
||||
someBool bool
|
||||
}
|
||||
|
||||
val, err := yourconfig.Load[Config]()
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Zero(t, val)
|
||||
})
|
||||
|
||||
t.Run("default tag, nothing set, no env set", func(t *testing.T) {
|
||||
type Config struct {
|
||||
SomeItem string `conf:""`
|
||||
someOtherItem string
|
||||
someBool bool
|
||||
}
|
||||
|
||||
val, err := yourconfig.Load[Config]()
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Zero(t, val)
|
||||
})
|
||||
|
||||
t.Run("default tag (required=true), nothing set, no env set, err", func(t *testing.T) {
|
||||
type Config struct {
|
||||
SomeItem string `conf:"required:true"`
|
||||
someOtherItem string
|
||||
someBool bool
|
||||
}
|
||||
|
||||
val, err := yourconfig.Load[Config]()
|
||||
require.Error(t, err)
|
||||
require.Zero(t, val)
|
||||
|
||||
assert.Equal(t, "config failed: field: SomeItem (env=SOME_ITEM) is not set and is required", err.Error())
|
||||
})
|
||||
|
||||
t.Run("default tag (required=false), nothing set, no env set no error", func(t *testing.T) {
|
||||
type Config struct {
|
||||
SomeItem string `conf:"required:false"`
|
||||
someOtherItem string
|
||||
someBool bool
|
||||
}
|
||||
|
||||
val, err := yourconfig.Load[Config]()
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Zero(t, val)
|
||||
})
|
||||
|
||||
t.Run("env tag nothing set, no env set, no error", func(t *testing.T) {
|
||||
type Config struct {
|
||||
SomeItem string `conf:"SOME_ITEM"`
|
||||
someOtherItem string
|
||||
someBool bool
|
||||
}
|
||||
|
||||
val, err := yourconfig.Load[Config]()
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Zero(t, val)
|
||||
})
|
||||
|
||||
t.Run("default tag (required=true), nothing set, no env set, err", func(t *testing.T) {
|
||||
type Config struct {
|
||||
SomeItem string `conf:"SOME_ITEM,required:true"`
|
||||
someOtherItem string
|
||||
someBool bool
|
||||
}
|
||||
|
||||
val, err := yourconfig.Load[Config]()
|
||||
require.Error(t, err)
|
||||
require.Zero(t, val)
|
||||
|
||||
assert.Equal(t, "config failed: field: SomeItem (env=SOME_ITEM) is not set and is required", err.Error())
|
||||
})
|
||||
|
||||
t.Run("default tag (required), nothing set, no env set, err", func(t *testing.T) {
|
||||
type Config struct {
|
||||
SomeItem string `conf:"SOME_ITEM,required"`
|
||||
someOtherItem string
|
||||
someBool bool
|
||||
}
|
||||
|
||||
val, err := yourconfig.Load[Config]()
|
||||
require.Error(t, err)
|
||||
require.Zero(t, val)
|
||||
|
||||
assert.Equal(t, "config failed: field: SomeItem (env=SOME_ITEM) is not set and is required", err.Error())
|
||||
})
|
||||
|
||||
t.Run("default tag private, trying to set, err", func(t *testing.T) {
|
||||
type Config struct {
|
||||
SomeItem string
|
||||
someOtherItem string `conf:"required:true"`
|
||||
someBool bool
|
||||
}
|
||||
|
||||
t.Setenv("SOME_OTHER_ITEM", "unsettable")
|
||||
|
||||
val, err := yourconfig.Load[Config]()
|
||||
require.Error(t, err)
|
||||
require.Zero(t, val)
|
||||
|
||||
assert.Equal(t, "config failed: field: someOtherItem is not settable", err.Error())
|
||||
})
|
||||
|
||||
t.Run("env tag and env set, no error", func(t *testing.T) {
|
||||
type Config struct {
|
||||
SomeItem string `conf:"required:true"`
|
||||
someOtherItem string
|
||||
someBool bool
|
||||
}
|
||||
|
||||
t.Setenv("SOME_ITEM", "some-item")
|
||||
|
||||
val, err := yourconfig.Load[Config]()
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, "some-item", val.SomeItem)
|
||||
})
|
||||
|
||||
t.Run("env tag (different name) and env set, no error", func(t *testing.T) {
|
||||
type Config struct {
|
||||
SomeItem string `conf:"DIFFERENT_NAME,required:true"`
|
||||
someOtherItem string
|
||||
someBool bool
|
||||
}
|
||||
|
||||
t.Setenv("DIFFERENT_NAME", "some-item")
|
||||
|
||||
val, err := yourconfig.Load[Config]()
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, "some-item", val.SomeItem)
|
||||
})
|
||||
|
||||
t.Run("multiple env tag and env set, no error", func(t *testing.T) {
|
||||
type Config struct {
|
||||
SomeItem string `conf:"required:true"`
|
||||
SomeOtherItem string `conf:"required:true"`
|
||||
someBool bool
|
||||
}
|
||||
|
||||
t.Setenv("SOME_ITEM", "some-item")
|
||||
t.Setenv("SOME_OTHER_ITEM", "some-other-item")
|
||||
|
||||
val, err := yourconfig.Load[Config]()
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, "some-item", val.SomeItem)
|
||||
assert.Equal(t, "some-other-item", val.SomeOtherItem)
|
||||
})
|
||||
}
|
Reference in New Issue
Block a user