Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit dc44262

Browse files
authored
chore: add auth init to unit tests (#280)
1 parent d604c27 commit dc44262

File tree

4 files changed

+163
-66
lines changed

4 files changed

+163
-66
lines changed

.github/workflows/test.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ jobs:
4040
uses: ./ci/image
4141
env:
4242
COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
43+
CODER_URL: ${{ secrets.CODER_URL }}
44+
CODER_EMAIL: ${{ secrets.CODER_EMAIL }}
45+
CODER_PASSWORD: ${{ secrets.CODER_PASSWORD }}
4346
with:
4447
args: make -j test/coverage
4548
gendocs:

internal/cmd/cli_test.go

+142
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package cmd
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"fmt"
7+
"io"
8+
"io/ioutil"
9+
"net/url"
10+
"os"
11+
"strings"
12+
"testing"
13+
14+
"cdr.dev/slog"
15+
"cdr.dev/slog/sloggers/slogtest"
16+
"cdr.dev/slog/sloggers/slogtest/assert"
17+
"golang.org/x/xerrors"
18+
19+
"cdr.dev/coder-cli/coder-sdk"
20+
"cdr.dev/coder-cli/internal/config"
21+
"cdr.dev/coder-cli/pkg/clog"
22+
)
23+
24+
func init() {
25+
tmpDir, err := ioutil.TempDir("", "coder-cli-config-dir")
26+
if err != nil {
27+
panic(err)
28+
}
29+
config.SetRoot(tmpDir)
30+
31+
// TODO: might need to make this a command scoped option to make assertions against its output
32+
clog.SetOutput(ioutil.Discard)
33+
34+
email := os.Getenv("CODER_EMAIL")
35+
password := os.Getenv("CODER_PASSWORD")
36+
rawURL := os.Getenv("CODER_URL")
37+
if email == "" || password == "" || rawURL == "" {
38+
panic("CODER_EMAIL, CODER_PASSWORD, and CODER_URL are required environment variables")
39+
}
40+
u, err := url.Parse(rawURL)
41+
if err != nil {
42+
panic("invalid CODER_URL: " + err.Error())
43+
}
44+
client, err := coder.NewClient(coder.ClientOptions{
45+
BaseURL: u,
46+
Email: email,
47+
Password: password,
48+
})
49+
if err != nil {
50+
panic("new client: " + err.Error())
51+
}
52+
if err := config.URL.Write(rawURL); err != nil {
53+
panic("write config url: " + err.Error())
54+
}
55+
if err := config.Session.Write(client.Token()); err != nil {
56+
panic("write config token: " + err.Error())
57+
}
58+
}
59+
60+
type result struct {
61+
outBuffer *bytes.Buffer
62+
errBuffer *bytes.Buffer
63+
exitErr error
64+
}
65+
66+
func (r result) success(t *testing.T) {
67+
t.Helper()
68+
assert.Success(t, "execute command", r.exitErr)
69+
}
70+
71+
//nolint
72+
func (r result) stdoutContains(t *testing.T, substring string) {
73+
t.Helper()
74+
if !strings.Contains(r.outBuffer.String(), substring) {
75+
slogtest.Fatal(t, "stdout contains substring", slog.F("substring", substring), slog.F("stdout", r.outBuffer.String()))
76+
}
77+
}
78+
79+
//nolint
80+
func (r result) stdoutUnmarshals(t *testing.T, target interface{}) {
81+
t.Helper()
82+
err := json.Unmarshal(r.outBuffer.Bytes(), target)
83+
assert.Success(t, "unmarshal json", err)
84+
}
85+
86+
//nolint
87+
func (r result) stdoutEmpty(t *testing.T) {
88+
t.Helper()
89+
assert.Equal(t, "stdout empty", "", r.outBuffer.String())
90+
}
91+
92+
//nolint
93+
func (r result) stderrEmpty(t *testing.T) {
94+
t.Helper()
95+
assert.Equal(t, "stderr empty", "", r.errBuffer.String())
96+
}
97+
98+
//nolint
99+
func (r result) stderrContains(t *testing.T, substring string) {
100+
t.Helper()
101+
if !strings.Contains(r.errBuffer.String(), substring) {
102+
slogtest.Fatal(t, "stderr contains substring", slog.F("substring", substring), slog.F("stderr", r.errBuffer.String()))
103+
}
104+
}
105+
106+
//nolint
107+
func (r result) clogError(t *testing.T) clog.CLIError {
108+
t.Helper()
109+
var cliErr clog.CLIError
110+
if !xerrors.As(r.exitErr, &cliErr) {
111+
slogtest.Fatal(t, "expected clog error, none found", slog.Error(r.exitErr), slog.F("type", fmt.Sprintf("%T", r.exitErr)))
112+
}
113+
slogtest.Debug(t, "clog error", slog.F("message", cliErr.String()))
114+
return cliErr
115+
}
116+
117+
func execute(t *testing.T, in io.Reader, args ...string) result {
118+
cmd := Make()
119+
120+
var outStream bytes.Buffer
121+
var errStream bytes.Buffer
122+
123+
cmd.SetArgs(args)
124+
125+
cmd.SetIn(in)
126+
cmd.SetOut(&outStream)
127+
cmd.SetErr(&errStream)
128+
129+
err := cmd.Execute()
130+
131+
slogtest.Debug(t, "execute command",
132+
slog.F("out_buffer", outStream.String()),
133+
slog.F("err_buffer", errStream.String()),
134+
slog.F("args", args),
135+
slog.F("execute_error", err),
136+
)
137+
return result{
138+
outBuffer: &outStream,
139+
errBuffer: &errStream,
140+
exitErr: err,
141+
}
142+
}

internal/cmd/envs_test.go

+8-66
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,18 @@
11
package cmd
22

33
import (
4-
"bytes"
5-
"fmt"
6-
"io"
7-
"io/ioutil"
8-
"strings"
94
"testing"
105

11-
"cdr.dev/slog"
12-
"cdr.dev/slog/sloggers/slogtest"
13-
"cdr.dev/slog/sloggers/slogtest/assert"
14-
"golang.org/x/xerrors"
15-
16-
"cdr.dev/coder-cli/internal/config"
17-
"cdr.dev/coder-cli/pkg/clog"
6+
"cdr.dev/coder-cli/coder-sdk"
187
)
198

20-
func init() {
21-
tmpDir, err := ioutil.TempDir("", "coder-cli-config-dir")
22-
if err != nil {
23-
panic(err)
24-
}
25-
config.SetRoot(tmpDir)
26-
}
27-
28-
func TestEnvsCommand(t *testing.T) {
29-
res := execute(t, []string{"envs", "ls"}, nil)
30-
assert.Error(t, "execute without auth", res.ExitErr)
31-
32-
err := assertClogErr(t, res.ExitErr)
33-
assert.True(t, "login hint in error", strings.Contains(err.String(), "did you run \"coder login"))
34-
}
35-
36-
type result struct {
37-
OutBuffer *bytes.Buffer
38-
ErrBuffer *bytes.Buffer
39-
ExitErr error
40-
}
9+
func Test_envs_ls(t *testing.T) {
10+
res := execute(t, nil, "envs", "ls")
11+
res.success(t)
4112

42-
func execute(t *testing.T, args []string, in io.Reader) result {
43-
cmd := Make()
44-
45-
outStream := bytes.NewBuffer(nil)
46-
errStream := bytes.NewBuffer(nil)
47-
48-
cmd.SetArgs(args)
49-
50-
cmd.SetIn(in)
51-
cmd.SetOut(outStream)
52-
cmd.SetErr(errStream)
53-
54-
err := cmd.Execute()
55-
56-
slogtest.Debug(t, "execute command",
57-
slog.F("outBuffer", outStream.String()),
58-
slog.F("errBuffer", errStream.String()),
59-
slog.F("args", args),
60-
slog.F("execute_error", err),
61-
)
62-
return result{
63-
OutBuffer: outStream,
64-
ErrBuffer: errStream,
65-
ExitErr: err,
66-
}
67-
}
13+
res = execute(t, nil, "envs", "ls", "--output=json")
14+
res.success(t)
6815

69-
func assertClogErr(t *testing.T, err error) clog.CLIError {
70-
var cliErr clog.CLIError
71-
if !xerrors.As(err, &cliErr) {
72-
slogtest.Fatal(t, "expected clog error, none found", slog.Error(err), slog.F("type", fmt.Sprintf("%T", err)))
73-
}
74-
slogtest.Debug(t, "clog error", slog.F("message", cliErr.String()))
75-
return cliErr
16+
var envs []coder.Environment
17+
res.stdoutUnmarshals(t, &envs)
7618
}

internal/cmd/providers_test.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package cmd
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func Test_providers_ls(t *testing.T) {
8+
res := execute(t, nil, "providers", "ls")
9+
res.success(t)
10+
}

0 commit comments

Comments
 (0)