From 51b1e86ad91d37d85ef398e069bfa34aec7c14ad Mon Sep 17 00:00:00 2001 From: Ian Howell Date: Wed, 15 Jan 2020 12:28:29 -0600 Subject: [PATCH] Fix flag loading order Prior to this change, flags associated with the Config object were being read too early (that is, before cobra had parsed them). They are now read just in time for command execution. Change-Id: I0affca9429867eb25db40f8323403e0f6976b47b --- cmd/root.go | 5 +++-- cmd/root_test.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index ef846170a..4e0d0f137 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -38,14 +38,15 @@ func NewRootCmd(out io.Writer) (*cobra.Command, *environment.AirshipCTLSettings, SilenceUsage: true, PersistentPreRun: func(cmd *cobra.Command, args []string) { log.Init(settings.Debug, cmd.OutOrStderr()) + + // Load or Initialize airship Config + settings.InitConfig() }, } rootCmd.SetOutput(out) rootCmd.AddCommand(NewVersionCommand()) settings.InitFlags(rootCmd) - // Load or Initialize airship Config - settings.InitConfig() return rootCmd, settings, nil } diff --git a/cmd/root_test.go b/cmd/root_test.go index a87d11583..6f56cdf95 100644 --- a/cmd/root_test.go +++ b/cmd/root_test.go @@ -1,9 +1,11 @@ package cmd_test import ( + "bytes" "testing" "github.com/spf13/cobra" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "opendev.org/airship/airshipctl/cmd" @@ -36,6 +38,41 @@ func TestRoot(t *testing.T) { } } +func TestFlagLoading(t *testing.T) { + tests := []struct { + name string + args []string + expected string + }{ + { + name: "default, no flags", + args: []string{}, + expected: "$HOME/.airship/config", + }, + { + name: "alternate airshipconfig", + args: []string{"--airshipconf", "/custom/path/to/airshipconfig"}, + expected: "/custom/path/to/airshipconfig", + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(subTest *testing.T) { + // We don't care about the output of this test, so toss + // it into a thowaway &bytes.buffer{} + rootCmd, settings, err := cmd.NewRootCmd(&bytes.Buffer{}) + require.NoError(t, err) + rootCmd.SetArgs(tt.args) + + err = rootCmd.Execute() + require.NoError(t, err) + + assert.Equal(t, settings.AirshipConfigPath(), tt.expected) + }) + } +} + func getVanillaRootCmd(t *testing.T) *cobra.Command { t.Helper() rootCmd, _, err := cmd.NewRootCmd(nil)