github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/command/var_put_test.go (about) 1 package command 2 3 import ( 4 "encoding/json" 5 "strings" 6 "testing" 7 8 "github.com/hashicorp/nomad/api" 9 "github.com/hashicorp/nomad/ci" 10 "github.com/mitchellh/cli" 11 "github.com/posener/complete" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestVarPutCommand_Implements(t *testing.T) { 16 ci.Parallel(t) 17 var _ cli.Command = &VarPutCommand{} 18 } 19 func TestVarPutCommand_Fails(t *testing.T) { 20 ci.Parallel(t) 21 t.Run("bad_args", func(t *testing.T) { 22 ci.Parallel(t) 23 ui := cli.NewMockUi() 24 cmd := &VarPutCommand{Meta: Meta{Ui: ui}} 25 code := cmd.Run([]string{"-bad-flag"}) 26 out := ui.ErrorWriter.String() 27 require.Equal(t, 1, code, "expected exit code 1, got: %d") 28 require.Contains(t, out, commandErrorText(cmd), "expected help output, got: %s", out) 29 }) 30 t.Run("bad_address", func(t *testing.T) { 31 ci.Parallel(t) 32 ui := cli.NewMockUi() 33 cmd := &VarPutCommand{Meta: Meta{Ui: ui}} 34 code := cmd.Run([]string{"-address=nope", "foo", "-"}) 35 out := ui.ErrorWriter.String() 36 require.Equal(t, 1, code, "expected exit code 1, got: %d") 37 require.Contains(t, out, "Error creating variable", "expected error creating variable, got: %s", out) 38 }) 39 t.Run("missing_template", func(t *testing.T) { 40 ci.Parallel(t) 41 ui := cli.NewMockUi() 42 cmd := &VarPutCommand{Meta: Meta{Ui: ui}} 43 code := cmd.Run([]string{`-out=go-template`, "foo", "-"}) 44 out := strings.TrimSpace(ui.ErrorWriter.String()) 45 require.Equal(t, 1, code, "expected exit code 1, got: %d", code) 46 require.Equal(t, errMissingTemplate+"\n"+commandErrorText(cmd), out) 47 }) 48 t.Run("unexpected_template", func(t *testing.T) { 49 ci.Parallel(t) 50 ui := cli.NewMockUi() 51 cmd := &VarPutCommand{Meta: Meta{Ui: ui}} 52 code := cmd.Run([]string{`-out=json`, `-template="bad"`, "foo", "-"}) 53 out := strings.TrimSpace(ui.ErrorWriter.String()) 54 require.Equal(t, 1, code, "expected exit code 1, got: %d", code) 55 require.Equal(t, errUnexpectedTemplate+"\n"+commandErrorText(cmd), out) 56 }) 57 t.Run("bad_in", func(t *testing.T) { 58 ci.Parallel(t) 59 ui := cli.NewMockUi() 60 cmd := &VarPutCommand{Meta: Meta{Ui: ui}} 61 code := cmd.Run([]string{`-in=bad`, "foo", "-"}) 62 out := strings.TrimSpace(ui.ErrorWriter.String()) 63 require.Equal(t, 1, code, "expected exit code 1, got: %d", code) 64 require.Equal(t, errInvalidInFormat+"\n"+commandErrorText(cmd), out) 65 }) 66 t.Run("wildcard_namespace", func(t *testing.T) { 67 ci.Parallel(t) 68 ui := cli.NewMockUi() 69 cmd := &VarPutCommand{Meta: Meta{Ui: ui}} 70 code := cmd.Run([]string{`-namespace=*`, "foo", "-"}) 71 out := strings.TrimSpace(ui.ErrorWriter.String()) 72 require.Equal(t, 1, code, "expected exit code 1, got: %d", code) 73 require.Equal(t, errWildcardNamespaceNotAllowed, out) 74 }) 75 } 76 77 func TestVarPutCommand_GoodJson(t *testing.T) { 78 ci.Parallel(t) 79 80 // Create a server 81 srv, client, url := testServer(t, true, nil) 82 defer srv.Shutdown() 83 84 ui := cli.NewMockUi() 85 cmd := &VarPutCommand{Meta: Meta{Ui: ui}} 86 87 // Get the variable 88 code := cmd.Run([]string{"-address=" + url, "-out=json", "test/var", "k1=v1", "k2=v2"}) 89 require.Equal(t, 0, code, "expected exit 0, got: %d; %v", code, ui.ErrorWriter.String()) 90 91 t.Cleanup(func() { 92 _, _ = client.Variables().Delete("test/var", nil) 93 }) 94 95 var outVar api.Variable 96 b := ui.OutputWriter.Bytes() 97 err := json.Unmarshal(b, &outVar) 98 require.NoError(t, err, "error unmarshaling json: %v\nb: %s", err, b) 99 require.Equal(t, "default", outVar.Namespace) 100 require.Equal(t, "test/var", outVar.Path) 101 require.Equal(t, api.VariableItems{"k1": "v1", "k2": "v2"}, outVar.Items) 102 } 103 104 func TestVarPutCommand_AutocompleteArgs(t *testing.T) { 105 ci.Parallel(t) 106 _, client, url, shutdownFn := testAPIClient(t) 107 defer shutdownFn() 108 109 ui := cli.NewMockUi() 110 cmd := &VarPutCommand{Meta: Meta{Ui: ui, flagAddress: url}} 111 112 // Create a var 113 sv := testVariable() 114 _, _, err := client.Variables().Create(sv, nil) 115 require.NoError(t, err) 116 117 args := complete.Args{Last: "t"} 118 predictor := cmd.AutocompleteArgs() 119 120 res := predictor.Predict(args) 121 require.Equal(t, 1, len(res)) 122 require.Equal(t, sv.Path, res[0]) 123 }