github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/cmd/mtaBuild_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package cmd 5 6 import ( 7 "errors" 8 "net/http" 9 "os" 10 "path/filepath" 11 "testing" 12 13 "github.com/SAP/jenkins-library/pkg/mock" 14 "github.com/ghodss/yaml" 15 "github.com/stretchr/testify/assert" 16 ) 17 18 type mtaBuildTestUtilsBundle struct { 19 *mock.ExecMockRunner 20 *mock.FilesMock 21 projectSettingsFile string 22 globalSettingsFile string 23 registryUsedInSetNpmRegistries string 24 } 25 26 func (m *mtaBuildTestUtilsBundle) SetNpmRegistries(defaultNpmRegistry string) error { 27 m.registryUsedInSetNpmRegistries = defaultNpmRegistry 28 return nil 29 } 30 31 func (m *mtaBuildTestUtilsBundle) InstallAllDependencies(defaultNpmRegistry string) error { 32 return errors.New("Test should not install dependencies.") //TODO implement test 33 } 34 35 func (m *mtaBuildTestUtilsBundle) DownloadAndCopySettingsFiles(globalSettingsFile string, projectSettingsFile string) error { 36 m.projectSettingsFile = projectSettingsFile 37 m.globalSettingsFile = globalSettingsFile 38 return nil 39 } 40 41 func (m *mtaBuildTestUtilsBundle) DownloadFile(url, filename string, header http.Header, cookies []*http.Cookie) error { 42 return errors.New("Test should not download files.") 43 } 44 45 func newMtaBuildTestUtilsBundle() *mtaBuildTestUtilsBundle { 46 utilsBundle := mtaBuildTestUtilsBundle{ 47 ExecMockRunner: &mock.ExecMockRunner{}, 48 FilesMock: &mock.FilesMock{}, 49 } 50 return &utilsBundle 51 } 52 53 func TestMtaBuild(t *testing.T) { 54 55 cpe := mtaBuildCommonPipelineEnvironment{} 56 57 t.Run("Application name not set", func(t *testing.T) { 58 59 utilsMock := newMtaBuildTestUtilsBundle() 60 options := mtaBuildOptions{} 61 62 err := runMtaBuild(options, &cpe, utilsMock) 63 64 assert.NotNil(t, err) 65 assert.Equal(t, "'mta.yaml' not found in project sources and 'applicationName' not provided as parameter - cannot generate 'mta.yaml' file", err.Error()) 66 67 }) 68 69 t.Run("Provide default npm registry", func(t *testing.T) { 70 71 utilsMock := newMtaBuildTestUtilsBundle() 72 options := mtaBuildOptions{ApplicationName: "myApp", Platform: "CF", DefaultNpmRegistry: "https://example.org/npm", MtarName: "myName", Source: "./", Target: "./"} 73 74 utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}")) 75 76 err := runMtaBuild(options, &cpe, utilsMock) 77 78 assert.Nil(t, err) 79 80 assert.Equal(t, "https://example.org/npm", utilsMock.registryUsedInSetNpmRegistries) 81 }) 82 83 t.Run("Package json does not exist", func(t *testing.T) { 84 85 utilsMock := newMtaBuildTestUtilsBundle() 86 87 options := mtaBuildOptions{ApplicationName: "myApp"} 88 89 err := runMtaBuild(options, &cpe, utilsMock) 90 91 assert.NotNil(t, err) 92 93 assert.Equal(t, "package.json file does not exist", err.Error()) 94 95 }) 96 97 t.Run("Write yaml file", func(t *testing.T) { 98 99 utilsMock := newMtaBuildTestUtilsBundle() 100 101 options := mtaBuildOptions{ApplicationName: "myApp", Platform: "CF", MtarName: "myName", Source: "./", Target: "./"} 102 103 utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}")) 104 105 err := runMtaBuild(options, &cpe, utilsMock) 106 107 assert.Nil(t, err) 108 109 type MtaResult struct { 110 Version string 111 ID string `yaml:"ID,omitempty"` 112 Parameters map[string]string 113 Modules []struct { 114 Name string 115 Type string 116 Parameters map[string]interface{} 117 } 118 } 119 120 assert.True(t, utilsMock.HasWrittenFile("mta.yaml")) 121 122 var result MtaResult 123 mtaContent, _ := utilsMock.FileRead("mta.yaml") 124 err = yaml.Unmarshal(mtaContent, &result) 125 assert.NoError(t, err) 126 assert.Equal(t, "myName", result.ID) 127 assert.Equal(t, "1.2.3", result.Version) 128 assert.Equal(t, "myApp", result.Modules[0].Name) 129 assert.Regexp(t, "^1\\.2\\.3-[\\d]{14}$", result.Modules[0].Parameters["version"]) 130 assert.Equal(t, "myApp", result.Modules[0].Parameters["name"]) 131 132 }) 133 134 t.Run("Dont write mta yaml file when already present no timestamp placeholder", func(t *testing.T) { 135 136 utilsMock := newMtaBuildTestUtilsBundle() 137 138 options := mtaBuildOptions{ApplicationName: "myApp"} 139 140 utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}")) 141 utilsMock.AddFile("mta.yaml", []byte("already there")) 142 143 _ = runMtaBuild(options, &cpe, utilsMock) 144 145 assert.False(t, utilsMock.HasWrittenFile("mta.yaml")) 146 }) 147 148 t.Run("Write mta yaml file when already present with timestamp placeholder", func(t *testing.T) { 149 150 utilsMock := newMtaBuildTestUtilsBundle() 151 152 options := mtaBuildOptions{ApplicationName: "myApp"} 153 154 utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}")) 155 utilsMock.AddFile("mta.yaml", []byte("already there with-${timestamp}")) 156 157 _ = runMtaBuild(options, &cpe, utilsMock) 158 159 assert.True(t, utilsMock.HasWrittenFile("mta.yaml")) 160 }) 161 162 t.Run("Mta build mbt toolset", func(t *testing.T) { 163 164 utilsMock := newMtaBuildTestUtilsBundle() 165 166 cpe.mtarFilePath = "" 167 168 options := mtaBuildOptions{ApplicationName: "myApp", Platform: "CF", MtarName: "myName.mtar", Source: "./", Target: "./"} 169 170 utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}")) 171 172 err := runMtaBuild(options, &cpe, utilsMock) 173 174 assert.Nil(t, err) 175 176 if assert.Len(t, utilsMock.Calls, 1) { 177 assert.Equal(t, "mbt", utilsMock.Calls[0].Exec) 178 assert.Equal(t, []string{"build", "--mtar", "myName.mtar", "--platform", "CF", "--source", filepath.FromSlash("./"), "--target", filepath.FromSlash(_ignoreError(os.Getwd()))}, utilsMock.Calls[0].Params) 179 } 180 assert.Equal(t, "myName.mtar", cpe.mtarFilePath) 181 }) 182 183 t.Run("Source and target related tests", func(t *testing.T) { 184 t.Run("Mta build mbt toolset with custom source and target paths", func(t *testing.T) { 185 186 utilsMock := newMtaBuildTestUtilsBundle() 187 188 cpe.mtarFilePath = "" 189 190 options := mtaBuildOptions{ApplicationName: "myApp", Platform: "CF", MtarName: "myName.mtar", Source: "mySourcePath/", Target: "myTargetPath/"} 191 192 utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}")) 193 194 err := runMtaBuild(options, &cpe, utilsMock) 195 196 assert.Nil(t, err) 197 198 if assert.Len(t, utilsMock.Calls, 1) { 199 assert.Equal(t, "mbt", utilsMock.Calls[0].Exec) 200 assert.Equal(t, []string{"build", "--mtar", "myName.mtar", "--platform", "CF", 201 "--source", filepath.FromSlash("mySourcePath/"), 202 "--target", filepath.Join(_ignoreError(os.Getwd()), filepath.FromSlash("mySourcePath/myTargetPath/"))}, 203 utilsMock.Calls[0].Params) 204 } 205 assert.Equal(t, "mySourcePath/myTargetPath/myName.mtar", cpe.mtarFilePath) 206 assert.Equal(t, "mySourcePath/mta.yaml", cpe.custom.mtaBuildToolDesc) 207 }) 208 }) 209 210 t.Run("M2Path related tests", func(t *testing.T) { 211 t.Run("Mta build mbt toolset with m2Path", func(t *testing.T) { 212 213 utilsMock := newMtaBuildTestUtilsBundle() 214 utilsMock.CurrentDir = "root_folder/workspace" 215 cpe.mtarFilePath = "" 216 217 options := mtaBuildOptions{ApplicationName: "myApp", Platform: "CF", MtarName: "myName.mtar", Source: "./", Target: "./", M2Path: ".pipeline/local_repo"} 218 219 utilsMock.AddFile("mta.yaml", []byte("ID: \"myNameFromMtar\"")) 220 221 err := runMtaBuild(options, &cpe, utilsMock) 222 223 assert.Nil(t, err) 224 assert.Contains(t, utilsMock.Env, filepath.FromSlash("MAVEN_OPTS=-Dmaven.repo.local=/root_folder/workspace/.pipeline/local_repo")) 225 }) 226 }) 227 228 t.Run("Settings file releatd tests", func(t *testing.T) { 229 230 t.Run("Copy global settings file", func(t *testing.T) { 231 232 utilsMock := newMtaBuildTestUtilsBundle() 233 utilsMock.AddFile("mta.yaml", []byte("ID: \"myNameFromMtar\"")) 234 235 options := mtaBuildOptions{ApplicationName: "myApp", GlobalSettingsFile: "/opt/maven/settings.xml", Platform: "CF", MtarName: "myName", Source: "./", Target: "./"} 236 237 err := runMtaBuild(options, &cpe, utilsMock) 238 239 assert.Nil(t, err) 240 241 assert.Equal(t, "/opt/maven/settings.xml", utilsMock.globalSettingsFile) 242 assert.Equal(t, "", utilsMock.projectSettingsFile) 243 }) 244 245 t.Run("Copy project settings file", func(t *testing.T) { 246 247 utilsMock := newMtaBuildTestUtilsBundle() 248 utilsMock.AddFile("mta.yaml", []byte("ID: \"myNameFromMtar\"")) 249 250 options := mtaBuildOptions{ApplicationName: "myApp", ProjectSettingsFile: "/my/project/settings.xml", Platform: "CF", MtarName: "myName", Source: "./", Target: "./"} 251 252 err := runMtaBuild(options, &cpe, utilsMock) 253 254 assert.Nil(t, err) 255 256 assert.Equal(t, "/my/project/settings.xml", utilsMock.projectSettingsFile) 257 assert.Equal(t, "", utilsMock.globalSettingsFile) 258 }) 259 }) 260 261 t.Run("publish related tests", func(t *testing.T) { 262 263 t.Run("error when no repository url", func(t *testing.T) { 264 265 utilsMock := newMtaBuildTestUtilsBundle() 266 utilsMock.AddFile("mta.yaml", []byte("ID: \"myNameFromMtar\"")) 267 268 options := mtaBuildOptions{ApplicationName: "myApp", GlobalSettingsFile: "/opt/maven/settings.xml", Platform: "CF", MtarName: "myName", Source: "./", Target: "./", Publish: true} 269 270 err := runMtaBuild(options, &cpe, utilsMock) 271 272 assert.Equal(t, "mtaDeploymentRepositoryUser, mtaDeploymentRepositoryPassword and mtaDeploymentRepositoryURL not found , must be present", err.Error()) 273 }) 274 275 t.Run("error when no mtar group", func(t *testing.T) { 276 277 utilsMock := newMtaBuildTestUtilsBundle() 278 utilsMock.AddFile("mta.yaml", []byte("ID: \"myNameFromMtar\"")) 279 280 options := mtaBuildOptions{ApplicationName: "myApp", GlobalSettingsFile: "/opt/maven/settings.xml", Platform: "CF", MtarName: "myName", Source: "./", Target: "./", Publish: true, 281 MtaDeploymentRepositoryURL: "dummy", MtaDeploymentRepositoryPassword: "dummy", MtaDeploymentRepositoryUser: "dummy"} 282 283 err := runMtaBuild(options, &cpe, utilsMock) 284 285 assert.Equal(t, "mtarGroup, version not found and must be present", err.Error()) 286 }) 287 }) 288 } 289 290 func TestMtaBuildSourceDir(t *testing.T) { 291 292 t.Run("getSourcePath", func(t *testing.T) { 293 t.Parallel() 294 295 t.Run("getPath dir unset", func(t *testing.T) { 296 options := mtaBuildOptions{Source: "", Target: ""} 297 assert.Equal(t, filepath.FromSlash("./"), getSourcePath(options)) 298 assert.Equal(t, filepath.FromSlash("./"), getTargetPath(options)) 299 }) 300 t.Run("getPath source set", func(t *testing.T) { 301 options := mtaBuildOptions{Source: "spath", Target: ""} 302 assert.Equal(t, filepath.FromSlash("spath"), getSourcePath(options)) 303 assert.Equal(t, filepath.FromSlash("./"), getTargetPath(options)) 304 }) 305 t.Run("getPath target set", func(t *testing.T) { 306 options := mtaBuildOptions{Source: "", Target: "tpath"} 307 assert.Equal(t, filepath.FromSlash("./"), getSourcePath(options)) 308 assert.Equal(t, filepath.FromSlash("tpath"), getTargetPath(options)) 309 }) 310 t.Run("getPath dir set to relative path", func(t *testing.T) { 311 options := mtaBuildOptions{Source: "spath", Target: "tpath"} 312 assert.Equal(t, filepath.FromSlash("spath"), getSourcePath(options)) 313 assert.Equal(t, filepath.FromSlash("tpath"), getTargetPath(options)) 314 }) 315 t.Run("getPath dir ends with seperator", func(t *testing.T) { 316 options := mtaBuildOptions{Source: "spath/", Target: "tpath/"} 317 assert.Equal(t, filepath.FromSlash("spath/"), getSourcePath(options)) 318 assert.Equal(t, filepath.FromSlash("tpath/"), getTargetPath(options)) 319 }) 320 t.Run("getPath dir set to absolute path", func(t *testing.T) { 321 sourcePath := filepath.Join(_ignoreError(os.Getwd()), "spath") 322 targetPath := filepath.Join(_ignoreError(os.Getwd()), "tpath") 323 options := mtaBuildOptions{Source: sourcePath, Target: targetPath} 324 assert.Equal(t, filepath.FromSlash(sourcePath), getSourcePath(options)) 325 assert.Equal(t, filepath.FromSlash(targetPath), getTargetPath(options)) 326 }) 327 }) 328 329 t.Run("find build tool descriptor from configuration", func(t *testing.T) { 330 t.Parallel() 331 cpe := mtaBuildCommonPipelineEnvironment{} 332 t.Run("default mta.yaml", func(t *testing.T) { 333 utilsMock := newMtaBuildTestUtilsBundle() 334 335 utilsMock.AddFile("mta.yaml", []byte("already there")) 336 337 _ = runMtaBuild(mtaBuildOptions{ApplicationName: "myApp"}, &cpe, utilsMock) 338 339 assert.False(t, utilsMock.HasWrittenFile("mta.yaml")) 340 }) 341 t.Run("create mta.yaml from config.source", func(t *testing.T) { 342 utilsMock := newMtaBuildTestUtilsBundle() 343 344 utilsMock.AddFile("package.json", []byte("{\"name\": \"myName\", \"version\": \"1.2.3\"}")) 345 346 _ = runMtaBuild(mtaBuildOptions{ApplicationName: "myApp", Source: "create"}, &cpe, utilsMock) 347 348 assert.True(t, utilsMock.HasWrittenFile("create/mta.yaml")) 349 }) 350 t.Run("read yaml from config.source", func(t *testing.T) { 351 utilsMock := newMtaBuildTestUtilsBundle() 352 353 utilsMock.AddFile("path/mta.yaml", []byte("already there")) 354 355 _ = runMtaBuild(mtaBuildOptions{ApplicationName: "myApp", Source: "path"}, &cpe, utilsMock) 356 357 assert.False(t, utilsMock.HasWrittenFile("path/mta.yaml")) 358 }) 359 }) 360 361 } 362 363 func TestMtaBuildMtar(t *testing.T) { 364 365 t.Run("getMtarName", func(t *testing.T) { 366 t.Parallel() 367 368 t.Run("mtar name from yaml", func(t *testing.T) { 369 utilsMock := newMtaBuildTestUtilsBundle() 370 utilsMock.AddFile("mta.yaml", []byte("ID: \"nameFromMtar\"")) 371 372 assert.Equal(t, filepath.FromSlash("nameFromMtar.mtar"), _ignoreErrorForGetMtarName(getMtarName(mtaBuildOptions{MtarName: ""}, "mta.yaml", utilsMock))) 373 }) 374 t.Run("mtar name from yaml with suffixed value", func(t *testing.T) { 375 utilsMock := newMtaBuildTestUtilsBundle() 376 utilsMock.AddFile("mta.yaml", []byte("ID: \"nameFromMtar.mtar\"")) 377 378 assert.Equal(t, filepath.FromSlash("nameFromMtar.mtar"), _ignoreErrorForGetMtarName(getMtarName(mtaBuildOptions{MtarName: ""}, "mta.yaml", utilsMock))) 379 }) 380 t.Run("mtar name from config", func(t *testing.T) { 381 utilsMock := newMtaBuildTestUtilsBundle() 382 utilsMock.AddFile("mta.yaml", []byte("ID: \"nameFromMtar\"")) 383 384 assert.Equal(t, filepath.FromSlash("nameFromConfig.mtar"), _ignoreErrorForGetMtarName(getMtarName(mtaBuildOptions{MtarName: "nameFromConfig.mtar"}, "mta.yaml", utilsMock))) 385 }) 386 }) 387 388 t.Run("getMtarFilePath", func(t *testing.T) { 389 t.Parallel() 390 391 t.Run("plain mtar name", func(t *testing.T) { 392 assert.Equal(t, "mta.mtar", getMtarFilePath(mtaBuildOptions{Source: "", Target: ""}, "mta.mtar")) 393 }) 394 t.Run("plain mtar name from default", func(t *testing.T) { 395 assert.Equal(t, "mta.mtar", getMtarFilePath(mtaBuildOptions{Source: "./", Target: "./"}, "mta.mtar")) 396 }) 397 t.Run("source path", func(t *testing.T) { 398 assert.Equal(t, filepath.FromSlash("source/mta.mtar"), getMtarFilePath(mtaBuildOptions{Source: "source", Target: ""}, "mta.mtar")) 399 }) 400 t.Run("target path", func(t *testing.T) { 401 assert.Equal(t, filepath.FromSlash("target/mta.mtar"), getMtarFilePath(mtaBuildOptions{Source: "", Target: "target"}, "mta.mtar")) 402 }) 403 t.Run("source and target path", func(t *testing.T) { 404 assert.Equal(t, filepath.FromSlash("source/target/mta.mtar"), getMtarFilePath(mtaBuildOptions{Source: "source", Target: "target"}, "mta.mtar")) 405 }) 406 }) 407 408 } 409 410 func _ignoreError(s string, e error) string { 411 return s 412 } 413 414 func _ignoreErrorForGetMtarName(s string, b bool, e error) string { 415 return s 416 }