github.com/mithrandie/csvq@v1.18.1/lib/action/update_test.go (about)

     1  package action
     2  
     3  import (
     4  	"errors"
     5  	"reflect"
     6  	"testing"
     7  )
     8  
     9  var versionIsLaterThanTests = []struct {
    10  	Version1 *Version
    11  	Version2 *Version
    12  	Result   bool
    13  }{
    14  	{
    15  		Version1: nil,
    16  		Version2: nil,
    17  		Result:   false,
    18  	},
    19  	{
    20  		Version1: &Version{
    21  			Major: 1,
    22  			Minor: 2,
    23  			Patch: 3,
    24  		},
    25  		Version2: nil,
    26  		Result:   false,
    27  	},
    28  	{
    29  		Version1: &Version{
    30  			Major: 1,
    31  			Minor: 2,
    32  			Patch: 3,
    33  		},
    34  		Version2: &Version{
    35  			Major: 1,
    36  			Minor: 2,
    37  			Patch: 3,
    38  		},
    39  		Result: false,
    40  	},
    41  	{
    42  		Version1: &Version{
    43  			Major: 1,
    44  			Minor: 2,
    45  			Patch: 1,
    46  		},
    47  		Version2: &Version{
    48  			Major: 1,
    49  			Minor: 3,
    50  			Patch: 0,
    51  		},
    52  		Result: false,
    53  	},
    54  	{
    55  		Version1: &Version{
    56  			Major: 2,
    57  			Minor: 2,
    58  			Patch: 3,
    59  		},
    60  		Version2: &Version{
    61  			Major: 1,
    62  			Minor: 2,
    63  			Patch: 3,
    64  		},
    65  		Result: true,
    66  	},
    67  	{
    68  		Version1: &Version{
    69  			Major: 1,
    70  			Minor: 3,
    71  			Patch: 3,
    72  		},
    73  		Version2: &Version{
    74  			Major: 1,
    75  			Minor: 2,
    76  			Patch: 3,
    77  		},
    78  		Result: true,
    79  	},
    80  	{
    81  		Version1: &Version{
    82  			Major: 1,
    83  			Minor: 2,
    84  			Patch: 4,
    85  		},
    86  		Version2: &Version{
    87  			Major: 1,
    88  			Minor: 2,
    89  			Patch: 3,
    90  		},
    91  		Result: true,
    92  	},
    93  	{
    94  		Version1: &Version{
    95  			Major:      1,
    96  			Minor:      2,
    97  			Patch:      3,
    98  			PreRelease: 0,
    99  		},
   100  		Version2: &Version{
   101  			Major:      1,
   102  			Minor:      2,
   103  			Patch:      3,
   104  			PreRelease: 4,
   105  		},
   106  		Result: true,
   107  	},
   108  	{
   109  		Version1: &Version{
   110  			Major:      1,
   111  			Minor:      2,
   112  			Patch:      3,
   113  			PreRelease: 4,
   114  		},
   115  		Version2: &Version{
   116  			Major:      1,
   117  			Minor:      2,
   118  			Patch:      3,
   119  			PreRelease: 0,
   120  		},
   121  		Result: false,
   122  	},
   123  	{
   124  		Version1: &Version{
   125  			Major:      1,
   126  			Minor:      2,
   127  			Patch:      3,
   128  			PreRelease: 4,
   129  		},
   130  		Version2: &Version{
   131  			Major:      1,
   132  			Minor:      2,
   133  			Patch:      3,
   134  			PreRelease: 5,
   135  		},
   136  		Result: false,
   137  	},
   138  }
   139  
   140  func TestVersion_IsLaterThan(t *testing.T) {
   141  	for _, v := range versionIsLaterThanTests {
   142  		result := v.Version1.IsLaterThan(v.Version2)
   143  		if result != v.Result {
   144  			t.Errorf("result = %t, want %t for %v, %v", result, v.Result, v.Version1, v.Version2)
   145  		}
   146  	}
   147  }
   148  
   149  func TestVersion_String(t *testing.T) {
   150  	v := &Version{
   151  		Major: 1,
   152  		Minor: 2,
   153  		Patch: 3,
   154  	}
   155  	expect := "1.2.3"
   156  	result := v.String()
   157  	if result != expect {
   158  		t.Errorf("result = %q, want %q", result, expect)
   159  	}
   160  }
   161  
   162  var parseVersionTests = []struct {
   163  	Input  string
   164  	Result *Version
   165  	Error  string
   166  }{
   167  	{
   168  		Input: "1.2.3",
   169  		Result: &Version{
   170  			Major: 1,
   171  			Minor: 2,
   172  			Patch: 3,
   173  		},
   174  	},
   175  	{
   176  		Input: "v1.2.3",
   177  		Result: &Version{
   178  			Major: 1,
   179  			Minor: 2,
   180  			Patch: 3,
   181  		},
   182  	},
   183  	{
   184  		Input: "v1.2.3-pr.1",
   185  		Result: &Version{
   186  			Major:      1,
   187  			Minor:      2,
   188  			Patch:      3,
   189  			PreRelease: 1,
   190  		},
   191  	},
   192  	{
   193  		Input: "",
   194  		Error: "cannot parse to version",
   195  	},
   196  	{
   197  		Input: "v1.2",
   198  		Error: "cannot parse to version",
   199  	},
   200  	{
   201  		Input: "va.2.3",
   202  		Error: "cannot parse to version",
   203  	},
   204  	{
   205  		Input: "v1.a.3",
   206  		Error: "cannot parse to version",
   207  	},
   208  	{
   209  		Input: "v1.2.a",
   210  		Error: "cannot parse to version",
   211  	},
   212  }
   213  
   214  func TestParseVersion(t *testing.T) {
   215  	for _, v := range parseVersionTests {
   216  		result, err := ParseVersion(v.Input)
   217  		if err != nil {
   218  			if len(v.Error) < 1 {
   219  				t.Errorf("%s: unexpected error %q", v.Input, err)
   220  			} else if err.Error() != v.Error {
   221  				t.Errorf("%s: error %q, want error %q", v.Input, err.Error(), v.Error)
   222  			}
   223  			continue
   224  		}
   225  		if 0 < len(v.Error) {
   226  			t.Errorf("%s: no error, want error %q", v.Input, v.Error)
   227  			continue
   228  		}
   229  		if !reflect.DeepEqual(result, v.Result) {
   230  			t.Errorf("%s: result = %v, want %v", v.Input, result, v.Result)
   231  		}
   232  	}
   233  }
   234  
   235  var checkForUpdatesTests = []struct {
   236  	Name           string
   237  	CurrentVersion string
   238  	IncludePR      bool
   239  	GoOS           string
   240  	GoArch         string
   241  	ClientError    string
   242  	LatestVersion  string
   243  	PublishedAt    string
   244  	Result         string
   245  	Error          string
   246  }{
   247  	{
   248  		Name:           "Github Client Error",
   249  		CurrentVersion: "v1.2.3",
   250  		GoOS:           "darwin",
   251  		GoArch:         "amd64",
   252  		ClientError:    "client error",
   253  		Error:          "client error",
   254  	},
   255  	{
   256  		Name:           "Invalid release number",
   257  		CurrentVersion: "v1.2.3",
   258  		GoOS:           "darwin",
   259  		GoArch:         "amd64",
   260  		LatestVersion:  "invalid",
   261  		PublishedAt:    "2019-02-13T00:00:00Z",
   262  		Error:          "Invalid release number: invalid",
   263  	},
   264  	{
   265  		Name:           "Current Version is Invalid",
   266  		CurrentVersion: "invalid",
   267  		GoOS:           "darwin",
   268  		GoArch:         "amd64",
   269  		LatestVersion:  "v1.2.4",
   270  		PublishedAt:    "2019-02-13T00:00:00Z",
   271  		Result: "The current version is an invalid number.\n" +
   272  			"The latest version is 1.2.4, released on Feb 13, 2019.\n" +
   273  			"  Release URL: https://example.com",
   274  	},
   275  	{
   276  		Name:           "Current is the latest version",
   277  		CurrentVersion: "v1.2.3",
   278  		GoOS:           "darwin",
   279  		GoArch:         "amd64",
   280  		LatestVersion:  "v1.2.3",
   281  		PublishedAt:    "2019-02-13T00:00:00Z",
   282  		Result:         "The current version 1.2.3 is up to date.",
   283  	},
   284  	{
   285  		Name:           "Latest version is available",
   286  		CurrentVersion: "v1.2.3",
   287  		GoOS:           "darwin",
   288  		GoArch:         "amd64",
   289  		LatestVersion:  "v1.2.4",
   290  		PublishedAt:    "2019-02-13T00:00:00Z",
   291  		Result: "Version 1.2.4 is now available.\n" +
   292  			"  Release Date: Feb 13, 2019\n" +
   293  			"  Release URL:  https://example.com\n" +
   294  			"  Download URL: https://example.com/download",
   295  	},
   296  	{
   297  		Name:           "Latest version is available and executable binary does not exist",
   298  		CurrentVersion: "v1.2.3",
   299  		GoOS:           "unknown",
   300  		GoArch:         "amd64",
   301  		LatestVersion:  "v1.2.4",
   302  		PublishedAt:    "2019-02-13T00:00:00Z",
   303  		Result: "Version 1.2.4 is now available.\n" +
   304  			"  Release Date: Feb 13, 2019\n" +
   305  			"  Release URL:  https://example.com",
   306  	},
   307  	{
   308  		Name:           "Latest pre-release version is available",
   309  		CurrentVersion: "v1.2.3",
   310  		IncludePR:      true,
   311  		GoOS:           "darwin",
   312  		GoArch:         "amd64",
   313  		LatestVersion:  "v1.2.4-pr.1",
   314  		PublishedAt:    "2019-02-13T00:00:00Z",
   315  		Result: "Version 1.2.4-pr.1 is now available.\n" +
   316  			"  Release Date: Feb 13, 2019\n" +
   317  			"  Release URL:  https://example.com\n" +
   318  			"  Download URL: https://example.com/download",
   319  	},
   320  	{
   321  		Name:           "Latest pre-release version is available and executable binary does not exist",
   322  		CurrentVersion: "v1.2.3",
   323  		IncludePR:      true,
   324  		GoOS:           "unknown",
   325  		GoArch:         "amd64",
   326  		LatestVersion:  "v1.2.4-pr.1",
   327  		PublishedAt:    "2019-02-13T00:00:00Z",
   328  		Result: "Version 1.2.4-pr.1 is now available.\n" +
   329  			"  Release Date: Feb 13, 2019\n" +
   330  			"  Release URL:  https://example.com",
   331  	},
   332  	{
   333  		Name:           "Latest pre-release version does not exist",
   334  		CurrentVersion: "v1.2.4",
   335  		IncludePR:      true,
   336  		GoOS:           "darwin",
   337  		GoArch:         "amd64",
   338  		LatestVersion:  "v1.2.4-pr.1",
   339  		PublishedAt:    "2019-02-13T00:00:00Z",
   340  		Result:         "The current version 1.2.4 is up to date.",
   341  	},
   342  }
   343  
   344  type GithubClientMock struct {
   345  	LatestVersion string
   346  	PublishedAt   string
   347  	Error         string
   348  }
   349  
   350  func (c GithubClientMock) GetLatestRelease() (*GithubRelease, error) {
   351  	if 0 < len(c.Error) {
   352  		return nil, errors.New(c.Error)
   353  	}
   354  
   355  	htmlurl := "https://example.com"
   356  	assetName := "csvq-v1.2.4-darwin-amd64.tar.gz"
   357  	downloadURL := htmlurl + "/download"
   358  	return &GithubRelease{
   359  		TagName:     c.LatestVersion,
   360  		PublishedAt: c.PublishedAt,
   361  		HTMLURL:     htmlurl,
   362  		Assets: []GithubReleaseAsset{
   363  			{
   364  				Name:               assetName,
   365  				BrowserDownloadURL: downloadURL,
   366  			},
   367  		},
   368  	}, nil
   369  }
   370  
   371  func (c GithubClientMock) GetLatestReleaseIncludingPreRelease() (*GithubRelease, error) {
   372  	if 0 < len(c.Error) {
   373  		return nil, errors.New(c.Error)
   374  	}
   375  
   376  	htmlurl := "https://example.com"
   377  	assetName := "csvq-v1.2.4-pr.1-darwin-amd64.tar.gz"
   378  	downloadURL := htmlurl + "/download"
   379  	return &GithubRelease{
   380  		TagName:     c.LatestVersion,
   381  		PublishedAt: c.PublishedAt,
   382  		HTMLURL:     htmlurl,
   383  		Assets: []GithubReleaseAsset{
   384  			{
   385  				Name:               assetName,
   386  				BrowserDownloadURL: downloadURL,
   387  			},
   388  		},
   389  	}, nil
   390  }
   391  
   392  func TestCheckForUpdates(t *testing.T) {
   393  	for _, v := range checkForUpdatesTests {
   394  		CurrentVersion, _ = ParseVersion(v.CurrentVersion)
   395  		client := &GithubClientMock{
   396  			LatestVersion: v.LatestVersion,
   397  			PublishedAt:   v.PublishedAt,
   398  			Error:         v.ClientError,
   399  		}
   400  
   401  		result, err := CheckForUpdates(v.IncludePR, client, v.GoOS, v.GoArch)
   402  		if err != nil {
   403  			if len(v.Error) < 1 {
   404  				t.Errorf("%s: unexpected error %q", v.Name, err)
   405  			} else if err.Error() != v.Error {
   406  				t.Errorf("%s: error %q, want error %q", v.Name, err.Error(), v.Error)
   407  			}
   408  			continue
   409  		}
   410  		if 0 < len(v.Error) {
   411  			t.Errorf("%s: no error, want error %q", v.Name, v.Error)
   412  			continue
   413  		}
   414  		if result != v.Result {
   415  			t.Errorf("%s: result = %v, want %v", v.Name, result, v.Result)
   416  		}
   417  	}
   418  
   419  	CurrentVersion = &Version{}
   420  }