1package command
2
3import (
4	"strings"
5	"testing"
6
7	"github.com/hashicorp/nomad/nomad/mock"
8	"github.com/mitchellh/cli"
9	"github.com/posener/complete"
10	"github.com/stretchr/testify/assert"
11)
12
13func TestJobDeploymentsCommand_Implements(t *testing.T) {
14	t.Parallel()
15	var _ cli.Command = &JobDeploymentsCommand{}
16}
17
18func TestJobDeploymentsCommand_Fails(t *testing.T) {
19	t.Parallel()
20	ui := new(cli.MockUi)
21	cmd := &JobDeploymentsCommand{Meta: Meta{Ui: ui}}
22
23	// Fails on misuse
24	if code := cmd.Run([]string{"some", "bad", "args"}); code != 1 {
25		t.Fatalf("expected exit code 1, got: %d", code)
26	}
27	if out := ui.ErrorWriter.String(); !strings.Contains(out, commandErrorText(cmd)) {
28		t.Fatalf("expected help output, got: %s", out)
29	}
30	ui.ErrorWriter.Reset()
31
32	if code := cmd.Run([]string{"-address=nope", "foo"}); code != 1 {
33		t.Fatalf("expected exit code 1, got: %d", code)
34	}
35	if out := ui.ErrorWriter.String(); !strings.Contains(out, "Error listing jobs") {
36		t.Fatalf("expected failed query error, got: %s", out)
37	}
38	ui.ErrorWriter.Reset()
39}
40
41func TestJobDeploymentsCommand_Run(t *testing.T) {
42	t.Parallel()
43	assert := assert.New(t)
44	srv, _, url := testServer(t, true, nil)
45	defer srv.Shutdown()
46
47	ui := new(cli.MockUi)
48	cmd := &JobDeploymentsCommand{Meta: Meta{Ui: ui}}
49
50	// Should return an error message for no job match
51	if code := cmd.Run([]string{"-address=" + url, "foo"}); code != 1 {
52		t.Fatalf("expected exit 1, got: %d", code)
53	}
54
55	// Create a job without a deployment
56	job := mock.Job()
57	state := srv.Agent.Server().State()
58	assert.Nil(state.UpsertJob(100, job))
59
60	// Should display no match if the job doesn't have deployments
61	if code := cmd.Run([]string{"-address=" + url, job.ID}); code != 0 {
62		t.Fatalf("expected exit 0, got: %d", code)
63	}
64	if out := ui.OutputWriter.String(); !strings.Contains(out, "No deployments found") {
65		t.Fatalf("expected no deployments output, got: %s", out)
66	}
67	ui.OutputWriter.Reset()
68
69	// Inject a deployment
70	d := mock.Deployment()
71	d.JobID = job.ID
72	d.JobCreateIndex = job.CreateIndex
73	assert.Nil(state.UpsertDeployment(200, d))
74
75	// Should now display the deployment
76	if code := cmd.Run([]string{"-address=" + url, "-verbose", job.ID}); code != 0 {
77		t.Fatalf("expected exit 0, got: %d", code)
78	}
79	if out := ui.OutputWriter.String(); !strings.Contains(out, d.ID) {
80		t.Fatalf("expected deployment output, got: %s", out)
81	}
82	ui.OutputWriter.Reset()
83}
84
85func TestJobDeploymentsCommand_Run_Latest(t *testing.T) {
86	t.Parallel()
87	assert := assert.New(t)
88	srv, _, url := testServer(t, true, nil)
89	defer srv.Shutdown()
90
91	ui := new(cli.MockUi)
92	cmd := &JobDeploymentsCommand{Meta: Meta{Ui: ui}}
93
94	// Should return an error message for no job match
95	if code := cmd.Run([]string{"-address=" + url, "-latest", "foo"}); code != 1 {
96		t.Fatalf("expected exit 1, got: %d", code)
97	}
98
99	// Create a job without a deployment
100	job := mock.Job()
101	state := srv.Agent.Server().State()
102	assert.Nil(state.UpsertJob(100, job))
103
104	// Should display no match if the job doesn't have deployments
105	if code := cmd.Run([]string{"-address=" + url, "-latest", job.ID}); code != 0 {
106		t.Fatalf("expected exit 0, got: %d", code)
107	}
108	if out := ui.OutputWriter.String(); !strings.Contains(out, "No deployment found") {
109		t.Fatalf("expected no deployments output, got: %s", out)
110	}
111	ui.OutputWriter.Reset()
112
113	// Inject a deployment
114	d := mock.Deployment()
115	d.JobID = job.ID
116	d.JobCreateIndex = job.CreateIndex
117	assert.Nil(state.UpsertDeployment(200, d))
118
119	// Should now display the deployment
120	if code := cmd.Run([]string{"-address=" + url, "-verbose", "-latest", job.ID}); code != 0 {
121		t.Fatalf("expected exit 0, got: %d", code)
122	}
123	if out := ui.OutputWriter.String(); !strings.Contains(out, d.ID) {
124		t.Fatalf("expected deployment output, got: %s", out)
125	}
126	ui.OutputWriter.Reset()
127}
128
129func TestJobDeploymentsCommand_AutocompleteArgs(t *testing.T) {
130	assert := assert.New(t)
131	t.Parallel()
132
133	srv, _, url := testServer(t, true, nil)
134	defer srv.Shutdown()
135
136	ui := new(cli.MockUi)
137	cmd := &JobDeploymentsCommand{Meta: Meta{Ui: ui, flagAddress: url}}
138
139	// Create a fake job
140	state := srv.Agent.Server().State()
141	j := mock.Job()
142	assert.Nil(state.UpsertJob(1000, j))
143
144	prefix := j.ID[:len(j.ID)-5]
145	args := complete.Args{Last: prefix}
146	predictor := cmd.AutocompleteArgs()
147
148	res := predictor.Predict(args)
149	assert.Equal(1, len(res))
150	assert.Equal(j.ID, res[0])
151}
152