From e43d27958d14063c4afb55ee912192f34cbd50a8 Mon Sep 17 00:00:00 2001 From: keven1024 Date: Sat, 27 Dec 2025 11:18:45 +0800 Subject: [PATCH] feat(utils): enhance InitEnv function to support multiple config types and add unit tests for environment initialization --- pkg/utils/env.go | 6 +++--- pkg/utils/go.mod | 15 +++++++++------ pkg/utils/go.sum | 15 ++++++--------- pkg/utils/test/env_test.go | 39 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 18 deletions(-) create mode 100644 pkg/utils/test/env_test.go diff --git a/pkg/utils/env.go b/pkg/utils/env.go index d4b8f57..86ae50c 100644 --- a/pkg/utils/env.go +++ b/pkg/utils/env.go @@ -19,6 +19,9 @@ func InitEnv(props EnvOption) { } envOnce.Do(func() { v = viper.New() + for _, viperConfigType := range props.ConfigType { + v.SetConfigType(viperConfigType) + } if props.ConfigData != nil { v.ReadConfig(props.ConfigData) return @@ -26,9 +29,6 @@ func InitEnv(props EnvOption) { for _, name := range props.ConfigName { v.SetConfigName(name) } - for _, viperConfigType := range props.ConfigType { - v.SetConfigType(viperConfigType) - } v.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) for _, path := range props.ConfigPath { v.AddConfigPath(path) diff --git a/pkg/utils/go.mod b/pkg/utils/go.mod index 4677590..39850f5 100644 --- a/pkg/utils/go.mod +++ b/pkg/utils/go.mod @@ -2,21 +2,23 @@ module pkg/utils go 1.25.5 -toolchain go1.24.11 - require ( github.com/hibiken/asynq v0.25.1 github.com/redis/go-redis/v9 v9.17.2 github.com/spf13/viper v1.21.0 + github.com/stretchr/testify v1.11.1 ) require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/google/go-cmp v0.7.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect @@ -25,8 +27,9 @@ require ( github.com/spf13/pflag v1.0.10 // indirect github.com/subosito/gotenv v1.6.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/text v0.28.0 // indirect - golang.org/x/time v0.8.0 // indirect - google.golang.org/protobuf v1.35.2 // indirect + golang.org/x/sys v0.36.0 // indirect + golang.org/x/text v0.29.0 // indirect + golang.org/x/time v0.13.0 // indirect + google.golang.org/protobuf v1.36.9 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/pkg/utils/go.sum b/pkg/utils/go.sum index 83dc511..9ccc88f 100644 --- a/pkg/utils/go.sum +++ b/pkg/utils/go.sum @@ -10,7 +10,7 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hibiken/asynq v0.25.1 h1:phj028N0nm15n8O2ims+IvJ2gz4k2auvermngh9JhTw= @@ -38,19 +38,16 @@ github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3A github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= -golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= -golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= -google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= +google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/pkg/utils/test/env_test.go b/pkg/utils/test/env_test.go new file mode 100644 index 0000000..8efb705 --- /dev/null +++ b/pkg/utils/test/env_test.go @@ -0,0 +1,39 @@ +package test + +import ( + "bytes" + "testing" + + "pkg/utils" + + "github.com/stretchr/testify/assert" +) + +func TestInitEnvAndGetEnv(t *testing.T) { + jsonData := ` +{ + "test": { + "value": "foobar", + "empty": null + } +} +` + props := utils.EnvOption{ + ConfigData: bytes.NewBufferString(jsonData), + ConfigType: []string{"json"}, + } + utils.InitEnv(props) + + // GetEnv应能拿到值 + val := utils.GetEnv("test.value") + assert.Equal(t, "foobar", val) + + // GetEnv拿不到值时应该返回空字符串 + emptyVal := utils.GetEnv("test.empty") + assert.Equal(t, "", emptyVal) + + // GetEnv拿不到值且有默认值时应该返回默认值 + notExistKey := "test.not_exist" + valWithDefault := utils.GetEnvWithDefault(notExistKey, "defaultbar") + assert.Equal(t, "defaultbar", valWithDefault) +}