From 1e4e813f3ead450eb13137243cad3e7001d7548c Mon Sep 17 00:00:00 2001 From: Karl Cardenas Date: Sun, 19 Nov 2023 10:26:26 -0700 Subject: [PATCH] test: region validation flags --- cmd/clean.go | 38 +++++++++++++++++++---------- cmd/clean_test.go | 62 ++++++++++++++++++++++++++++++++++++++++++++--- cmd/root.go | 4 +-- 3 files changed, 86 insertions(+), 18 deletions(-) diff --git a/cmd/clean.go b/cmd/clean.go index 58ebd9a..71ce230 100644 --- a/cmd/clean.go +++ b/cmd/clean.go @@ -43,20 +43,21 @@ var ( ) func init() { - rootCmd.AddCommand(cleanCmd) + rootCmd.AddCommand(CleanCmd) } -var cleanCmd = &cobra.Command{ +var CleanCmd = &cobra.Command{ Use: "clean", Short: "Removes all former versions of AWS lambdas except for the $LATEST version", Long: `Removes all former versions of AWS lambdas except for the $LATEST version. The user also has the ability specify n-? version to retain.`, - Run: func(cmd *cobra.Command, args []string) { + RunE: func(cmd *cobra.Command, args []string) error { ctx = context.Background() var ( awsEnvRegion string awsEnvProfile string config cliConfig + err error ) config = GlobalCliConfig @@ -64,12 +65,19 @@ var cleanCmd = &cobra.Command{ awsEnvProfile = os.Getenv("AWS_PROFILE") if *config.RegionFlag == "" { if awsEnvRegion != "" { - *config.RegionFlag = validateRegion(f, awsEnvRegion) + *config.RegionFlag, err = validateRegion(f, awsEnvRegion) + if err != nil { + return err + } + } else { - log.Fatal("ERROR: Missing region flag and AWS_DEFAULT_REGION env variable. Please use -r and provide a valid AWS region.") + return errors.New("missing region flag and AWS_DEFAULT_REGION env variable. Please use -r and provide a valid AWS region") } } else { - *config.RegionFlag = validateRegion(f, *config.RegionFlag) + *config.RegionFlag, err = validateRegion(f, *config.RegionFlag) + if err != nil { + return err + } } // Create a list of AWS Configurations Options @@ -115,15 +123,15 @@ var cleanCmd = &cobra.Command{ cfg, err := awsConfig.LoadDefaultConfig(ctx, awsConfigOptions...) if err != nil { - log.Fatal("ERROR ESTABLISHING AWS SESSION") + return errors.New("ERROR ESTABLISHING AWS SESSION") } creds, err := cfg.Credentials.Retrieve(ctx) if err != nil { - log.Fatal("ERROR RETRIEVING AWS CREDENTIALS") + return errors.New("ERROR RETRIEVING AWS CREDENTIALS") } if creds.Expired() { - log.Fatal("AWS CREDENTIALS EXPIRED") + return errors.New("AWS CREDENTIALS EXPIRED") } // svc = lambda.NewFromConfig(cfg) @@ -133,8 +141,10 @@ var cleanCmd = &cobra.Command{ }) err = executeClean(&config) if err != nil { - log.Fatal("ERROR: ", err) + return err } + + return err }, } @@ -542,8 +552,9 @@ func getLambdaStorage(list []types.FunctionConfiguration) (int64, error) { } // Validates that the user passed in a valid AWS Region -func validateRegion(f embed.FS, input string) string { +func validateRegion(f embed.FS, input string) (string, error) { var output string + var err error rawData, _ := f.ReadFile(regionFile) regionsList := strings.Split(string(rawData), " ") @@ -555,10 +566,11 @@ func validateRegion(f embed.FS, input string) string { } if output == "" { - log.Fatal(input, " is an invalid AWS region. If this is an error please") + err = errors.New(input + " is an invalid AWS region. If this is an error please report it") + return "", err } - return output + return output, err } // calculateFileSize returns the size of a file in bytes. The function takes a cliConfig parameter to determine the number format type to return diff --git a/cmd/clean_test.go b/cmd/clean_test.go index 36b742c..45f5d3c 100644 --- a/cmd/clean_test.go +++ b/cmd/clean_test.go @@ -6,6 +6,7 @@ package cmd import ( "bytes" "embed" + "os" "regexp" "sort" "testing" @@ -54,14 +55,58 @@ func TestGetLambdaStorage(t *testing.T) { func TestValidateRegion(t *testing.T) { input := "us-east-1" want := "us-east-1" - got := validateRegion(rr, input) - - if got != want { + got, err := validateRegion(rr, input) + if err != nil || got != want { t.Fatalf("The provided input is valid, %s is a valid region", input) } } +func TestValidateRegionWithEnv(t *testing.T) { + + os.Setenv("AWS_DEFAULT_REGION", "not-valid") + expectedErr := "not-valid is an invalid AWS region. If this is an error please report it" + err := CleanCmd.RunE(CleanCmd, []string{"--profile", "default", "--retain", "2", "--dry-run"}) + if err == nil || err.Error() != expectedErr { + t.Fatalf("Expected an error to be returned but received %v", err.Error()) + } + + os.Setenv("AWS_DEFAULT_REGION", "") + expectedErr = "missing region flag and AWS_DEFAULT_REGION env variable. Please use -r and provide a valid AWS region" + err = CleanCmd.RunE(CleanCmd, []string{"--profile", "default", "--retain", "2", "--dry-run"}) + if err == nil || err.Error() != expectedErr { + t.Fatalf("Expected an error to be returned but received %v", err.Error()) + } + + // Set rootCmd to use the region flag + RegionFlag = "not-valid" + expectedErr = "not-valid is an invalid AWS region. If this is an error please report it" + err = CleanCmd.RunE(CleanCmd, []string{"--profile", "default", "--retain", "2", "--dry-run"}) + if err == nil || err.Error() != expectedErr { + t.Fatalf("Expected an error to be returned but received %v", err.Error()) + } + +} + +func TestValidateRegionWithFlag(t *testing.T) { + + expectedErr := "missing region flag and AWS_DEFAULT_REGION env variable. Please use -r and provide a valid AWS region" + err := CleanCmd.RunE(CleanCmd, []string{"--profile", "default", "--region", "not-valid", "--retain", "2", "--dry-run"}) + if err == nil || err.Error() != expectedErr { + t.Fatalf("Expected an error to be returned but received %v", err.Error()) + } +} + +func TestInvalidRegion(t *testing.T) { + input := "not-valid" + want := "not-valid is an invalid AWS region. If this is an error please report it" + got, err := validateRegion(rr, input) + + if err == nil || err.Error() != want { + t.Fatalf("The provided input is invalid, %s is not a valid region", got) + } +} + func TestGetLambdasToDeleteList(t *testing.T) { var ( retainNumber int8 = 2 @@ -358,3 +403,14 @@ func TestDisplayDuration(t *testing.T) { } buf.Reset() } + +func TestEnteryMissingEnvRegion(t *testing.T) { + + expectedErr := "Missing region flag and AWS_DEFAULT_REGION env variable. Please use -r and provide a valid AWS region" + + err := CleanCmd.RunE(CleanCmd, []string{"--profile", "default", "--retain", "2", "--dry-run"}) + if err == nil && err.Error() != expectedErr { + t.Fatalf("Expected an error to be returned but received %v", err.Error()) + } + +} diff --git a/cmd/root.go b/cmd/root.go index bcf1dfb..a6d4bb3 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -77,8 +77,8 @@ func init() { rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "Set to true to enable debugging (bool)") rootCmd.PersistentFlags().BoolVarP(&DryRun, "dryrun", "d", false, "Executes a dry run (bool)") rootCmd.PersistentFlags().BoolVarP(&SizeIEC, "size-iec", "i", false, "Displays file sizes in IEC units (bool)") - cleanCmd.Flags().Int8VarP(&Retain, "count", "c", 1, "The number of versions to retain from $LATEST-(n)") - cleanCmd.Flags().BoolVarP(&SkipAliases, "skip-aliases", "s", false, "Skip trying to delete versions with aliases attached") + CleanCmd.Flags().Int8VarP(&Retain, "count", "c", 1, "The number of versions to retain from $LATEST-(n)") + CleanCmd.Flags().BoolVarP(&SkipAliases, "skip-aliases", "s", false, "Skip trying to delete versions with aliases attached") GlobalCliConfig.RegionFlag = &RegionFlag GlobalCliConfig.ProfileFlag = &ProfileFlag