github.com/kbehouse/nsc@v0.0.6/cmd/update_test.go (about) 1 /* 2 * Copyright 2018-2020 The NATS Authors 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 package cmd 17 18 import ( 19 "fmt" 20 "os" 21 "testing" 22 "time" 23 24 "github.com/blang/semver" 25 "github.com/rhysd/go-github-selfupdate/selfupdate" 26 "github.com/stretchr/testify/require" 27 ) 28 29 func TestUpdate_RunDoesntUpdateOrCheck(t *testing.T) { 30 d := MakeTempDir(t) 31 require.NoError(t, os.Setenv(NscHomeEnv, d)) 32 conf := GetConfig() 33 conf.GithubUpdates = "foo/bar" 34 conf.SetVersion("1.0.0") 35 conf.LastUpdate = time.Now().Unix() 36 37 var checkCalled bool 38 var updateCalled bool 39 updateCheckFn = func(slug string, wantVer string) (*selfupdate.Release, bool, error) { 40 if wantVer != "" && !semver.MustParse(wantVer).EQ(semver.MustParse("1.0.0")) { 41 return nil, false, fmt.Errorf("Expected request from 1.0.0 but got %s", wantVer) 42 } 43 checkCalled = true 44 return &selfupdate.Release{Version: semver.MustParse("1.0.0"), ReleaseNotes: "f33dfac3"}, true, nil 45 } 46 updateFn = func(want *selfupdate.Release, cmdPath string) error { 47 updateCalled = true 48 return nil 49 } 50 defer func() { 51 require.NoError(t, os.Unsetenv(NscHomeEnv)) 52 updateCheckFn = nil 53 updateFn = nil 54 }() 55 56 su, err := NewSelfUpdate() 57 require.NoError(t, err) 58 require.NotNil(t, su) 59 require.False(t, su.shouldCheck()) 60 _, err = su.Run() 61 require.NoError(t, err) 62 require.False(t, checkCalled) 63 require.False(t, updateCalled) 64 } 65 66 func TestUpdate_NeedsUpdate(t *testing.T) { 67 d := MakeTempDir(t) 68 require.NoError(t, os.Setenv(NscHomeEnv, d)) 69 conf := GetConfig() 70 conf.GithubUpdates = "foo/bar" 71 conf.SetVersion("1.0.0") 72 conf.LastUpdate = time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC).Unix() 73 74 var checkCalled bool 75 var updateCalled bool 76 updateCheckFn = func(slug string, wantVer string) (*selfupdate.Release, bool, error) { 77 if wantVer != "" && !semver.MustParse(wantVer).EQ(semver.MustParse("1.0.0")) { 78 return nil, false, fmt.Errorf("Expected request from 1.0.0 but got %s", wantVer) 79 } 80 checkCalled = true 81 return &selfupdate.Release{Version: semver.MustParse("1.0.1"), ReleaseNotes: "f33dfac3"}, true, nil 82 } 83 updateFn = func(want *selfupdate.Release, cmdPath string) error { 84 updateCalled = true 85 return nil 86 } 87 defer func() { 88 require.NoError(t, os.Unsetenv(NscHomeEnv)) 89 updateCheckFn = nil 90 updateFn = nil 91 }() 92 93 su, err := NewSelfUpdate() 94 require.NoError(t, err) 95 require.NotNil(t, su) 96 require.True(t, su.shouldCheck()) // prevents updateFn from bein called 97 _, err = su.Run() 98 require.NoError(t, err) 99 require.True(t, checkCalled) 100 require.False(t, updateCalled) 101 } 102 103 func TestUpdate_DoUpdateWithV(t *testing.T) { 104 d := MakeTempDir(t) 105 require.NoError(t, os.Setenv(NscHomeEnv, d)) 106 conf := GetConfig() 107 conf.GithubUpdates = "foo/bar" 108 conf.SetVersion("v1.0.0") 109 conf.LastUpdate = time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC).Unix() 110 111 var checkCalled bool 112 var updateCalled bool 113 updateCheckFn = func(slug string, wantVer string) (*selfupdate.Release, bool, error) { 114 if wantVer != "" && !semver.MustParse(wantVer).EQ(semver.MustParse("1.0.0")) { 115 return nil, false, fmt.Errorf("Expected request from 1.0.0 but got %s", wantVer) 116 } 117 checkCalled = true 118 return &selfupdate.Release{Version: semver.MustParse("1.0.1"), ReleaseNotes: "f33dfac3"}, true, nil 119 } 120 updateFn = func(want *selfupdate.Release, cmdPath string) error { 121 updateCalled = true 122 return nil 123 } 124 defer func() { 125 require.NoError(t, os.Unsetenv(NscHomeEnv)) 126 updateCheckFn = nil 127 updateFn = nil 128 }() 129 130 _, stderr, err := ExecuteCmd(createUpdateCommand()) 131 require.NoError(t, err) 132 require.True(t, checkCalled) 133 require.True(t, updateCalled) 134 require.Contains(t, stderr, "f33dfac3") 135 } 136 137 func TestUpdate_DoUpdate(t *testing.T) { 138 d := MakeTempDir(t) 139 require.NoError(t, os.Setenv(NscHomeEnv, d)) 140 conf := GetConfig() 141 conf.GithubUpdates = "foo/bar" 142 conf.SetVersion("1.0.0") 143 conf.LastUpdate = time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC).Unix() 144 145 var checkCalled bool 146 var updateCalled bool 147 updateCheckFn = func(slug string, wantVer string) (*selfupdate.Release, bool, error) { 148 if wantVer != "" && !semver.MustParse(wantVer).EQ(semver.MustParse("1.0.0")) { 149 return nil, false, fmt.Errorf("Expected request from 1.0.0 but got %s", wantVer) 150 } 151 checkCalled = true 152 return &selfupdate.Release{Version: semver.MustParse("1.0.1"), ReleaseNotes: "f33dfac3"}, true, nil 153 } 154 updateFn = func(want *selfupdate.Release, cmdPath string) error { 155 updateCalled = true 156 return nil 157 } 158 defer func() { 159 require.NoError(t, os.Unsetenv(NscHomeEnv)) 160 updateCheckFn = nil 161 updateFn = nil 162 }() 163 164 _, stderr, err := ExecuteCmd(createUpdateCommand()) 165 require.NoError(t, err) 166 require.True(t, checkCalled) 167 require.True(t, updateCalled) 168 require.Contains(t, stderr, "f33dfac3") 169 } 170 171 func TestUpdate_VerPresent(t *testing.T) { 172 d := MakeTempDir(t) 173 require.NoError(t, os.Setenv(NscHomeEnv, d)) 174 conf := GetConfig() 175 conf.GithubUpdates = "foo/bar" 176 conf.SetVersion("v1.0.0") 177 conf.LastUpdate = time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC).Unix() 178 179 var checkCalled bool 180 var updateCalled bool 181 updateCheckFn = func(slug string, wantVer string) (*selfupdate.Release, bool, error) { 182 if !semver.MustParse(wantVer).EQ(semver.MustParse("2.0.0")) { 183 return nil, false, fmt.Errorf("Expected request from 2.0.0 but got %s", wantVer) 184 } 185 checkCalled = true 186 return &selfupdate.Release{Version: semver.MustParse("2.0.0"), ReleaseNotes: "f33dfac3"}, true, nil 187 } 188 updateFn = func(want *selfupdate.Release, cmdPath string) error { 189 updateCalled = true 190 return nil 191 } 192 defer func() { 193 require.NoError(t, os.Unsetenv(NscHomeEnv)) 194 updateCheckFn = nil 195 updateFn = nil 196 }() 197 198 _, stderr, err := ExecuteCmd(createUpdateCommand(), "--version", "2.0.0") 199 require.NoError(t, err) 200 require.True(t, checkCalled) 201 require.True(t, updateCalled) 202 require.Contains(t, stderr, "f33dfac3") 203 } 204 205 func TestUpdate_VerSame(t *testing.T) { 206 d := MakeTempDir(t) 207 require.NoError(t, os.Setenv(NscHomeEnv, d)) 208 conf := GetConfig() 209 conf.GithubUpdates = "foo/bar" 210 conf.SetVersion("v1.0.0") 211 conf.LastUpdate = time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC).Unix() 212 213 var checkCalled bool 214 var updateCalled bool 215 updateCheckFn = func(slug string, wantVer string) (*selfupdate.Release, bool, error) { 216 if !semver.MustParse(wantVer).EQ(semver.MustParse("1.0.0")) { 217 return nil, false, fmt.Errorf("Expected request from 2.0.0 but got %s", wantVer) 218 } 219 checkCalled = true 220 return &selfupdate.Release{Version: semver.MustParse("1.0.0"), ReleaseNotes: "f33dfac3"}, true, nil 221 } 222 updateFn = func(want *selfupdate.Release, cmdPath string) error { 223 updateCalled = true 224 return nil 225 } 226 defer func() { 227 require.NoError(t, os.Unsetenv(NscHomeEnv)) 228 updateCheckFn = nil 229 updateFn = nil 230 }() 231 232 _, _, err := ExecuteCmd(createUpdateCommand(), "--version", "1.0.0") 233 require.NoError(t, err) 234 require.True(t, checkCalled) 235 require.False(t, updateCalled) 236 } 237 238 func TestUpdate_VerNotFound(t *testing.T) { 239 d := MakeTempDir(t) 240 require.NoError(t, os.Setenv(NscHomeEnv, d)) 241 conf := GetConfig() 242 conf.GithubUpdates = "foo/bar" 243 conf.SetVersion("v1.0.0") 244 conf.LastUpdate = time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC).Unix() 245 246 var checkCalled bool 247 var updateCalled bool 248 updateCheckFn = func(slug string, wantVer string) (*selfupdate.Release, bool, error) { 249 if !semver.MustParse(wantVer).EQ(semver.MustParse("2.0.0")) { 250 return nil, false, fmt.Errorf("Expected request from 2.0.0 but got %s", wantVer) 251 } 252 checkCalled = true 253 return nil, false, nil 254 } 255 updateFn = func(want *selfupdate.Release, cmdPath string) error { 256 updateCalled = true 257 return nil 258 } 259 defer func() { 260 require.NoError(t, os.Unsetenv(NscHomeEnv)) 261 updateCheckFn = nil 262 updateFn = nil 263 }() 264 265 _, stderr, err := ExecuteCmd(createUpdateCommand(), "--version", "2.0.0") 266 require.Error(t, err) 267 require.True(t, checkCalled) 268 require.False(t, updateCalled) 269 require.Contains(t, stderr, "version 2.0.0 not found") 270 }