@@ -276,6 +276,127 @@ func TestDownloadWithTimeout_Success(t *testing.T) {
276276 }
277277}
278278
279+ func TestIsNewerVersion (t * testing.T ) {
280+ tests := []struct {
281+ latest string
282+ current string
283+ want bool
284+ }{
285+ // Newer available
286+ {"v0.3.43" , "v0.3.42" , true },
287+ {"0.3.43" , "0.3.42" , true },
288+ {"v1.0.0" , "v0.9.9" , true },
289+ // Same version
290+ {"v0.3.42" , "v0.3.42" , false },
291+ // Older version reported as "latest" (the bug scenario)
292+ {"v0.3.41" , "v0.3.42" , false },
293+ {"v0.2.0" , "v1.0.0" , false },
294+ // Invalid semver
295+ {"not-a-version" , "v1.0.0" , false },
296+ {"v1.0.0" , "not-a-version" , false },
297+ {"" , "v1.0.0" , false },
298+ }
299+ for _ , tt := range tests {
300+ t .Run (fmt .Sprintf ("latest=%s current=%s" , tt .latest , tt .current ), func (t * testing.T ) {
301+ got := isNewerVersion (tt .latest , tt .current )
302+ if got != tt .want {
303+ t .Errorf ("isNewerVersion(%q, %q) = %v, want %v" , tt .latest , tt .current , got , tt .want )
304+ }
305+ })
306+ }
307+ }
308+
309+ func TestCheckForUpdateNotice_OlderReleaseSuppressed (t * testing.T ) {
310+ // Regression test: when running a newer version than the latest GitHub release,
311+ // no update notice should be printed.
312+ origVersion := version
313+ version = "v0.3.42"
314+ defer func () { version = origVersion }()
315+
316+ srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
317+ rel := githubRelease {
318+ TagName : "v0.3.41" , // older than current
319+ HTMLURL : "https://github.com/GoCodeAlone/workflow/releases/tag/v0.3.41" ,
320+ Assets : []githubAsset {},
321+ }
322+ w .Header ().Set ("Content-Type" , "application/json" )
323+ _ = json .NewEncoder (w ).Encode (rel )
324+ }))
325+ defer srv .Close ()
326+
327+ githubReleasesURLOverride = srv .URL
328+ defer func () { githubReleasesURLOverride = "" }()
329+
330+ // Capture stderr to ensure no update notice is printed.
331+ origStderr := os .Stderr
332+ r , w , _ := os .Pipe ()
333+ os .Stderr = w
334+
335+ done := checkForUpdateNotice ()
336+ <- done
337+
338+ w .Close ()
339+ var buf [512 ]byte
340+ n , _ := r .Read (buf [:])
341+ os .Stderr = origStderr
342+
343+ output := string (buf [:n ])
344+ if output != "" {
345+ t .Errorf ("expected no update notice for older release, got: %q" , output )
346+ }
347+ }
348+
349+ func TestRunUpdate_CheckOnly_OlderRelease (t * testing.T ) {
350+ // When current version is newer than the GitHub release, --check should
351+ // report "up to date" rather than showing a spurious update notice.
352+ origVersion := version
353+ version = "v0.3.42"
354+ defer func () { version = origVersion }()
355+
356+ srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
357+ rel := githubRelease {
358+ TagName : "v0.3.41" ,
359+ HTMLURL : "https://example.com" ,
360+ Assets : []githubAsset {},
361+ }
362+ w .Header ().Set ("Content-Type" , "application/json" )
363+ _ = json .NewEncoder (w ).Encode (rel )
364+ }))
365+ defer srv .Close ()
366+
367+ githubReleasesURLOverride = srv .URL
368+ defer func () { githubReleasesURLOverride = "" }()
369+
370+ if err := runUpdate ([]string {"--check" }); err != nil {
371+ t .Fatalf ("unexpected error: %v" , err )
372+ }
373+ }
374+
375+ func TestRunUpdate_OlderRelease_NoDownload (t * testing.T ) {
376+ // When the current version is newer, runUpdate should not attempt to download.
377+ origVersion := version
378+ version = "v0.3.42"
379+ defer func () { version = origVersion }()
380+
381+ srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
382+ rel := githubRelease {
383+ TagName : "v0.3.41" ,
384+ HTMLURL : "https://example.com" ,
385+ Assets : []githubAsset {},
386+ }
387+ w .Header ().Set ("Content-Type" , "application/json" )
388+ _ = json .NewEncoder (w ).Encode (rel )
389+ }))
390+ defer srv .Close ()
391+
392+ githubReleasesURLOverride = srv .URL
393+ defer func () { githubReleasesURLOverride = "" }()
394+
395+ if err := runUpdate ([]string {}); err != nil {
396+ t .Fatalf ("unexpected error: %v" , err )
397+ }
398+ }
399+
279400func TestDownloadWithTimeout_HTTPError (t * testing.T ) {
280401 srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
281402 http .Error (w , "gone" , http .StatusGone )
0 commit comments