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  }