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  }