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