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 }