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

Commit 4a394be

Browse files
committed
chore: add authentication init to unit tests
1 parent d604c27 commit 4a394be

File tree

3 files changed

+132
-67
lines changed

3 files changed

+132
-67
lines changed

.github/workflows/test.yaml

Lines changed: 3 additions & 0 deletions
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

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

internal/cmd/envs_test.go

Lines changed: 1 addition & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,10 @@
11
package cmd
22

33
import (
4-
"bytes"
5-
"fmt"
6-
"io"
7-
"io/ioutil"
8-
"strings"
94
"testing"
10-
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"
185
)
196

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-
287
func TestEnvsCommand(t *testing.T) {
298
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-
}
41-
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-
}
68-
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
9+
res.success(t)
7610
}

0 commit comments

Comments
 (0)