github.com/jenkins-x/jx/v2@v2.1.155/pkg/cmd/step/step_tag_test.go (about) 1 // +build unit 2 3 package step 4 5 import ( 6 "path/filepath" 7 "strings" 8 "testing" 9 10 "github.com/jenkins-x/jx/v2/pkg/cmd/opts/step" 11 12 "io/ioutil" 13 "os" 14 "path" 15 16 "github.com/jenkins-x/jx/v2/pkg/cmd/opts" 17 "github.com/jenkins-x/jx/v2/pkg/gits" 18 "github.com/jenkins-x/jx/v2/pkg/util" 19 "github.com/stretchr/testify/assert" 20 "k8s.io/helm/pkg/chartutil" 21 ) 22 23 func TestStepTagCharts(t *testing.T) { 24 t.Parallel() 25 f, err := ioutil.TempDir("", "test-step-tag-charts") 26 assert.NoError(t, err) 27 defer os.RemoveAll(f) 28 29 testData := path.Join("test_data", "step_tag_project") 30 _, err = os.Stat(testData) 31 assert.NoError(t, err) 32 33 err = util.CopyDir(testData, f, true) 34 assert.NoError(t, err) 35 36 expectedVersion := "1.2.3" 37 expectedImageName := "docker.io/jenkinsxio/awesome" 38 39 chartsDir := filepath.Join(f, "charts", "mydemo") 40 chartFile := filepath.Join(chartsDir, "Chart.yaml") 41 valuesFile := filepath.Join(chartsDir, "values.yaml") 42 43 o := StepTagOptions{ 44 StepOptions: step.StepOptions{ 45 CommonOptions: &opts.CommonOptions{}, 46 }, 47 } 48 //o.Out = tests.Output() 49 o.Flags.ChartsDir = chartsDir 50 o.Flags.Version = expectedVersion 51 o.Flags.ChartValueRepository = expectedImageName 52 o.SetGit(&gits.GitFake{}) 53 err = o.Run() 54 assert.NoError(t, err) 55 56 // root file 57 chart, err := chartutil.LoadChartfile(chartFile) 58 assert.NoError(t, err, "failed to load file %s", chartFile) 59 60 assert.Equal(t, expectedVersion, chart.Version, "replaced chart version") 61 assert.Equal(t, expectedVersion, chart.AppVersion, "replaced chart appVersion") 62 63 data, err := ioutil.ReadFile(valuesFile) 64 assert.NoError(t, err, "failed to load file %s", valuesFile) 65 lines := strings.Split(string(data), "\n") 66 67 foundRepo := false 68 foundVersion := false 69 anotherImage := false 70 for _, line := range lines { 71 if strings.HasPrefix(line, "anotherImage:") { 72 anotherImage = true 73 } 74 if strings.HasPrefix(line, ValuesYamlRepositoryPrefix) { 75 value := strings.TrimSpace(strings.TrimPrefix(line, ValuesYamlRepositoryPrefix)) 76 if anotherImage { 77 assert.Equal(t, "anotherImageRepoValue", value, "values.yaml anotherImage.repository: attribute") 78 } else { 79 foundRepo = true 80 assert.Equal(t, expectedImageName, value, "values.yaml repository: attribute") 81 } 82 } else if strings.HasPrefix(line, ValuesYamlTagPrefix) { 83 value := strings.TrimSpace(strings.TrimPrefix(line, ValuesYamlTagPrefix)) 84 if anotherImage { 85 assert.Equal(t, "anotherImageTagValue", value, "values.yaml anotherImage.tag: attribute") 86 } else { 87 foundVersion = true 88 assert.Equal(t, expectedVersion, value, "values.yaml tag: attribute") 89 } 90 } 91 } 92 93 assert.True(t, foundRepo, "Failed to find tag '%s' in file %s", ValuesYamlRepositoryPrefix, valuesFile) 94 assert.True(t, foundVersion, "Failed to find tag '%s' in file %s", ValuesYamlTagPrefix, valuesFile) 95 } 96 97 func TestDefaultChartValueRepositoryValidName(t *testing.T) { 98 f, err := ioutil.TempDir("", "test-step-tag-valid-name") 99 assert.NoError(t, err) 100 defer os.RemoveAll(f) 101 102 if app, clean := os.LookupEnv("APP_NAME"); clean { 103 assert.NoError(t, os.Unsetenv("APP_NAME")) 104 defer os.Setenv("APP_NAME", app) 105 } 106 if app, clean := os.LookupEnv("REPO_NAME"); clean { 107 assert.NoError(t, os.Unsetenv("REPO_NAME")) 108 defer os.Setenv("REPO_NAME", app) 109 } 110 111 testData := path.Join("test_data", "step_tag_project") 112 _, err = os.Stat(testData) 113 assert.NoError(t, err) 114 115 err = util.CopyDir(testData, f, true) 116 assert.NoError(t, err) 117 118 expectedImageName := "docker.io/jenkinsxio/my-awesome-project-org" 119 120 o := StepTagOptions{ 121 StepOptions: step.StepOptions{ 122 CommonOptions: &opts.CommonOptions{}, 123 }, 124 } 125 chartsDir := filepath.Join(f, "charts", "mydemo") 126 o.Flags.Dir = f 127 o.Flags.ChartsDir = chartsDir 128 git := gits.GitFake{} 129 git.SetRemoteURL("", "origin", "https://github.com/My_Self/My_Awesome_Project.org") 130 o.SetGit(&git) 131 132 assert.Equal(t, expectedImageName, o.defaultChartValueRepository()) 133 } 134 135 func TestFindChartsDir(t *testing.T) { 136 testData := path.Join("test_data", "step_tag_find_chart") 137 dir, err := os.Getwd() 138 assert.NoError(t, err) 139 defer os.Chdir(dir) 140 assert.NoError(t, os.Chdir(testData)) 141 142 if val, ok := os.LookupEnv("APP_NAME"); ok { 143 assert.NoError(t, os.Unsetenv("APP_NAME")) 144 defer os.Setenv("APP_NAME", val) 145 } else { 146 defer os.Unsetenv("APP_NAME") 147 } 148 if val, ok := os.LookupEnv("REPO_NAME"); ok { 149 assert.NoError(t, os.Unsetenv("REPO_NAME")) 150 defer os.Setenv("REPO_NAME", val) 151 } else { 152 defer os.Unsetenv("REPO_NAME") 153 } 154 155 chartsDir := filepath.Join("charts", "my-project") + "/" 156 o := StepTagOptions{} 157 158 assert.NoError(t, os.Setenv("APP_NAME", "My.Project")) 159 val, err := o.findChartsDir() 160 assert.NoError(t, err) 161 assert.Equal(t, chartsDir, val) 162 assert.NoError(t, os.Unsetenv("APP_NAME")) 163 164 assert.NoError(t, os.Setenv("REPO_NAME", "my-project")) 165 val, err = o.findChartsDir() 166 assert.NoError(t, err) 167 assert.Equal(t, chartsDir, val) 168 assert.NoError(t, os.Unsetenv("REPO_NAME")) 169 } 170 171 func TestFindBestFitChart(t *testing.T) { 172 testData := path.Join("test_data", "step_tag_find_best_fit_chart") 173 dir, err := os.Getwd() 174 assert.NoError(t, err) 175 defer os.Chdir(dir) 176 assert.NoError(t, os.Chdir(testData)) 177 178 if val, ok := os.LookupEnv("APP_NAME"); ok { 179 assert.NoError(t, os.Unsetenv("APP_NAME")) 180 defer os.Setenv("APP_NAME", val) 181 } else { 182 defer os.Unsetenv("APP_NAME") 183 } 184 if val, ok := os.LookupEnv("REPO_NAME"); ok { 185 assert.NoError(t, os.Unsetenv("REPO_NAME")) 186 defer os.Setenv("REPO_NAME", val) 187 } else { 188 defer os.Unsetenv("REPO_NAME") 189 } 190 191 chartsDir := filepath.Join("charts", "my-project") + "/" 192 o := StepTagOptions{} 193 194 assert.NoError(t, os.Setenv("APP_NAME", "My.Project")) 195 val, err := o.findChartsDir() 196 assert.NoError(t, err) 197 assert.Equal(t, chartsDir, val) 198 assert.NoError(t, os.Unsetenv("APP_NAME")) 199 200 assert.NoError(t, os.Setenv("REPO_NAME", "my-project")) 201 val, err = o.findChartsDir() 202 assert.NoError(t, err) 203 assert.Equal(t, chartsDir, val) 204 assert.NoError(t, os.Unsetenv("REPO_NAME")) 205 }