github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/cmd/upgrade/upgrade_boot_integration_test.go (about)

     1  // +build integration
     2  
     3  package upgrade
     4  
     5  import (
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/blang/semver"
    13  
    14  	"github.com/olli-ai/jx/v2/pkg/cmd/opts"
    15  	"github.com/olli-ai/jx/v2/pkg/config"
    16  	"github.com/olli-ai/jx/v2/pkg/gits"
    17  	"github.com/olli-ai/jx/v2/pkg/util"
    18  	"github.com/stretchr/testify/assert"
    19  	"github.com/stretchr/testify/require"
    20  )
    21  
    22  func TestUpgradeAvailable(t *testing.T) {
    23  	o := UpgradeBootOptions{
    24  		CommonOptions: &opts.CommonOptions{},
    25  	}
    26  
    27  	tests := []struct {
    28  		name             string
    29  		versionStreamRef string
    30  		latestRelease    bool
    31  		wantSha          bool
    32  		wantTag          bool
    33  		upgradeVSRef     string
    34  	}{
    35  		{
    36  			name:             "TestUpgradeAvailableFromTaggedVersion",
    37  			versionStreamRef: "v1.0.35",
    38  			wantSha:          true,
    39  		},
    40  		{
    41  			name:             "TestUpgradeAvailableFromSha",
    42  			versionStreamRef: "282fd7579ef82df408ccd2d425f99779784f75a9",
    43  			wantSha:          true,
    44  		},
    45  		{
    46  			name:             "TestUpgradeAvailableLatestReleaseFromTaggedVersion",
    47  			versionStreamRef: "v1.0.35",
    48  			latestRelease:    true,
    49  			wantTag:          true,
    50  		},
    51  		{
    52  			name:             "TestUpgradeAvailableLatestReleaseFromSha",
    53  			versionStreamRef: "282fd7579ef82df408ccd2d425f99779784f75a9",
    54  			latestRelease:    true,
    55  			wantTag:          true,
    56  		},
    57  	}
    58  	for _, tt := range tests {
    59  		t.Run(tt.name, func(t *testing.T) {
    60  			if tt.latestRelease {
    61  				o.LatestRelease = true
    62  			}
    63  
    64  			upgradeRef, err := o.upgradeAvailable(config.DefaultVersionsURL, tt.versionStreamRef, config.DefaultVersionsRef)
    65  			assert.NoError(t, err)
    66  
    67  			if tt.wantSha {
    68  				assert.Equal(t, len(upgradeRef), 40)
    69  			}
    70  
    71  			if tt.wantTag {
    72  				upgradeRefText := strings.TrimPrefix(upgradeRef, "v")
    73  				_, err = semver.Parse(upgradeRefText)
    74  				assert.NoError(t, err)
    75  			}
    76  		})
    77  	}
    78  }
    79  
    80  func TestUpdateBootConfig(t *testing.T) {
    81  	origJxHome := os.Getenv("JX_HOME")
    82  
    83  	tmpJxHome, err := ioutil.TempDir("", "jx-test-"+t.Name())
    84  	assert.NoError(t, err)
    85  
    86  	err = os.Setenv("JX_HOME", tmpJxHome)
    87  	assert.NoError(t, err)
    88  
    89  	defer func() {
    90  		_ = os.RemoveAll(tmpJxHome)
    91  		err = os.Setenv("JX_HOME", origJxHome)
    92  	}()
    93  
    94  	o := UpgradeBootOptions{
    95  		CommonOptions: &opts.CommonOptions{},
    96  	}
    97  
    98  	// Prep the local clone with the contents of the boot config version we're going to upgrade from
    99  	tmpDir := initializeTempGitRepo(t, o.Git(), "v1.0.35")
   100  	defer func() {
   101  		err := os.RemoveAll(tmpDir)
   102  		require.NoError(t, err, "could not clean up temp boot clone")
   103  	}()
   104  
   105  	o.Dir = tmpDir
   106  
   107  	err = o.updateBootConfig(config.DefaultVersionsURL, "v1.0.161", config.DefaultBootRepository, "282fd7579ef82df408ccd2d425f99779784f75a9")
   108  	assert.NoError(t, err)
   109  }
   110  
   111  func initializeTempGitRepo(t *testing.T, gitter gits.Gitter, bootRef string) string {
   112  	dir, err := ioutil.TempDir("", "")
   113  	assert.NoError(t, err)
   114  
   115  	tmpCloneDir, err := ioutil.TempDir("", "update-boot-config-test-")
   116  	assert.NoError(t, err)
   117  
   118  	defer func() {
   119  		err := os.RemoveAll(tmpCloneDir)
   120  		require.NoError(t, err, "could not clean up temp boot clone")
   121  	}()
   122  
   123  	// Clone the boot config repo
   124  	err = gitter.Clone(config.DefaultBootRepository, tmpCloneDir)
   125  	assert.NoError(t, err)
   126  
   127  	// Fetch tags.
   128  	err = gitter.FetchTags(tmpCloneDir)
   129  	assert.NoError(t, err)
   130  
   131  	// Check out the boot ref.
   132  	err = gitter.Checkout(tmpCloneDir, bootRef)
   133  	assert.NoError(t, err)
   134  
   135  	// Copy the contents of the boot config repo to the temp repo.
   136  	err = util.CopyDir(tmpCloneDir, dir, true)
   137  	assert.NoError(t, err)
   138  
   139  	// Remove the .git directory
   140  	err = os.RemoveAll(filepath.Join(dir, ".git"))
   141  	assert.NoError(t, err)
   142  
   143  	err = gitter.Init(dir)
   144  	assert.NoError(t, err)
   145  
   146  	err = gitter.Add(dir, ".")
   147  	assert.NoError(t, err)
   148  
   149  	err = gitter.AddCommit(dir, "Initial Commit")
   150  	assert.NoError(t, err)
   151  
   152  	return dir
   153  }