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  }