github.com/jenkins-x/jx/v2@v2.1.155/pkg/cmd/boot/boot_test.go (about)

     1  // +build unit
     2  
     3  package boot
     4  
     5  import (
     6  	"io"
     7  	"io/ioutil"
     8  	"log"
     9  	"os"
    10  	"path/filepath"
    11  	"testing"
    12  
    13  	cmd_mocks "github.com/jenkins-x/jx/v2/pkg/cmd/clients/mocks"
    14  	"github.com/jenkins-x/jx/v2/pkg/gits"
    15  
    16  	"github.com/jenkins-x/jx/v2/pkg/cmd/opts"
    17  	"github.com/jenkins-x/jx/v2/pkg/config"
    18  	"github.com/jenkins-x/jx/v2/pkg/util"
    19  	"github.com/jenkins-x/jx/v2/pkg/versionstream"
    20  	"github.com/stretchr/testify/assert"
    21  	"github.com/stretchr/testify/require"
    22  )
    23  
    24  // TestBootOptions options for the command
    25  type TestBootOptions struct {
    26  	BootOptions
    27  }
    28  
    29  const (
    30  	defaultBootRequirements = "test_data/requirements/jx-requirements.yml"
    31  )
    32  
    33  func (o *TestBootOptions) setup(bootRequirements string, dir string) {
    34  	o.BootOptions = BootOptions{
    35  		CommonOptions:    &opts.CommonOptions{},
    36  		RequirementsFile: bootRequirements,
    37  		Dir:              dir,
    38  	}
    39  }
    40  
    41  func TestDetermineGitRef_DefaultGitUrl(t *testing.T) {
    42  	t.Parallel()
    43  
    44  	o := TestBootOptions{}
    45  	bootDir, err := ioutil.TempDir("", "boot-test")
    46  	require.NoError(t, err)
    47  	defer func() {
    48  		_ = os.RemoveAll(bootDir)
    49  	}()
    50  	o.setup(defaultBootRequirements, bootDir)
    51  
    52  	dir := o.createTmpRequirements(t)
    53  	defer func() {
    54  		_ = os.RemoveAll(dir)
    55  	}()
    56  	requirements, _, err := config.LoadRequirementsConfig(dir, config.DefaultFailOnValidationError)
    57  	require.NoError(t, err, "unable to load tmp jx-requirements")
    58  	resolver := &versionstream.VersionResolver{
    59  		VersionsDir: filepath.Join("test_data", "jenkins-x-versions"),
    60  	}
    61  
    62  	gitRef, err := o.determineGitRef(resolver, requirements, config.DefaultBootRepository)
    63  	require.NoError(t, err, "unable to determineGitRef")
    64  	assert.Equal(t, "1.0.32", gitRef, "determineGitRef")
    65  }
    66  
    67  func TestDetermineGitRef_GitURLNotInVersionStream(t *testing.T) {
    68  	t.Parallel()
    69  
    70  	o := TestBootOptions{}
    71  	bootDir, err := ioutil.TempDir("", "boot-test")
    72  	require.NoError(t, err)
    73  	defer func() {
    74  		_ = os.RemoveAll(bootDir)
    75  	}()
    76  	o.setup(defaultBootRequirements, bootDir)
    77  
    78  	dir := o.createTmpRequirements(t)
    79  	defer func() {
    80  		_ = os.RemoveAll(dir)
    81  	}()
    82  	requirements, _, err := config.LoadRequirementsConfig(dir, config.DefaultFailOnValidationError)
    83  	require.NoError(t, err, "unable to load tmp jx-requirements")
    84  	resolver := &versionstream.VersionResolver{
    85  		VersionsDir: filepath.Join("test_data", "jenkins-x-versions"),
    86  	}
    87  
    88  	gitRef, err := o.determineGitRef(resolver, requirements, "https://github.com/my-fork/my-boot-config.git")
    89  	require.NoError(t, err, "unable to determineGitRef")
    90  	assert.Equal(t, "master", gitRef, "determineGitRef")
    91  }
    92  
    93  func TestCloneDevEnvironment(t *testing.T) {
    94  	t.Parallel()
    95  
    96  	url := "https://github.com/jenkins-x/jenkins-x-boot-config"
    97  	o := TestBootOptions{}
    98  	bootDir, err := ioutil.TempDir("", "boot-test")
    99  	require.NoError(t, err)
   100  	defer func() {
   101  		_ = os.RemoveAll(bootDir)
   102  	}()
   103  	o.setup(defaultBootRequirements, bootDir)
   104  
   105  	cloned, dir, err := o.cloneDevEnvironment(url)
   106  	assert.Nil(t, err, "error should not be nil")
   107  
   108  	assert.True(t, cloned)
   109  	assert.Equal(t, "jenkins-x-boot-config", filepath.Base(dir), "cloned dir is incorrect")
   110  }
   111  
   112  func TestCloneDevEnvironmentIncorrectParam(t *testing.T) {
   113  	t.Parallel()
   114  
   115  	o := TestBootOptions{}
   116  	bootDir, err := ioutil.TempDir("", "boot-test")
   117  	require.NoError(t, err)
   118  	defer func() {
   119  		_ = os.RemoveAll(bootDir)
   120  	}()
   121  	o.setup(defaultBootRequirements, bootDir)
   122  	url := "not-a-url"
   123  
   124  	cloned, dir, err := o.cloneDevEnvironment(url)
   125  	assert.NotNil(t, err, "error should not be nil")
   126  	assert.False(t, cloned)
   127  	assert.Empty(t, dir)
   128  }
   129  
   130  func Test_determineGitURLAndRef_uses_git_repo_settings(t *testing.T) {
   131  	t.Parallel()
   132  
   133  	log.SetOutput(ioutil.Discard)
   134  	bootDir, err := ioutil.TempDir("", "boot-test")
   135  	require.NoError(t, err)
   136  	defer func() {
   137  		_ = os.RemoveAll(bootDir)
   138  	}()
   139  
   140  	commonOpts := opts.NewCommonOptionsWithFactory(cmd_mocks.NewMockFactory())
   141  	commonOpts.BatchMode = true
   142  	o := BootOptions{
   143  		CommonOptions: &commonOpts,
   144  		Dir:           bootDir,
   145  	}
   146  
   147  	// make the tmp directory a git repo
   148  	gitter := gits.NewGitCLI()
   149  	err = gitter.Init(bootDir)
   150  	require.NoError(t, err)
   151  	err = gitter.SetRemoteURL(bootDir, "origin", "https://github.com/acme/jenkins-x-boot-config.git")
   152  	require.NoError(t, err)
   153  	_, err = os.Create(filepath.Join(bootDir, "foo"))
   154  	require.NoError(t, err)
   155  	err = gitter.AddCommit(bootDir, "adding foo")
   156  	require.NoError(t, err)
   157  	err = gitter.CreateBranch(bootDir, "foo")
   158  	require.NoError(t, err)
   159  	err = gitter.Checkout(bootDir, "foo")
   160  	require.NoError(t, err)
   161  
   162  	gitURL, gitRef := o.determineGitURLAndRef()
   163  	assert.Equal(t, "https://github.com/acme/jenkins-x-boot-config", gitURL)
   164  	assert.Equal(t, "foo", gitRef)
   165  }
   166  
   167  func Test_determineGitURLAndRef_defaults_to_jenkins_x_boot_config(t *testing.T) {
   168  	t.Parallel()
   169  
   170  	log.SetOutput(ioutil.Discard)
   171  	bootDir, err := ioutil.TempDir("", "boot-test")
   172  	require.NoError(t, err)
   173  	defer func() {
   174  		_ = os.RemoveAll(bootDir)
   175  	}()
   176  
   177  	commonOpts := opts.NewCommonOptionsWithFactory(cmd_mocks.NewMockFactory())
   178  	commonOpts.BatchMode = true
   179  	o := BootOptions{
   180  		CommonOptions: &commonOpts,
   181  		Dir:           bootDir,
   182  	}
   183  
   184  	gitURL, gitRef := o.determineGitURLAndRef()
   185  	assert.Equal(t, "https://github.com/jenkins-x/jenkins-x-boot-config.git", gitURL)
   186  	assert.Equal(t, "master", gitRef)
   187  }
   188  
   189  func Test_determineGitURLAndRef_explicit_provided_git_options_win(t *testing.T) {
   190  	t.Parallel()
   191  
   192  	log.SetOutput(ioutil.Discard)
   193  	bootDir, err := ioutil.TempDir("", "boot-test")
   194  	require.NoError(t, err)
   195  	defer func() {
   196  		_ = os.RemoveAll(bootDir)
   197  	}()
   198  
   199  	commonOpts := opts.NewCommonOptionsWithFactory(cmd_mocks.NewMockFactory())
   200  	commonOpts.BatchMode = true
   201  	o := BootOptions{
   202  		CommonOptions: &commonOpts,
   203  		Dir:           bootDir,
   204  		GitURL:        "https://github.com/johndoe/jenkins-x-boot-config.git",
   205  		GitRef:        "bar",
   206  	}
   207  
   208  	// make the tmp directory a git repo
   209  	gitter := gits.NewGitCLI()
   210  	err = gitter.Init(bootDir)
   211  	require.NoError(t, err)
   212  	err = gitter.SetRemoteURL(bootDir, "origin", "https://github.com/acme/jenkins-x-boot-config.git")
   213  	require.NoError(t, err)
   214  	_, err = os.Create(filepath.Join(bootDir, "foo"))
   215  	require.NoError(t, err)
   216  	err = gitter.AddCommit(bootDir, "adding foo")
   217  	require.NoError(t, err)
   218  	err = gitter.CreateBranch(bootDir, "foo")
   219  	require.NoError(t, err)
   220  	err = gitter.Checkout(bootDir, "foo")
   221  	require.NoError(t, err)
   222  
   223  	gitURL, gitRef := o.determineGitURLAndRef()
   224  	assert.Equal(t, "https://github.com/johndoe/jenkins-x-boot-config.git", gitURL)
   225  	assert.Equal(t, "bar", gitRef)
   226  }
   227  
   228  func (o *TestBootOptions) createTmpRequirements(t *testing.T) string {
   229  	from, err := os.Open(o.RequirementsFile)
   230  	require.NoError(t, err, "unable to open test jx-requirements")
   231  
   232  	tmpDir, err := ioutil.TempDir("", "")
   233  	err = os.MkdirAll(tmpDir, util.DefaultWritePermissions)
   234  	to, err := os.Create(filepath.Join(tmpDir, "jx-requirements.yml"))
   235  	require.NoError(t, err, "unable to create tmp jx-requirements")
   236  
   237  	_, err = io.Copy(to, from)
   238  	require.NoError(t, err, "unable to copy test jx-requirements to tmp")
   239  	return tmpDir
   240  }