get.porter.sh/porter@v1.3.0/pkg/cli/config_test.go (about) 1 package cli 2 3 import ( 4 "context" 5 "os" 6 "testing" 7 8 "get.porter.sh/porter/pkg/config" 9 "github.com/spf13/cobra" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestLoadHierarchicalConfig(t *testing.T) { 15 // Cannot be run in parallel because viper reads directly from env vars 16 buildCommand := func(c *config.Config) *cobra.Command { 17 var buildDriver string 18 cmd := &cobra.Command{} 19 cmd.Flags().StringVar(&c.Data.Verbosity, "verbosity", "info", "verbosity") 20 cmd.Flags().StringVar(&buildDriver, "driver", "", "build driver") 21 cmd.Flag("driver").Annotations = map[string][]string{ 22 "viper-key": {"build-driver"}, 23 } 24 25 cmd.PreRunE = func(cmd *cobra.Command, args []string) error { 26 _, err := c.Load(context.Background(), nil) 27 return err 28 } 29 cmd.RunE = func(cmd *cobra.Command, args []string) error { 30 return nil 31 } 32 c.DataLoader = LoadHierarchicalConfig(cmd) 33 return cmd 34 } 35 36 t.Run("no flag", func(t *testing.T) { 37 c := config.NewTestConfig(t) 38 c.SetHomeDir("/home/myuser/.porter") 39 40 cmd := buildCommand(c.Config) 41 err := cmd.Execute() 42 require.NoError(t, err, "dataloader failed") 43 assert.Equal(t, "info", c.Data.Verbosity, "config.Verbosity was not set correctly") 44 }) 45 46 t.Run("verbosity flag", func(t *testing.T) { 47 c := config.NewTestConfig(t) 48 c.SetHomeDir("/home/myuser/.porter") 49 50 cmd := buildCommand(c.Config) 51 cmd.SetArgs([]string{"--verbosity=warn"}) 52 err := cmd.Execute() 53 54 require.NoError(t, err, "dataloader failed") 55 assert.Equal(t, "warn", c.Data.Verbosity, "config.Verbosity was not set correctly") 56 }) 57 58 t.Run("verbosity flag overrides config", func(t *testing.T) { 59 c := config.NewTestConfig(t) 60 c.SetHomeDir("/home/myuser/.porter") 61 c.TestContext.AddTestFileFromRoot("pkg/config/testdata/config.toml", "/home/myuser/.porter/config.toml") 62 63 cmd := buildCommand(c.Config) 64 cmd.SetArgs([]string{"--verbosity=error"}) 65 err := cmd.Execute() 66 67 require.NoError(t, err, "dataloader failed") 68 assert.Equal(t, "error", c.Data.Verbosity, "config.Verbosity was not set correctly") 69 }) 70 71 t.Run("verbosity env var", func(t *testing.T) { 72 os.Setenv("PORTER_VERBOSITY", "debug") 73 defer os.Unsetenv("PORTER_VERBOSITY") 74 75 c := config.NewTestConfig(t) 76 c.SetHomeDir("/home/myuser/.porter") 77 78 cmd := buildCommand(c.Config) 79 err := cmd.Execute() 80 81 require.NoError(t, err, "dataloader failed") 82 assert.Equal(t, "debug", c.Data.Verbosity, "config.Verbosity was not set correctly") 83 }) 84 85 t.Run("build-driver env var", func(t *testing.T) { 86 os.Setenv("PORTER_BUILD_DRIVER", config.BuildDriverBuildkit) 87 defer os.Unsetenv("PORTER_BUILD_DRIVER") 88 89 c := config.NewTestConfig(t) 90 c.SetHomeDir("/home/myuser/.porter") 91 92 cmd := buildCommand(c.Config) 93 err := cmd.Execute() 94 95 require.NoError(t, err, "dataloader failed") 96 assert.Equal(t, config.BuildDriverBuildkit, c.Data.BuildDriver, "c.Data.BuildDriver was not set correctly") 97 }) 98 99 t.Run("build-driver from config", func(t *testing.T) { 100 os.Unsetenv("PORTER_BUILD_DRIVER") 101 defer os.Unsetenv("PORTER_BUILD_DRIVER") 102 103 c := config.NewTestConfig(t) 104 c.SetHomeDir("/home/myuser/.porter") 105 c.TestContext.AddTestFileFromRoot("pkg/config/testdata/config.toml", "/home/myuser/.porter/config.toml") 106 107 cmd := buildCommand(c.Config) 108 err := cmd.Execute() 109 110 require.NoError(t, err, "dataloader failed") 111 assert.Equal(t, config.BuildDriverBuildkit, c.Data.BuildDriver, "c.Data.BuildDriver was not set correctly") 112 }) 113 114 t.Run("invalid verbosity env var", func(t *testing.T) { 115 os.Setenv("PORTER_VERBOSITY", "blorp") 116 defer os.Unsetenv("PORTER_VERBOSITY") 117 118 c := config.NewTestConfig(t) 119 c.SetHomeDir("/home/myuser/.porter") 120 121 cmd := buildCommand(c.Config) 122 err := cmd.Execute() 123 124 require.NoError(t, err, "dataloader failed") 125 assert.Equal(t, config.LogLevel("info"), c.GetVerbosity(), "config.Verbosity was not set correctly") 126 }) 127 128 t.Run("debug env var overrides config", func(t *testing.T) { 129 os.Setenv("PORTER_VERBOSITY", "error") 130 defer os.Unsetenv("PORTER_VERBOSITY") 131 132 c := config.NewTestConfig(t) 133 c.SetHomeDir("/home/myuser/.porter") 134 c.TestContext.AddTestFileFromRoot("pkg/config/testdata/config.toml", "/home/myuser/.porter/config.toml") 135 136 cmd := buildCommand(c.Config) 137 err := cmd.Execute() 138 139 require.NoError(t, err, "dataloader failed") 140 assert.Equal(t, "error", c.Data.Verbosity, "config.Verbosity should have been set by the env var and not the config") 141 }) 142 143 t.Run("flag overrides debug env var overrides config", func(t *testing.T) { 144 os.Setenv("PORTER_VERBOSITY", "warn") 145 defer os.Unsetenv("PORTER_VERBOSITY") 146 147 c := config.NewTestConfig(t) 148 c.SetHomeDir("/home/myuser/.porter") 149 c.TestContext.AddTestFileFromRoot("pkg/config/testdata/config.toml", "/home/myuser/.porter/config.toml") 150 151 cmd := buildCommand(c.Config) 152 cmd.SetArgs([]string{"--verbosity", "debug"}) 153 err := cmd.Execute() 154 155 require.NoError(t, err, "dataloader failed") 156 assert.Equal(t, "debug", c.Data.Verbosity, "config.Verbosity should have been set by the flag and not the env var or config") 157 }) 158 }