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

Commit 60a75a1

Browse files
committed
internal/cmd/update_test.go: assertCLIError helper function for clog.CLIError
1 parent 306686c commit 60a75a1

File tree

1 file changed

+42
-18
lines changed

1 file changed

+42
-18
lines changed

internal/cmd/update_test.go

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,18 @@ import (
77
"fmt"
88
"io/fs"
99
"io/ioutil"
10-
"net"
1110
"net/http"
1211
"os"
1312
"path/filepath"
1413
"runtime"
1514
"strings"
1615
"testing"
1716

17+
"cdr.dev/coder-cli/pkg/clog"
1818
"cdr.dev/slog/sloggers/slogtest/assert"
1919
"github.com/manifoldco/promptui"
2020
"github.com/spf13/afero"
21+
"golang.org/x/xerrors"
2122
)
2223

2324
const (
@@ -34,7 +35,9 @@ const (
3435

3536
var (
3637
apiPrivateVersionURL = fakeCoderURL + "/api/private/version"
38+
fakeError = xerrors.New("fake error for testing")
3739
fakeNewVersionJSON = fmt.Sprintf(`{"version":%q}`, fakeNewVersion)
40+
fakeOldVersionJSON = fmt.Sprintf(`{"version":%q}`, fakeOldVersion)
3841
)
3942

4043
func Test_updater_run(t *testing.T) {
@@ -169,22 +172,22 @@ func Test_updater_run(t *testing.T) {
169172
u := fromParams(p)
170173
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
171174
err := u.Run(p.Ctx, false, fakeCoderURL)
172-
assert.ErrorContains(t, "update coder - user cancelled", err, "failed to confirm update")
175+
assertCLIError(t, "update coder - user cancelled", err, "failed to confirm update", "")
173176
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
174177
})
175178

176179
run(t, "update coder - cannot stat", func(t *testing.T, p *params) {
177180
u := fromParams(p)
178181
err := u.Run(p.Ctx, false, fakeCoderURL)
179-
assert.ErrorContains(t, "update coder - cannot stat", err, "cannot stat current binary")
182+
assertCLIError(t, "update coder - cannot stat", err, "cannot stat current binary", os.ErrNotExist.Error())
180183
})
181184

182185
run(t, "update coder - no permission", func(t *testing.T, p *params) {
183186
fakeFile(t, p.Fakefs, fakeExePathLinux, 0400, fakeOldVersion)
184187
u := fromParams(p)
185188
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
186189
err := u.Run(p.Ctx, false, fakeCoderURL)
187-
assert.ErrorContains(t, "update coder - no permission", err, "missing write permission")
190+
assertCLIError(t, "update coder - no permission", err, "missing write permission", "")
188191
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
189192
})
190193

@@ -194,31 +197,31 @@ func Test_updater_run(t *testing.T) {
194197
u := fromParams(p)
195198
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
196199
err := u.Run(p.Ctx, false, "h$$p://invalid.url")
197-
assert.ErrorContains(t, "update coder - invalid url", err, "invalid coder URL")
200+
assertCLIError(t, "update coder - invalid url", err, "invalid coder URL", "first path segment in URL cannot contain colon")
198201
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
199202
})
200203

201204
run(t, "update coder - fetch api version failure", func(t *testing.T, p *params) {
202205
fakeFile(t, p.Fakefs, fakeExePathLinux, 0755, fakeOldVersion)
203-
p.HTTPClient.M[apiPrivateVersionURL] = newFakeGetterResponse([]byte{}, 401, variadicS(), net.ErrClosed)
206+
p.HTTPClient.M[apiPrivateVersionURL] = newFakeGetterResponse([]byte{}, 401, variadicS(), fakeError)
204207
p.VersionF = func() string { return fakeOldVersion }
205208
u := fromParams(p)
206209
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
207210
err := u.Run(p.Ctx, false, fakeCoderURL)
208-
assert.ErrorContains(t, "update coder - fetch api version failure", err, "fetch api version")
211+
assertCLIError(t, "update coder - fetch api version failure", err, "fetch api version", fakeError.Error())
209212
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
210213
})
211214

212215
run(t, "update coder - failed to fetch URL", func(t *testing.T, p *params) {
213216
fakeFile(t, p.Fakefs, fakeExePathLinux, 0755, fakeOldVersion)
214217
p.HTTPClient.M[apiPrivateVersionURL] = newFakeGetterResponse([]byte(fakeNewVersionJSON), 200, variadicS(), nil)
215-
p.HTTPClient.M[fakeReleaseURLLinux] = newFakeGetterResponse([]byte{}, 0, variadicS(), net.ErrClosed)
218+
p.HTTPClient.M[fakeReleaseURLLinux] = newFakeGetterResponse([]byte{}, 0, variadicS(), fakeError)
216219
p.VersionF = func() string { return fakeOldVersion }
217220
p.ConfirmF = fakeConfirmYes
218221
u := fromParams(p)
219222
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
220223
err := u.Run(p.Ctx, false, fakeCoderURL)
221-
assert.ErrorContains(t, "update coder - release URL 404", err, "failed to fetch URL")
224+
assertCLIError(t, "update coder - failed to fetch URL", err, "failed to fetch URL", fakeError.Error())
222225
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
223226
})
224227

@@ -231,7 +234,7 @@ func Test_updater_run(t *testing.T) {
231234
u := fromParams(p)
232235
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
233236
err := u.Run(p.Ctx, false, fakeCoderURL)
234-
assert.ErrorContains(t, "update coder - release URL 404", err, "failed to fetch release")
237+
assertCLIError(t, "update coder - release URL 404", err, "failed to fetch release", "status code 404")
235238
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
236239
})
237240

@@ -244,7 +247,7 @@ func Test_updater_run(t *testing.T) {
244247
u := fromParams(p)
245248
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
246249
err := u.Run(p.Ctx, false, fakeCoderURL)
247-
assert.ErrorContains(t, "update coder - invalid archive", err, "failed to extract coder binary from archive")
250+
assertCLIError(t, "update coder - invalid tgz archive", err, "failed to extract coder binary from archive", "unknown archive type")
248251
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
249252
})
250253

@@ -259,7 +262,7 @@ func Test_updater_run(t *testing.T) {
259262
u := fromParams(p)
260263
assertFileContent(t, p.Fakefs, p.ExecutablePath, fakeOldVersion)
261264
err := u.Run(p.Ctx, false, fakeCoderURL)
262-
assert.ErrorContains(t, "update coder - invalid archive", err, "failed to extract coder binary from archive")
265+
assertCLIError(t, "update coder - invalid zip archive", err, "failed to extract coder binary from archive", "unknown archive type")
263266
assertFileContent(t, p.Fakefs, p.ExecutablePath, fakeOldVersion)
264267
})
265268

@@ -274,7 +277,7 @@ func Test_updater_run(t *testing.T) {
274277
u := fromParams(p)
275278
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
276279
err := u.Run(p.Ctx, false, fakeCoderURL)
277-
assert.ErrorContains(t, "update coder - read-only fs", err, "failed to create file")
280+
assertCLIError(t, "update coder - read-only fs", err, "failed to create file", "")
278281
assertFileContent(t, p.Fakefs, fakeExePathLinux, fakeOldVersion)
279282
})
280283

@@ -283,35 +286,35 @@ func Test_updater_run(t *testing.T) {
283286
p.ExecutablePath = `C:\Windows\system32\coder.exe`
284287
u := fromParams(p)
285288
err := u.Run(p.Ctx, false, fakeCoderURL)
286-
assert.ErrorContains(t, "update coder - path blocklist - windows", err, "cowardly refusing to update coder binary")
289+
assertCLIError(t, "update coder - path blocklist - windows", err, "cowardly refusing to update coder binary", "blocklisted prefix")
287290
})
288291
} else {
289292
run(t, "update coder - path blocklist - coder assets dir", func(t *testing.T, p *params) {
290293
p.ExecutablePath = `/var/tmp/coder/coder`
291294
u := fromParams(p)
292295
err := u.Run(p.Ctx, false, fakeCoderURL)
293-
assert.ErrorContains(t, "update coder - path blocklist - windows", err, "cowardly refusing to update coder binary")
296+
assertCLIError(t, "update coder - path blocklist - windows", err, "cowardly refusing to update coder binary", "blocklisted prefix")
294297
})
295298
run(t, "update coder - path blocklist - old homebrew prefix", func(t *testing.T, p *params) {
296299
p.Execer.M["brew --prefix"] = fakeExecerResult{[]byte("/usr/local"), nil}
297300
p.ExecutablePath = `/usr/local/bin/coder`
298301
u := fromParams(p)
299302
err := u.Run(p.Ctx, false, fakeCoderURL)
300-
assert.ErrorContains(t, "update coder - path blocklist - old homebrew prefix", err, "cowardly refusing to update coder binary")
303+
assertCLIError(t, "update coder - path blocklist - old homebrew prefix", err, "cowardly refusing to update coder binary", "blocklisted prefix")
301304
})
302305
run(t, "update coder - path blocklist - new homebrew prefix", func(t *testing.T, p *params) {
303306
p.Execer.M["brew --prefix"] = fakeExecerResult{[]byte("/opt/homebrew"), nil}
304307
p.ExecutablePath = `/opt/homebrew/bin/coder`
305308
u := fromParams(p)
306309
err := u.Run(p.Ctx, false, fakeCoderURL)
307-
assert.ErrorContains(t, "update coder - path blocklist - new homebrew prefix", err, "cowardly refusing to update coder binary")
310+
assertCLIError(t, "update coder - path blocklist - new homebrew prefix", err, "cowardly refusing to update coder binary", "blocklisted prefix")
308311
})
309312
run(t, "update coder - path blocklist - linuxbrew", func(t *testing.T, p *params) {
310313
p.Execer.M["brew --prefix"] = fakeExecerResult{[]byte("/home/user/.linuxbrew"), nil}
311314
p.ExecutablePath = `/home/user/.linuxbrew/bin/coder`
312315
u := fromParams(p)
313316
err := u.Run(p.Ctx, false, fakeCoderURL)
314-
assert.ErrorContains(t, "update coder - path blocklist - linuxbrew", err, "cowardly refusing to update coder binary")
317+
assertCLIError(t, "update coder - path blocklist - linuxbrew", err, "cowardly refusing to update coder binary", "blocklisted prefix")
315318
})
316319
}
317320
}
@@ -408,6 +411,27 @@ func assertFileContent(t *testing.T, fs afero.Fs, name string, content string) {
408411
assert.Equal(t, "assert content equal", content, string(b))
409412
}
410413

414+
func assertCLIError(t *testing.T, name string, err error, expectedHeader, expectedLines string) {
415+
t.Helper()
416+
cliError, ok := err.(clog.CLIError)
417+
if !ok {
418+
t.Errorf("%s: assert cli error: %+v is not a cli error", name, err)
419+
}
420+
421+
if !strings.Contains(err.Error(), expectedHeader) {
422+
t.Errorf("%s: assert cli error: expected header %q to contain %q", name, err.Error(), expectedHeader)
423+
}
424+
425+
if expectedLines == "" {
426+
return
427+
}
428+
429+
fullLines := strings.Join(cliError.Lines, "\n")
430+
if !strings.Contains(fullLines, expectedLines) {
431+
t.Errorf("%s: assert cli error: expected %q to contain %q", name, fullLines, expectedLines)
432+
}
433+
}
434+
411435
// this is a valid tgz archive containing a single file named 'coder' with permissions 0751
412436
// containing the string "1.23.4-rc.5+678-gabcdef-12345678".
413437
var fakeValidTgzBytes, _ = base64.StdEncoding.DecodeString(`H4sIAAAAAAAAA+3QsQ4CIRCEYR6F3oC7wIqvc3KnpQnq+3tGCwsTK3LN/zWTTDWZuG/XeeluJFlV

0 commit comments

Comments
 (0)