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

Commit 1373e79

Browse files
committed
internal/cmd/update_test.go: more tests
1 parent 597afe1 commit 1373e79

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

internal/cmd/update_test.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"encoding/base64"
77
"io/fs"
88
"io/ioutil"
9+
"net"
910
"net/http"
1011
"os"
1112
"strings"
@@ -121,6 +122,96 @@ func Test_updater_run(t *testing.T) {
121122
assert.ErrorContains(t, "update coder - user cancelled", err, "failed to confirm update")
122123
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
123124
})
125+
126+
run(t, "update coder - cannot stat", func(t *testing.T, p *params) {
127+
u := fromParams(p)
128+
err := u.Run(p.Ctx, false, fakeCoderURL)
129+
assert.ErrorContains(t, "update coder - cannot stat", err, "cannot stat current binary")
130+
})
131+
132+
run(t, "update coder - no permission", func(t *testing.T, p *params) {
133+
fakeFile(t, p.Fakefs, fakeExePath, 0400, fakeOldVersion)
134+
u := fromParams(p)
135+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
136+
err := u.Run(p.Ctx, false, fakeCoderURL)
137+
assert.ErrorContains(t, "update coder - no permission", err, "missing write permission")
138+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
139+
})
140+
141+
run(t, "update coder - invalid url", func(t *testing.T, p *params) {
142+
fakeFile(t, p.Fakefs, fakeExePath, 0755, fakeOldVersion)
143+
p.VersionF = func() string { return fakeOldVersion }
144+
u := fromParams(p)
145+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
146+
err := u.Run(p.Ctx, false, "h$$p://invalid.url")
147+
assert.ErrorContains(t, "update coder - invalid url", err, "invalid coder URL")
148+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
149+
})
150+
151+
run(t, "update coder - fetch api version failure", func(t *testing.T, p *params) {
152+
fakeFile(t, p.Fakefs, fakeExePath, 0755, fakeOldVersion)
153+
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS(), net.ErrClosed)
154+
p.VersionF = func() string { return fakeOldVersion }
155+
u := fromParams(p)
156+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
157+
err := u.Run(p.Ctx, false, fakeCoderURL)
158+
assert.ErrorContains(t, "update coder - fetch api version failure", err, "fetch api version")
159+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
160+
})
161+
162+
run(t, "update coder - failed to fetch URL", func(t *testing.T, p *params) {
163+
fakeFile(t, p.Fakefs, fakeExePath, 0755, fakeOldVersion)
164+
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS("coder-version: "+fakeNewVersion), nil)
165+
p.HttpClient.M[fakeReleaseURL] = newFakeGetterResponse([]byte{}, 0, variadicS(), net.ErrClosed)
166+
p.VersionF = func() string { return fakeOldVersion }
167+
p.ConfirmF = fakeConfirmYes
168+
u := fromParams(p)
169+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
170+
err := u.Run(p.Ctx, false, fakeCoderURL)
171+
assert.ErrorContains(t, "update coder - release URL 404", err, "failed to fetch URL")
172+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
173+
})
174+
175+
run(t, "update coder - release URL 404", func(t *testing.T, p *params) {
176+
fakeFile(t, p.Fakefs, fakeExePath, 0755, fakeOldVersion)
177+
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS("coder-version: "+fakeNewVersion), nil)
178+
p.HttpClient.M[fakeReleaseURL] = newFakeGetterResponse([]byte{}, 404, variadicS(), nil)
179+
p.VersionF = func() string { return fakeOldVersion }
180+
p.ConfirmF = fakeConfirmYes
181+
u := fromParams(p)
182+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
183+
err := u.Run(p.Ctx, false, fakeCoderURL)
184+
assert.ErrorContains(t, "update coder - release URL 404", err, "failed to fetch release")
185+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
186+
})
187+
188+
run(t, "update coder - invalid archive", func(t *testing.T, p *params) {
189+
fakeFile(t, p.Fakefs, fakeExePath, 0755, fakeOldVersion)
190+
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS("coder-version: "+fakeNewVersion), nil)
191+
p.HttpClient.M[fakeReleaseURL] = newFakeGetterResponse([]byte{}, 200, variadicS(), nil)
192+
p.VersionF = func() string { return fakeOldVersion }
193+
p.ConfirmF = fakeConfirmYes
194+
u := fromParams(p)
195+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
196+
err := u.Run(p.Ctx, false, fakeCoderURL)
197+
assert.ErrorContains(t, "update coder - invalid archive", err, "failed to extract coder binary from archive")
198+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
199+
})
200+
201+
run(t, "update coder - read-only fs", func(t *testing.T, p *params) {
202+
rwfs := p.Fakefs
203+
p.Fakefs = afero.NewReadOnlyFs(rwfs)
204+
fakeFile(t, rwfs, fakeExePath, 0755, fakeOldVersion)
205+
p.HttpClient.M[fakeCoderURL+"/api"] = newFakeGetterResponse([]byte{}, 401, variadicS("coder-version: "+fakeNewVersion), nil)
206+
p.HttpClient.M[fakeReleaseURL] = newFakeGetterResponse(fakeValidTgzBytes, 200, variadicS(), nil)
207+
p.VersionF = func() string { return fakeOldVersion }
208+
p.ConfirmF = fakeConfirmYes
209+
u := fromParams(p)
210+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
211+
err := u.Run(p.Ctx, false, fakeCoderURL)
212+
assert.ErrorContains(t, "update coder - read-only fs", err, "failed to create file")
213+
assertFileContent(t, p.Fakefs, fakeExePath, fakeOldVersion)
214+
})
124215
}
125216

126217
// fakeGetter mocks HTTP requests
@@ -132,6 +223,7 @@ type fakeGetter struct {
132223
func newFakeGetter(t *testing.T) *fakeGetter {
133224
return &fakeGetter{
134225
M: make(map[string]*fakeGetterResponse),
226+
T: t,
135227
}
136228
}
137229

0 commit comments

Comments
 (0)