github.com/awesome-flow/flow@v0.0.3-0.20190918184116-508d75d68a2c/pkg/cfg/env_provider_test.go (about)

     1  package cfg
     2  
     3  import (
     4  	"reflect"
     5  	"sort"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/awesome-flow/flow/pkg/types"
    10  )
    11  
    12  func TestEnvProviderSetUp(t *testing.T) {
    13  	tests := []struct {
    14  		name         string
    15  		regs         []string
    16  		wantRegistry map[string]types.Value
    17  		wantRegs     []string
    18  	}{
    19  		{
    20  			"Empty set",
    21  			[]string{},
    22  			map[string]types.Value{},
    23  			[]string{},
    24  		},
    25  		{
    26  			"Simple KV pair not preffixed with FLOW_",
    27  			[]string{"FOO=BAR"},
    28  			map[string]types.Value{},
    29  			[]string{},
    30  		},
    31  		{
    32  			"Simple KV pair preffixed with FLOW_",
    33  			[]string{"FLOW_FOO=BAR"},
    34  			map[string]types.Value{"foo": "BAR"},
    35  			[]string{"foo"},
    36  		},
    37  		{
    38  			"A KV with nested key",
    39  			[]string{"FLOW_FOO_BAR_BAZ=moo"},
    40  			map[string]types.Value{"foo.bar.baz": "moo"},
    41  			[]string{"foo.bar.baz"},
    42  		},
    43  		{
    44  			"A value with underscore",
    45  			[]string{"FLOW_FOO=bar_baz_moo"},
    46  			map[string]types.Value{"foo": "bar_baz_moo"},
    47  			[]string{"foo"},
    48  		},
    49  		{
    50  			"A key with double underscore",
    51  			[]string{"FLOW_FOO__BAR=moo__baz"},
    52  			map[string]types.Value{"foo_bar": "moo__baz"},
    53  			[]string{"foo_bar"},
    54  		},
    55  	}
    56  
    57  	t.Parallel()
    58  
    59  	for _, testCase := range tests {
    60  		t.Run(testCase.name, func(t *testing.T) {
    61  			// Redefined function
    62  			oldEnvVars := envVars
    63  			envVars = func() []string { return testCase.regs }
    64  
    65  			repo := NewRepository()
    66  			prov, err := NewEnvProvider(repo, 0)
    67  			if err != nil {
    68  				t.Fatalf("Failed to initialize a new env provider: %s", err)
    69  			}
    70  			if err := prov.SetUp(repo); err != nil {
    71  				t.Fatalf("Failed to set up env provider: %s", err)
    72  			}
    73  
    74  			gotRegs := flattenRepo(repo)
    75  			for _, k := range testCase.wantRegs {
    76  				provs, ok := gotRegs[k]
    77  				if !ok {
    78  					t.Fatalf("Failed to find a registration for key %q: got regs: %#v", k, gotRegs)
    79  				}
    80  				if !reflect.DeepEqual(provs, []Provider{prov}) {
    81  					t.Fatalf("Unexpected provider list for key %q: %#v, want: %#v", k, provs, []Provider{prov})
    82  				}
    83  				delete(gotRegs, k)
    84  			}
    85  			if len(gotRegs) > 0 {
    86  				extraKeys := make([]string, 0, len(gotRegs))
    87  				for k := range gotRegs {
    88  					extraKeys = append(extraKeys, k)
    89  				}
    90  				sort.Strings(extraKeys)
    91  				t.Fatalf("Unexpected registration keys: %s", strings.Join(extraKeys, ", "))
    92  			}
    93  
    94  			if !reflect.DeepEqual(prov.registry, testCase.wantRegistry) {
    95  				t.Fatalf("Unexpected state for CliProvider.registry: want: %#v, got: %#v", testCase.wantRegistry, prov.registry)
    96  			}
    97  
    98  			envVars = oldEnvVars
    99  		})
   100  	}
   101  }