11package common
22
33import (
4+ "context"
5+ "io"
6+ "net/http"
47 "os"
58 "path/filepath"
69 "testing"
710
11+ "github.com/google/go-github/v78/github"
812 "github.com/spf13/cobra"
913 "github.com/spf13/viper"
10- "github.com/stepbeta/vrsr/internal/github"
14+ vrsrgithub "github.com/stepbeta/vrsr/internal/github"
1115)
1216
17+ type mockReposService struct {
18+ releases []* github.RepositoryRelease
19+ }
20+
21+ func (m * mockReposService ) ListReleases (ctx context.Context , owner , repo string , opts * github.ListOptions ) ([]* github.RepositoryRelease , * github.Response , error ) {
22+ return m .releases , & github.Response {}, nil
23+ }
24+
25+ func (m * mockReposService ) GetReleaseByTag (ctx context.Context , owner , repo , tag string ) (* github.RepositoryRelease , * github.Response , error ) {
26+ return nil , & github.Response {}, nil
27+ }
28+
29+ func (m * mockReposService ) DownloadReleaseAsset (ctx context.Context , owner , repo string , assetID int64 , httpClient * http.Client ) (io.ReadCloser , string , error ) {
30+ return nil , "" , nil
31+ }
32+
33+ func TestGetLatestVersion (t * testing.T ) {
34+ tests := []struct {
35+ name string
36+ releases []* github.RepositoryRelease
37+ expectedLatest string
38+ expectedError bool
39+ }{
40+ {
41+ name : "returns highest semver" ,
42+ releases : []* github.RepositoryRelease {
43+ {TagName : github .Ptr ("v1.0.0" )},
44+ {TagName : github .Ptr ("v1.2.3" )},
45+ {TagName : github .Ptr ("v1.1.0" )},
46+ },
47+ expectedLatest : "v1.2.3" ,
48+ expectedError : false ,
49+ },
50+ {
51+ name : "handles complex semver versions" ,
52+ releases : []* github.RepositoryRelease {
53+ {TagName : github .Ptr ("v1.0.0" )},
54+ {TagName : github .Ptr ("v2.0.0-alpha" )},
55+ {TagName : github .Ptr ("v2.0.0-beta" )},
56+ {TagName : github .Ptr ("v2.0.0-rc.1" )},
57+ {TagName : github .Ptr ("v2.0.0" )},
58+ },
59+ expectedLatest : "v2.0.0" ,
60+ expectedError : false ,
61+ },
62+ {
63+ name : "returns error when no releases" ,
64+ releases : []* github.RepositoryRelease {},
65+ expectedLatest : "" ,
66+ expectedError : true ,
67+ },
68+ {
69+ name : "handles non-semver tags gracefully" ,
70+ releases : []* github.RepositoryRelease {
71+ {TagName : github .Ptr ("not-a-version" )},
72+ {TagName : github .Ptr ("v1.0.0" )},
73+ },
74+ expectedLatest : "v1.0.0" ,
75+ expectedError : false ,
76+ },
77+ }
78+
79+ for _ , tt := range tests {
80+ t .Run (tt .name , func (t * testing.T ) {
81+ mockRepos := & mockReposService {releases : tt .releases }
82+ mockGh := vrsrgithub.GithubHelper {
83+ Repos : mockRepos ,
84+ }
85+
86+ result , err := getLatestVersion ("testtool" , vrsrgithub.RepoConfDef {}, mockGh )
87+
88+ if tt .expectedError {
89+ if err == nil {
90+ t .Errorf ("expected error, got nil" )
91+ }
92+ } else {
93+ if err != nil {
94+ t .Errorf ("unexpected error: %v" , err )
95+ }
96+ if result != tt .expectedLatest {
97+ t .Errorf ("expected %s, got %s" , tt .expectedLatest , result )
98+ }
99+ }
100+ })
101+ }
102+ }
103+
13104func TestInstallCommands_EarlyReturnWhenInUseOrInstalled (t * testing.T ) {
14105 // setup temp dirs
15106 td := t .TempDir ()
@@ -42,7 +133,7 @@ func TestInstallCommands_EarlyReturnWhenInUseOrInstalled(t *testing.T) {
42133 viper .Set ("bin-path" , binPath )
43134
44135 // calling install Github should return early (tool already in use)
45- if err := install (& cobra.Command {}, "1.2.3" , "mytool" , github .RepoConfDef {}, InstallGitHubCmd , false ); err != nil {
136+ if err := install (& cobra.Command {}, "1.2.3" , "mytool" , vrsrgithub .RepoConfDef {}, InstallGitHubCmd , false ); err != nil {
46137 t .Fatalf ("install Github expected nil error when tool in use, got: %v" , err )
47138 }
48139
@@ -52,7 +143,7 @@ func TestInstallCommands_EarlyReturnWhenInUseOrInstalled(t *testing.T) {
52143 }
53144
54145 // calling install Download should return early (tool already installed)
55- if err := install (& cobra.Command {}, "1.2.3" , "mytool" , github .RepoConfDef {}, InstallDownloadCmd , false ); err != nil {
146+ if err := install (& cobra.Command {}, "1.2.3" , "mytool" , vrsrgithub .RepoConfDef {}, InstallDownloadCmd , false ); err != nil {
56147 t .Fatalf ("install Download expected nil error when tool installed, got: %v" , err )
57148 }
58149}
0 commit comments