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  }