github.com/hazelops/ize@v1.1.12-0.20230915191306-97d7c0e48f11/internal/commands/aws_profile_test.go (about)

     1  package commands
     2  
     3  import (
     4  	_ "github.com/golang/mock/mockgen/model"
     5  	"github.com/hazelops/ize/internal/config"
     6  	"github.com/spf13/pflag"
     7  	"github.com/spf13/viper"
     8  	"os"
     9  	"path/filepath"
    10  	"reflect"
    11  	"strings"
    12  	"testing"
    13  )
    14  
    15  func TestAWSProfile(t *testing.T) {
    16  	tests := []struct {
    17  		name               string
    18  		args               []string
    19  		wantErr            bool
    20  		wantAWSCredentials string
    21  		env                map[string]string
    22  	}{
    23  		{
    24  			name:               "success (only env)",
    25  			args:               []string{"gen", "aws-profile"},
    26  			env:                map[string]string{"AWS_ACCESS_KEY_ID": "test", "AWS_SECRET_ACCESS_KEY": "test", "AWS_REGION": "us-east-1", "AWS_PROFILE": "test"},
    27  			wantAWSCredentials: "[test]\naws_access_key_id = test\naws_secret_access_key = test\nregion = us-east-1\n\n",
    28  			wantErr:            false,
    29  		},
    30  		{
    31  			name:               "success (only flags)",
    32  			args:               []string{"-r=us-east-2", "-p=test", "gen", "aws-profile"},
    33  			env:                map[string]string{"AWS_ACCESS_KEY_ID": "test", "AWS_SECRET_ACCESS_KEY": "test"},
    34  			wantAWSCredentials: "[test]\naws_access_key_id = test\naws_secret_access_key = test\nregion = us-east-2\n\n",
    35  			wantErr:            false,
    36  		},
    37  		{
    38  			name:               "success (flags and env)",
    39  			args:               []string{"-r=us-west-2", "gen", "aws-profile"},
    40  			env:                map[string]string{"AWS_ACCESS_KEY_ID": "test", "AWS_SECRET_ACCESS_KEY": "test", "AWS_PROFILE": "testnut"},
    41  			wantAWSCredentials: "[testnut]\naws_access_key_id = test\naws_secret_access_key = test\nregion = us-west-2\n\n",
    42  			wantErr:            false,
    43  		},
    44  		{
    45  			name:    "failed (missing aws creds)",
    46  			args:    []string{"gen", "aws-profile"},
    47  			env:     map[string]string{"ENV": "test", "AWS_PROFILE": "test"},
    48  			wantErr: true,
    49  		},
    50  	}
    51  	for _, tt := range tests {
    52  		t.Run(tt.name, func(t *testing.T) {
    53  			viper.Reset()
    54  			// Set env
    55  			for k, v := range tt.env {
    56  				os.Setenv(k, v)
    57  			}
    58  
    59  			temp, err := os.MkdirTemp("", "test")
    60  			if err != nil {
    61  				t.Error(err)
    62  				return
    63  			}
    64  			err = os.Chdir(temp)
    65  			if err != nil {
    66  				t.Error(err)
    67  				return
    68  			}
    69  			err = os.MkdirAll(filepath.Join(temp, ".ize", "env", "test"), 0777)
    70  			if err != nil {
    71  				t.Error(err)
    72  				return
    73  			}
    74  
    75  			os.Setenv("HOME", temp)
    76  
    77  			cfg := new(config.Project)
    78  			cmd := newRootCmd(cfg)
    79  
    80  			cmd.SetArgs(tt.args)
    81  			cmd.PersistentFlags().ParseErrorsWhitelist.UnknownFlags = true
    82  			err = cmd.PersistentFlags().Parse(tt.args)
    83  			if err != nil {
    84  				t.Error(err)
    85  				return
    86  			}
    87  
    88  			cmd.PersistentFlags().VisitAll(func(f *pflag.Flag) {
    89  				if len(f.Value.String()) != 0 {
    90  					_ = viper.BindPFlag(strings.ReplaceAll(f.Name, "-", "_"), cmd.PersistentFlags().Lookup(f.Name))
    91  				}
    92  			})
    93  
    94  			config.InitConfig()
    95  
    96  			err = cmd.Execute()
    97  			if (err != nil) != tt.wantErr {
    98  				t.Errorf("ize gen tfenv error = %v, wantErr %v", err, tt.wantErr)
    99  				return
   100  			}
   101  
   102  			file, err := os.ReadFile(filepath.Join(temp, ".aws", "credentials"))
   103  			if err != nil {
   104  				t.Error(err)
   105  				return
   106  			}
   107  
   108  			if !reflect.DeepEqual(string(file), tt.wantAWSCredentials) {
   109  				t.Errorf("aws credentials = %v, want %v", string(file), tt.wantAWSCredentials)
   110  			}
   111  
   112  			// Unset env
   113  			for k, _ := range tt.env {
   114  				os.Unsetenv(k)
   115  			}
   116  		})
   117  	}
   118  }