1package command
2
3import (
4	"fmt"
5	"os"
6	"strings"
7	"testing"
8
9	"github.com/hashicorp/nomad/acl"
10	"github.com/hashicorp/nomad/command/agent"
11	"github.com/hashicorp/nomad/nomad/mock"
12	"github.com/hashicorp/nomad/nomad/structs"
13	"github.com/mitchellh/cli"
14	"github.com/stretchr/testify/assert"
15)
16
17func TestACLTokenDeleteCommand_ViaEnvVariable(t *testing.T) {
18	assert := assert.New(t)
19	t.Parallel()
20	config := func(c *agent.Config) {
21		c.ACL.Enabled = true
22	}
23
24	srv, _, url := testServer(t, true, config)
25	defer srv.Shutdown()
26
27	// Bootstrap an initial ACL token
28	token := srv.RootToken
29	assert.NotNil(token, "failed to bootstrap ACL token")
30
31	ui := new(cli.MockUi)
32	cmd := &ACLTokenDeleteCommand{Meta: Meta{Ui: ui, flagAddress: url}}
33	state := srv.Agent.Server().State()
34
35	// Create a valid token
36	mockToken := mock.ACLToken()
37	mockToken.Policies = []string{acl.PolicyWrite}
38	mockToken.SetHash()
39	assert.Nil(state.UpsertACLTokens(1000, []*structs.ACLToken{mockToken}))
40
41	// Attempt to delete a token without providing a valid token with delete
42	// permissions
43	os.Setenv("NOMAD_TOKEN", "foo")
44	code := cmd.Run([]string{"-address=" + url, mockToken.AccessorID})
45	assert.Equal(1, code)
46
47	// Delete a token using a valid management token set via an environment
48	// variable
49	os.Setenv("NOMAD_TOKEN", token.SecretID)
50	code = cmd.Run([]string{"-address=" + url, mockToken.AccessorID})
51	assert.Equal(0, code)
52
53	// Check the output
54	out := ui.OutputWriter.String()
55	if !strings.Contains(out, fmt.Sprintf("Token %s successfully deleted", mockToken.AccessorID)) {
56		t.Fatalf("bad: %v", out)
57	}
58}
59