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 }