github.com/everdrone/grab@v0.1.7-0.20230416223925-40674b995521/internal/update/check_test.go (about) 1 package update 2 3 import ( 4 "net/http" 5 "net/http/httptest" 6 "testing" 7 "time" 8 9 "github.com/everdrone/grab/internal/config" 10 ) 11 12 func TestCheckForUpdates(t *testing.T) { 13 tests := []struct { 14 name string 15 handler func(w http.ResponseWriter, r *http.Request) 16 want string 17 wantErr bool 18 }{ 19 { 20 name: "no updates", 21 handler: func(w http.ResponseWriter, r *http.Request) { 22 w.Write([]byte(`{"tag_name": "v` + config.Version + `"}`)) 23 }, 24 want: "", 25 wantErr: false, 26 }, 27 { 28 name: "invalid semver", 29 handler: func(w http.ResponseWriter, r *http.Request) { 30 w.Write([]byte(`{"tag_name": "newVersion"}`)) 31 }, 32 want: "", 33 wantErr: true, 34 }, 35 { 36 name: "invalid response", 37 handler: func(w http.ResponseWriter, r *http.Request) { 38 w.Write([]byte(`{"something": "else"}`)) 39 }, 40 want: "", 41 wantErr: true, 42 }, 43 { 44 name: "invalid json", 45 handler: func(w http.ResponseWriter, r *http.Request) { 46 w.Write([]byte(`{"something`)) 47 }, 48 want: "", 49 wantErr: true, 50 }, 51 { 52 name: "empty tag name", 53 handler: func(w http.ResponseWriter, r *http.Request) { 54 w.Write([]byte(`{"tag_name": ""}`)) 55 }, 56 want: "", 57 wantErr: true, 58 }, 59 { 60 name: "network error", 61 handler: func(w http.ResponseWriter, r *http.Request) { 62 w.WriteHeader(http.StatusInternalServerError) 63 }, 64 want: "", 65 wantErr: true, 66 }, 67 { 68 name: "request times out", 69 handler: func(w http.ResponseWriter, r *http.Request) { 70 time.Sleep(time.Millisecond * 1500) 71 72 w.Write([]byte(`{"tag_name": "v` + config.Version + `"}`)) 73 }, 74 want: "", 75 wantErr: true, 76 }, 77 { 78 name: "update available", 79 handler: func(w http.ResponseWriter, r *http.Request) { 80 w.Write([]byte(`{"tag_name": "v987.654.321"}`)) 81 }, 82 want: "987.654.321", 83 wantErr: false, 84 }, 85 } 86 87 for _, tt := range tests { 88 t.Run(tt.name, func(tc *testing.T) { 89 // start the test server 90 ts := httptest.NewServer(http.HandlerFunc(tt.handler)) 91 92 got, err := CheckForUpdates(config.Version, ts.URL) 93 if (err != nil) != tt.wantErr { 94 tc.Errorf("got error: '%v', want error: '%v'", err, tt.wantErr) 95 } 96 if got != tt.want { 97 tc.Errorf("got: '%s', want: '%s'", got, tt.want) 98 } 99 }) 100 } 101 }