github.com/ungtb10d/cli/v2@v2.0.0-20221110210412-98537dd9d6a1/internal/update/update_test.go (about) 1 package update 2 3 import ( 4 "fmt" 5 "log" 6 "net/http" 7 "os" 8 "testing" 9 10 "github.com/ungtb10d/cli/v2/api" 11 "github.com/ungtb10d/cli/v2/pkg/httpmock" 12 ) 13 14 func TestCheckForUpdate(t *testing.T) { 15 scenarios := []struct { 16 Name string 17 CurrentVersion string 18 LatestVersion string 19 LatestURL string 20 ExpectsResult bool 21 }{ 22 { 23 Name: "latest is newer", 24 CurrentVersion: "v0.0.1", 25 LatestVersion: "v1.0.0", 26 LatestURL: "https://www.spacejam.com/archive/spacejam/movie/jam.htm", 27 ExpectsResult: true, 28 }, 29 { 30 Name: "current is prerelease", 31 CurrentVersion: "v1.0.0-pre.1", 32 LatestVersion: "v1.0.0", 33 LatestURL: "https://www.spacejam.com/archive/spacejam/movie/jam.htm", 34 ExpectsResult: true, 35 }, 36 { 37 Name: "current is built from source", 38 CurrentVersion: "v1.2.3-123-gdeadbeef", 39 LatestVersion: "v1.2.3", 40 LatestURL: "https://www.spacejam.com/archive/spacejam/movie/jam.htm", 41 ExpectsResult: false, 42 }, 43 { 44 Name: "current is built from source after a prerelease", 45 CurrentVersion: "v1.2.3-rc.1-123-gdeadbeef", 46 LatestVersion: "v1.2.3", 47 LatestURL: "https://www.spacejam.com/archive/spacejam/movie/jam.htm", 48 ExpectsResult: true, 49 }, 50 { 51 Name: "latest is newer than version build from source", 52 CurrentVersion: "v1.2.3-123-gdeadbeef", 53 LatestVersion: "v1.2.4", 54 LatestURL: "https://www.spacejam.com/archive/spacejam/movie/jam.htm", 55 ExpectsResult: true, 56 }, 57 { 58 Name: "latest is current", 59 CurrentVersion: "v1.0.0", 60 LatestVersion: "v1.0.0", 61 LatestURL: "https://www.spacejam.com/archive/spacejam/movie/jam.htm", 62 ExpectsResult: false, 63 }, 64 { 65 Name: "latest is older", 66 CurrentVersion: "v0.10.0-pre.1", 67 LatestVersion: "v0.9.0", 68 LatestURL: "https://www.spacejam.com/archive/spacejam/movie/jam.htm", 69 ExpectsResult: false, 70 }, 71 } 72 73 for _, s := range scenarios { 74 t.Run(s.Name, func(t *testing.T) { 75 reg := &httpmock.Registry{} 76 httpClient := &http.Client{} 77 httpmock.ReplaceTripper(httpClient, reg) 78 client := api.NewClientFromHTTP(httpClient) 79 80 reg.Register( 81 httpmock.REST("GET", "repos/OWNER/REPO/releases/latest"), 82 httpmock.StringResponse(fmt.Sprintf(`{ 83 "tag_name": "%s", 84 "html_url": "%s" 85 }`, s.LatestVersion, s.LatestURL)), 86 ) 87 88 rel, err := CheckForUpdate(client, tempFilePath(), "OWNER/REPO", s.CurrentVersion) 89 if err != nil { 90 t.Fatal(err) 91 } 92 93 if len(reg.Requests) != 1 { 94 t.Fatalf("expected 1 HTTP request, got %d", len(reg.Requests)) 95 } 96 requestPath := reg.Requests[0].URL.Path 97 if requestPath != "/repos/OWNER/REPO/releases/latest" { 98 t.Errorf("HTTP path: %q", requestPath) 99 } 100 101 if !s.ExpectsResult { 102 if rel != nil { 103 t.Fatal("expected no new release") 104 } 105 return 106 } 107 if rel == nil { 108 t.Fatal("expected to report new release") 109 } 110 111 if rel.Version != s.LatestVersion { 112 t.Errorf("Version: %q", rel.Version) 113 } 114 if rel.URL != s.LatestURL { 115 t.Errorf("URL: %q", rel.URL) 116 } 117 }) 118 } 119 } 120 121 func tempFilePath() string { 122 file, err := os.CreateTemp("", "") 123 if err != nil { 124 log.Fatal(err) 125 } 126 os.Remove(file.Name()) 127 return file.Name() 128 }