Skip to content

Commit

Permalink
Add tests for env provider
Browse files Browse the repository at this point in the history
  • Loading branch information
Milad Abbasi committed Jan 20, 2021
1 parent f9bb8b3 commit 0b93e12
Show file tree
Hide file tree
Showing 3 changed files with 201 additions and 8 deletions.
19 changes: 11 additions & 8 deletions env.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,16 @@ func (ep *EnvProvider) Name() string {

// Fill takes struct fields and fills their values
func (ep *EnvProvider) Fill(in *Input) error {
content, err := ep.envMap()
envs, err := ep.envMap()
if err != nil {
return err
}
if len(envs) == 0 {
return nil
}

for _, f := range in.Fields {
value, err := ep.provide(content, f.Tags.Config, f.Path)
value, err := ep.provide(envs, f.Tags.Config, f.Path)
if err != nil {
if errors.Is(err, ErrKeyNotFound) {
continue
Expand All @@ -84,15 +87,15 @@ func (ep *EnvProvider) Fill(in *Input) error {
func (ep *EnvProvider) envMap() (map[string]string, error) {
envs := envFromOS()
var fileEnvs map[string]string
var err error

if ep.Source != "" {
var err error
fileEnvs, err = envFromFile(ep.Source)
}
if err != nil {
notExistsErr := errors.Is(err, os.ErrNotExist)
if (notExistsErr && ep.Required) || !notExistsErr {
return nil, err
if err != nil {
notExistsErr := errors.Is(err, os.ErrNotExist)
if (notExistsErr && ep.Required) || !notExistsErr {
return nil, err
}
}
}

Expand Down
188 changes: 188 additions & 0 deletions env_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
package gonfig

import (
"fmt"
"os"
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestNewEnvProvider(t *testing.T) {
ep := NewEnvProvider()
require.NotNil(t, ep)
assert.Equal(t, "", ep.EnvPrefix)
assert.Equal(t, true, ep.SnakeCase)
assert.Equal(t, true, ep.UpperCase)
assert.Equal(t, "_", ep.FieldSeparator)
assert.Equal(t, "", ep.Source)
assert.Equal(t, false, ep.Required)
}

func TestEnvProvider_Name(t *testing.T) {
ep := NewEnvProvider()
assert.Equal(t, "ENV provider", ep.Name())
}

func TestEnvProvider_Fill(t *testing.T) {
t.Run("env file existence", func(t *testing.T) {
s := struct{}{}
in, err := NewInput(&s)
require.NoError(t, err)
require.NotNil(t, in)
ep := EnvProvider{
Source: "NotExistingFile",
Required: false,
}

err = ep.Fill(in)
assert.NoError(t, err)

ep.Required = true
err = ep.Fill(in)
assert.Error(t, err)
})

t.Run("prioritize OS envs", func(t *testing.T) {
os.Clearenv()
err := os.Setenv("OS", "env from os")
require.NoError(t, err)

s := struct {
Priority string
Os string
File string
}{}
in, err := NewInput(&s)
require.NoError(t, err)
require.NotNil(t, in)
ep := NewEnvProvider()
ep.Source = "testdata/.env"

err = ep.Fill(in)
require.NoError(t, err)
assert.Equal(t, "FILE", s.Priority)
assert.Equal(t, "env from os", s.Os)
assert.Equal(t, "env from file", s.File)

err = os.Setenv("PRIORITY", "OS")
require.NoError(t, err)

err = ep.Fill(in)
require.NoError(t, err)
assert.Equal(t, "OS", s.Priority)
})

t.Run("should be set", func(t *testing.T) {
os.Clearenv()

s := struct {
Env1 string
Env2 int
Env3 bool
}{}
for i, v := range []string{"env1", "2", "false"} {
err := os.Setenv("ENV"+fmt.Sprint(i+1), v)
require.NoError(t, err)
}

in, err := NewInput(&s)
require.NoError(t, err)
require.NotNil(t, in)
ep := NewEnvProvider()

err = ep.Fill(in)
require.NoError(t, err)

for _, f := range in.Fields {
assert.True(t, f.IsSet)
}
})

t.Run("env prefix", func(t *testing.T) {
os.Clearenv()
err := os.Setenv("APP_Env", "env")
require.NoError(t, err)

s := struct {
Env string
}{}

in, err := NewInput(&s)
require.NoError(t, err)
require.NotNil(t, in)
ep := EnvProvider{
EnvPrefix: "APP_",
}

err = ep.Fill(in)
require.NoError(t, err)
assert.Equal(t, "env", s.Env)
})

t.Run("snake case", func(t *testing.T) {
os.Clearenv()
err := os.Setenv("Env_Var", "env")
require.NoError(t, err)

s := struct {
EnvVar string
}{}

in, err := NewInput(&s)
require.NoError(t, err)
require.NotNil(t, in)
ep := EnvProvider{
SnakeCase: true,
}

err = ep.Fill(in)
require.NoError(t, err)
assert.Equal(t, "env", s.EnvVar)
})

t.Run("upper case", func(t *testing.T) {
os.Clearenv()
err := os.Setenv("ENV", "env")
require.NoError(t, err)

s := struct {
Env string
}{}

in, err := NewInput(&s)
require.NoError(t, err)
require.NotNil(t, in)
ep := EnvProvider{
UpperCase: true,
}

err = ep.Fill(in)
require.NoError(t, err)
assert.Equal(t, "env", s.Env)
})

t.Run("field separator", func(t *testing.T) {
os.Clearenv()
err := os.Setenv("NestedEnvVar", "env")
require.NoError(t, err)

s := struct {
Nested struct {
EnvVar string
}
}{}

in, err := NewInput(&s)
require.NoError(t, err)
require.NotNil(t, in)
ep := EnvProvider{
FieldSeparator: "",
}

err = ep.Fill(in)
require.NoError(t, err)
assert.Equal(t, "env", s.Nested.EnvVar)
})
}
2 changes: 2 additions & 0 deletions testdata/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
PRIORITY=FILE
FILE="env from file"

0 comments on commit 0b93e12

Please sign in to comment.