github.com/jfrog/jfrog-cli-platform-services@v1.2.0/commands/add_secret_cmd_test.go (about)

     1  package commands
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/jfrog/jfrog-cli-platform-services/model"
    12  )
    13  
    14  type addSecretAssertFunc func(t *testing.T, manifestBefore, manifestAfter *model.Manifest)
    15  
    16  func TestAddSecretCmd(t *testing.T) {
    17  	tests := []struct {
    18  		name           string
    19  		commandArgs    []string
    20  		secretName     string
    21  		secretValue    string
    22  		secretPassword string
    23  		wantErr        string
    24  		assert         addSecretAssertFunc
    25  		patchManifest  func(mf *model.Manifest)
    26  	}{
    27  		{
    28  			name:           "add",
    29  			secretName:     "sec-1",
    30  			secretValue:    "val-1",
    31  			secretPassword: secretPassword,
    32  			patchManifest: func(mf *model.Manifest) {
    33  				mf.Secrets = model.Secrets{
    34  					"sec-2": mustEncryptSecret(t, "val-2"),
    35  				}
    36  			},
    37  			assert: assertSecrets(model.Secrets{
    38  				"sec-1": "val-1",
    39  				"sec-2": "val-2",
    40  			}),
    41  		},
    42  		{
    43  			name:           "add with nil manifest",
    44  			secretName:     "sec-1",
    45  			secretValue:    "val-1",
    46  			secretPassword: secretPassword,
    47  			patchManifest: func(mf *model.Manifest) {
    48  				mf.Secrets = nil
    49  			},
    50  			assert: assertSecrets(model.Secrets{
    51  				"sec-1": "val-1",
    52  			}),
    53  		},
    54  		{
    55  			name:           "add with different password",
    56  			secretName:     "sec-1",
    57  			secretValue:    "val-1",
    58  			secretPassword: secretPassword,
    59  			patchManifest: func(mf *model.Manifest) {
    60  				mf.Secrets["sec-2"] = mustEncryptSecret(t, "val-2", "other-password")
    61  			},
    62  			wantErr: "others secrets are encrypted with a different password, please use the same one",
    63  		},
    64  		{
    65  			name:           "edit secret",
    66  			secretName:     "sec-1",
    67  			secretValue:    "val-1",
    68  			secretPassword: secretPassword,
    69  			commandArgs:    []string{fmt.Sprintf("--%s", model.FlagEdit)},
    70  			patchManifest: func(mf *model.Manifest) {
    71  				mf.Secrets = model.Secrets{
    72  					"sec-1": mustEncryptSecret(t, "val-1-before"),
    73  				}
    74  			},
    75  			assert: assertSecrets(model.Secrets{"sec-1": "val-1"}),
    76  		},
    77  		{
    78  			name:           "fails if the secret exists",
    79  			secretName:     "sec-1",
    80  			secretValue:    "val-1",
    81  			secretPassword: secretPassword,
    82  			patchManifest: func(mf *model.Manifest) {
    83  				mf.Secrets = model.Secrets{
    84  					"sec-1": mustEncryptSecret(t, "val-1-before"),
    85  				}
    86  			},
    87  			wantErr: "sec-1 already exists, use --edit to overwrite",
    88  		},
    89  		{
    90  			name:    "fails if missing name",
    91  			wantErr: "Wrong number of arguments (0).",
    92  		},
    93  	}
    94  
    95  	for _, tt := range tests {
    96  		t.Run(tt.name, func(t *testing.T) {
    97  			workerDir, workerName := prepareWorkerDirForTest(t)
    98  
    99  			runCmd := createCliRunner(t, GetInitCommand(), GetAddSecretCommand())
   100  
   101  			err := runCmd("worker", "init", "GENERIC_EVENT", workerName)
   102  			require.NoError(t, err)
   103  
   104  			if tt.patchManifest != nil {
   105  				patchManifest(t, tt.patchManifest)
   106  			}
   107  
   108  			if tt.secretPassword != "" {
   109  				err = os.Setenv(model.EnvKeySecretsPassword, tt.secretPassword)
   110  				require.NoError(t, err)
   111  				t.Cleanup(func() {
   112  					_ = os.Unsetenv(model.EnvKeySecretsPassword)
   113  				})
   114  			}
   115  
   116  			if tt.secretValue != "" {
   117  				err = os.Setenv(model.EnvKeyAddSecretValue, tt.secretValue)
   118  				require.NoError(t, err)
   119  				t.Cleanup(func() {
   120  					_ = os.Unsetenv(model.EnvKeyAddSecretValue)
   121  				})
   122  			}
   123  
   124  			manifestBefore, err := model.ReadManifest(workerDir)
   125  			require.NoError(t, err)
   126  
   127  			cmd := []string{"worker", "add-secret"}
   128  			cmd = append(cmd, tt.commandArgs...)
   129  
   130  			if tt.secretName != "" {
   131  				cmd = append(cmd, tt.secretName)
   132  			}
   133  
   134  			err = runCmd(cmd...)
   135  
   136  			if tt.wantErr == "" {
   137  				require.NoError(t, err)
   138  				manifestAfter, err := model.ReadManifest(workerDir)
   139  				assert.NoError(t, err)
   140  				tt.assert(t, manifestBefore, manifestAfter)
   141  			} else {
   142  				assert.EqualError(t, err, tt.wantErr)
   143  			}
   144  		})
   145  	}
   146  }
   147  
   148  func assertSecrets(wantSecrets model.Secrets) addSecretAssertFunc {
   149  	return func(t *testing.T, manifestBefore, manifestAfter *model.Manifest) {
   150  		require.Equalf(t, len(wantSecrets), len(manifestAfter.Secrets), "Invalid secrets length")
   151  		require.NoError(t, manifestAfter.DecryptSecrets())
   152  		assert.Equalf(t, wantSecrets, manifestAfter.Secrets, "Secrets mismatch")
   153  	}
   154  }