github.com/jfrog/jfrog-cli-core/v2@v2.51.0/common/commands/configfile_test.go (about) 1 package commands 2 3 import ( 4 "flag" 5 testsutils "github.com/jfrog/jfrog-client-go/utils/tests" 6 "os" 7 "path/filepath" 8 "strings" 9 "testing" 10 11 "github.com/jfrog/jfrog-cli-core/v2/common/project" 12 "github.com/jfrog/jfrog-cli-core/v2/common/tests" 13 "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" 14 "github.com/jfrog/jfrog-client-go/utils/io/fileutils" 15 clientlog "github.com/jfrog/jfrog-client-go/utils/log" 16 "github.com/spf13/viper" 17 "github.com/stretchr/testify/assert" 18 "github.com/urfave/cli" 19 ) 20 21 func init() { 22 clientlog.SetLogger(clientlog.NewLogger(clientlog.WARN, nil)) // Disable "[Info] *** build config successfully created." messages 23 } 24 25 func TestGoConfigFile(t *testing.T) { 26 // Set JFROG_CLI_HOME_DIR environment variable 27 tempDirPath := createTempEnv(t) 28 defer func() { 29 assert.NoError(t, fileutils.RemoveTempDir(tempDirPath), "Couldn't remove temp dir") 30 }() 31 32 // Create build config 33 context := createContext(t, resolutionServerId+"=relServer", resolutionRepo+"=repo", deploymentServerId+"=depServer", deploymentRepo+"=repo-local") 34 err := CreateBuildConfig(context, project.Go) 35 assert.NoError(t, err) 36 37 // Check configuration 38 config := checkCommonAndGetConfiguration(t, project.Go.String(), tempDirPath) 39 assert.Equal(t, "relServer", config.GetString("resolver.serverId")) 40 assert.Equal(t, "repo", config.GetString("resolver.repo")) 41 assert.Equal(t, "depServer", config.GetString("deployer.serverId")) 42 assert.Equal(t, "repo-local", config.GetString("deployer.repo")) 43 } 44 45 // In case resolver/deployer server-id flags are not provided - the default configured global server will be chosen. 46 func TestGoConfigFileWithDefaultServerId(t *testing.T) { 47 // Set JFROG_CLI_HOME_DIR environment variable 48 cleanUp, err := tests.ConfigTestServer(t) 49 assert.NoError(t, err) 50 defer cleanUp() 51 52 // Create build config 53 context := createContext(t, resolutionRepo+"=repo", deploymentRepo+"=repo-local") 54 err = CreateBuildConfig(context, project.Go) 55 assert.NoError(t, err) 56 57 // Check configuration 58 config := checkCommonAndGetConfiguration(t, project.Go.String(), os.Getenv(coreutils.HomeDir)) 59 assert.Equal(t, "test", config.GetString("resolver.serverId")) 60 assert.Equal(t, "repo", config.GetString("resolver.repo")) 61 assert.Equal(t, "test", config.GetString("deployer.serverId")) 62 assert.Equal(t, "repo-local", config.GetString("deployer.repo")) 63 } 64 65 func TestPipConfigFile(t *testing.T) { 66 // Set JFROG_CLI_HOME_DIR environment variable 67 tempDirPath := createTempEnv(t) 68 defer testsutils.RemoveAllAndAssert(t, tempDirPath) 69 70 // Create build config 71 context := createContext(t, resolutionServerId+"=relServer", resolutionRepo+"=repo", deploymentServerId+"=depServer", deploymentRepo+"=repo-local") 72 err := CreateBuildConfig(context, project.Pip) 73 assert.NoError(t, err) 74 75 // Check configuration 76 config := checkCommonAndGetConfiguration(t, project.Pip.String(), tempDirPath) 77 assert.Equal(t, "relServer", config.GetString("resolver.serverId")) 78 assert.Equal(t, "repo", config.GetString("resolver.repo")) 79 assert.Equal(t, "depServer", config.GetString("deployer.serverId")) 80 assert.Equal(t, "repo-local", config.GetString("deployer.repo")) 81 } 82 83 // In case resolver/deployer server-id flags are not provided - the default configured global server will be chosen. 84 func TestPipConfigFileWithDefaultServerId(t *testing.T) { 85 // Set JFROG_CLI_HOME_DIR environment variable 86 cleanUp, err := tests.ConfigTestServer(t) 87 assert.NoError(t, err) 88 defer cleanUp() 89 90 // Create build config 91 context := createContext(t, resolutionRepo+"=repo", deploymentRepo+"=repo-local") 92 err = CreateBuildConfig(context, project.Pip) 93 assert.NoError(t, err) 94 95 // Check configuration 96 config := checkCommonAndGetConfiguration(t, project.Pip.String(), os.Getenv(coreutils.HomeDir)) 97 assert.Equal(t, "test", config.GetString("resolver.serverId")) 98 assert.Equal(t, "repo", config.GetString("resolver.repo")) 99 assert.Equal(t, "test", config.GetString("deployer.serverId")) 100 assert.Equal(t, "repo-local", config.GetString("deployer.repo")) 101 } 102 103 func TestPipenvConfigFile(t *testing.T) { 104 // Set JFROG_CLI_HOME_DIR environment variable 105 tempDirPath := createTempEnv(t) 106 defer func() { 107 assert.NoError(t, fileutils.RemoveTempDir(tempDirPath)) 108 }() 109 110 // Create build config 111 context := createContext(t, resolutionServerId+"=relServer", resolutionRepo+"=repo", deploymentServerId+"=depServer", deploymentRepo+"=repo-local") 112 err := CreateBuildConfig(context, project.Pipenv) 113 assert.NoError(t, err) 114 115 // Check configuration 116 config := checkCommonAndGetConfiguration(t, project.Pipenv.String(), tempDirPath) 117 assert.Equal(t, "relServer", config.GetString("resolver.serverId")) 118 assert.Equal(t, "repo", config.GetString("resolver.repo")) 119 assert.Equal(t, "depServer", config.GetString("deployer.serverId")) 120 assert.Equal(t, "repo-local", config.GetString("deployer.repo")) 121 } 122 123 // In case resolver/deployer server-id flags are not provided - the default configured global server will be chosen. 124 func TestPipenvConfigFileWithDefaultServerId(t *testing.T) { 125 // Set JFROG_CLI_HOME_DIR environment variable 126 cleanUp, err := tests.ConfigTestServer(t) 127 assert.NoError(t, err) 128 defer cleanUp() 129 130 // Create build config 131 context := createContext(t, resolutionRepo+"=repo", deploymentRepo+"=repo-local") 132 err = CreateBuildConfig(context, project.Pipenv) 133 assert.NoError(t, err) 134 135 // Check configuration 136 config := checkCommonAndGetConfiguration(t, project.Pipenv.String(), os.Getenv(coreutils.HomeDir)) 137 assert.Equal(t, "test", config.GetString("resolver.serverId")) 138 assert.Equal(t, "repo", config.GetString("resolver.repo")) 139 assert.Equal(t, "test", config.GetString("deployer.serverId")) 140 assert.Equal(t, "repo-local", config.GetString("deployer.repo")) 141 } 142 143 func TestNpmConfigFile(t *testing.T) { 144 // Set JFROG_CLI_HOME_DIR environment variable 145 tempDirPath := createTempEnv(t) 146 defer testsutils.RemoveAllAndAssert(t, tempDirPath) 147 148 // Create build config 149 context := createContext(t, resolutionServerId+"=relServer", resolutionRepo+"=repo", deploymentServerId+"=depServer", deploymentRepo+"=repo-local") 150 err := CreateBuildConfig(context, project.Npm) 151 assert.NoError(t, err) 152 153 // Check configuration 154 config := checkCommonAndGetConfiguration(t, project.Npm.String(), tempDirPath) 155 assert.Equal(t, "relServer", config.GetString("resolver.serverId")) 156 assert.Equal(t, "repo", config.GetString("resolver.repo")) 157 assert.Equal(t, "depServer", config.GetString("deployer.serverId")) 158 assert.Equal(t, "repo-local", config.GetString("deployer.repo")) 159 } 160 161 // In case resolver/deployer server-id flags are not provided - the default configured global server will be chosen. 162 func TestNpmConfigFileWithDefaultServerId(t *testing.T) { 163 // Set JFROG_CLI_HOME_DIR environment variable 164 cleanUp, err := tests.ConfigTestServer(t) 165 assert.NoError(t, err) 166 defer cleanUp() 167 168 // Create build config 169 context := createContext(t, resolutionRepo+"=repo", deploymentRepo+"=repo-local") 170 err = CreateBuildConfig(context, project.Npm) 171 assert.NoError(t, err) 172 173 // Check configuration 174 config := checkCommonAndGetConfiguration(t, project.Npm.String(), os.Getenv(coreutils.HomeDir)) 175 assert.Equal(t, "test", config.GetString("resolver.serverId")) 176 assert.Equal(t, "repo", config.GetString("resolver.repo")) 177 assert.Equal(t, "test", config.GetString("deployer.serverId")) 178 assert.Equal(t, "repo-local", config.GetString("deployer.repo")) 179 } 180 181 func TestNugetConfigFile(t *testing.T) { 182 // Set JFROG_CLI_HOME_DIR environment variable 183 tempDirPath := createTempEnv(t) 184 defer testsutils.RemoveAllAndAssert(t, tempDirPath) 185 186 // Create build config 187 context := createContext(t, resolutionServerId+"=relServer", resolutionRepo+"=repo") 188 err := CreateBuildConfig(context, project.Nuget) 189 assert.NoError(t, err) 190 191 // Check configuration 192 config := checkCommonAndGetConfiguration(t, project.Nuget.String(), tempDirPath) 193 assert.Equal(t, "relServer", config.GetString("resolver.serverId")) 194 assert.Equal(t, "repo", config.GetString("resolver.repo")) 195 assert.Equal(t, true, config.GetBool("resolver.nugetV2")) 196 } 197 198 // In case resolver/deployer server-id flags are not provided - the default configured global server will be chosen. 199 func TestNugetConfigFileWithDefaultServerId(t *testing.T) { 200 // Set JFROG_CLI_HOME_DIR environment variable 201 cleanUp, err := tests.ConfigTestServer(t) 202 assert.NoError(t, err) 203 defer cleanUp() 204 205 // Create build config 206 context := createContext(t, resolutionRepo+"=repo") 207 err = CreateBuildConfig(context, project.Nuget) 208 assert.NoError(t, err) 209 210 // Check configuration 211 config := checkCommonAndGetConfiguration(t, project.Nuget.String(), os.Getenv(coreutils.HomeDir)) 212 assert.Equal(t, "test", config.GetString("resolver.serverId")) 213 assert.Equal(t, "repo", config.GetString("resolver.repo")) 214 assert.Equal(t, true, config.GetBool("resolver.nugetV2")) 215 } 216 217 func TestMavenConfigFile(t *testing.T) { 218 // Set JFROG_CLI_HOME_DIR environment variable 219 tempDirPath := createTempEnv(t) 220 defer testsutils.RemoveAllAndAssert(t, tempDirPath) 221 222 // Create build config 223 context := createContext(t, resolutionServerId+"=relServer", resolutionReleasesRepo+"=release-repo", resolutionSnapshotsRepo+"=snapshot-repo", 224 deploymentServerId+"=depServer", deploymentReleasesRepo+"=release-repo-local", deploymentSnapshotsRepo+"=snapshot-repo-local", 225 includePatterns+"=*pattern*;second", excludePatterns+"=excluding;*pattern") 226 err := CreateBuildConfig(context, project.Maven) 227 assert.NoError(t, err) 228 229 // Check configuration 230 config := checkCommonAndGetConfiguration(t, project.Maven.String(), tempDirPath) 231 assert.Equal(t, "relServer", config.GetString("resolver.serverId")) 232 assert.Equal(t, "snapshot-repo", config.GetString("resolver.snapshotRepo")) 233 assert.Equal(t, "release-repo", config.GetString("resolver.releaseRepo")) 234 assert.Equal(t, "depServer", config.GetString("deployer.serverId")) 235 assert.Equal(t, "snapshot-repo-local", config.GetString("deployer.snapshotRepo")) 236 assert.Equal(t, "release-repo-local", config.GetString("deployer.releaseRepo")) 237 assert.Equal(t, "*pattern*;second", config.GetString("deployer.includePatterns")) 238 assert.Equal(t, "excluding;*pattern", config.GetString("deployer.excludePatterns")) 239 } 240 241 // In case resolver/deployer server-id flags are not provided - the default configured global server will be chosen. 242 func TestMavenConfigFileWithDefaultServerId(t *testing.T) { 243 // Set JFROG_CLI_HOME_DIR environment variable 244 cleanUp, err := tests.ConfigTestServer(t) 245 assert.NoError(t, err) 246 defer cleanUp() 247 248 // Create build config 249 context := createContext(t, resolutionReleasesRepo+"=release-repo", resolutionSnapshotsRepo+"=snapshot-repo", 250 deploymentReleasesRepo+"=release-repo-local", deploymentSnapshotsRepo+"=snapshot-repo-local") 251 err = CreateBuildConfig(context, project.Maven) 252 assert.NoError(t, err) 253 254 // Check configuration 255 config := checkCommonAndGetConfiguration(t, project.Maven.String(), os.Getenv(coreutils.HomeDir)) 256 assert.Equal(t, "test", config.GetString("resolver.serverId")) 257 assert.Equal(t, "snapshot-repo", config.GetString("resolver.snapshotRepo")) 258 assert.Equal(t, "release-repo", config.GetString("resolver.releaseRepo")) 259 assert.Equal(t, "test", config.GetString("deployer.serverId")) 260 assert.Equal(t, "snapshot-repo-local", config.GetString("deployer.snapshotRepo")) 261 assert.Equal(t, "release-repo-local", config.GetString("deployer.releaseRepo")) 262 } 263 264 func TestGradleConfigFile(t *testing.T) { 265 // Set JFROG_CLI_HOME_DIR environment variable 266 tempDirPath := createTempEnv(t) 267 defer testsutils.RemoveAllAndAssert(t, tempDirPath) 268 269 // Create build config 270 context := createContext(t, resolutionServerId+"=relServer", resolutionRepo+"=repo", deploymentServerId+"=depServer", deploymentRepo+"=repo-local", 271 ivyDescPattern+"=[ivy]/[pattern]", ivyArtifactsPattern+"=[artifact]/[pattern]") 272 err := CreateBuildConfig(context, project.Gradle) 273 assert.NoError(t, err) 274 275 // Check configuration 276 config := checkCommonAndGetConfiguration(t, project.Gradle.String(), tempDirPath) 277 assert.Equal(t, "relServer", config.GetString("resolver.serverId")) 278 assert.Equal(t, "repo", config.GetString("resolver.repo")) 279 assert.Equal(t, "depServer", config.GetString("deployer.serverId")) 280 assert.Equal(t, "repo-local", config.GetString("deployer.repo")) 281 assert.Equal(t, true, config.GetBool("deployer.deployMavenDescriptors")) 282 assert.Equal(t, true, config.GetBool("deployer.deployIvyDescriptors")) 283 assert.Equal(t, "[ivy]/[pattern]", config.GetString("deployer.ivyPattern")) 284 assert.Equal(t, "[artifact]/[pattern]", config.GetString("deployer.artifactPattern")) 285 assert.Equal(t, true, config.GetBool("usePlugin")) 286 assert.Equal(t, true, config.GetBool("useWrapper")) 287 } 288 289 // In case resolver/deployer server-id flags are not provided - the default configured global server will be chosen. 290 func TestGradleConfigFileWithDefaultServerId(t *testing.T) { 291 // Set JFROG_CLI_HOME_DIR environment variable 292 cleanUp, err := tests.ConfigTestServer(t) 293 assert.NoError(t, err) 294 defer cleanUp() 295 296 // Create build config 297 context := createContext(t, resolutionRepo+"=repo", deploymentRepo+"=repo-local", 298 ivyDescPattern+"=[ivy]/[pattern]", ivyArtifactsPattern+"=[artifact]/[pattern]") 299 err = CreateBuildConfig(context, project.Gradle) 300 assert.NoError(t, err) 301 302 // Check configuration 303 config := checkCommonAndGetConfiguration(t, project.Gradle.String(), os.Getenv(coreutils.HomeDir)) 304 assert.Equal(t, "test", config.GetString("resolver.serverId")) 305 assert.Equal(t, "repo", config.GetString("resolver.repo")) 306 assert.Equal(t, "test", config.GetString("deployer.serverId")) 307 assert.Equal(t, "repo-local", config.GetString("deployer.repo")) 308 assert.Equal(t, true, config.GetBool("deployer.deployMavenDescriptors")) 309 assert.Equal(t, true, config.GetBool("deployer.deployIvyDescriptors")) 310 assert.Equal(t, "[ivy]/[pattern]", config.GetString("deployer.ivyPattern")) 311 assert.Equal(t, "[artifact]/[pattern]", config.GetString("deployer.artifactPattern")) 312 assert.Equal(t, true, config.GetBool("usePlugin")) 313 assert.Equal(t, true, config.GetBool("useWrapper")) 314 } 315 316 func TestGradleConfigFileDefaultPatterns(t *testing.T) { 317 // Set JFROG_CLI_HOME_DIR environment variable 318 tempDirPath := createTempEnv(t) 319 defer testsutils.RemoveAllAndAssert(t, tempDirPath) 320 321 // Create build config 322 context := createContext(t, resolutionServerId+"=relServer", resolutionRepo+"=repo", deploymentServerId+"=depServer", deploymentRepo+"=repo-local") 323 err := CreateBuildConfig(context, project.Gradle) 324 assert.NoError(t, err) 325 326 // Check configuration 327 config := checkCommonAndGetConfiguration(t, project.Gradle.String(), tempDirPath) 328 assert.Equal(t, "relServer", config.GetString("resolver.serverId")) 329 assert.Equal(t, "repo", config.GetString("resolver.repo")) 330 assert.Equal(t, "depServer", config.GetString("deployer.serverId")) 331 assert.Equal(t, "repo-local", config.GetString("deployer.repo")) 332 assert.Equal(t, true, config.GetBool("deployer.deployMavenDescriptors")) 333 assert.Equal(t, true, config.GetBool("deployer.deployIvyDescriptors")) 334 assert.Equal(t, "[organization]/[module]/ivy-[revision].xml", config.GetString("deployer.ivyPattern")) 335 assert.Equal(t, "[organization]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]", config.GetString("deployer.artifactPattern")) 336 assert.Equal(t, true, config.GetBool("usePlugin")) 337 assert.Equal(t, true, config.GetBool("useWrapper")) 338 } 339 340 func TestValidateConfigResolver(t *testing.T) { 341 // Create and check empty config 342 tempDirPath := createTempEnv(t) 343 defer testsutils.RemoveAllAndAssert(t, tempDirPath) 344 configFile := NewConfigFile(project.Go, createContext(t)) 345 err := configFile.validateConfig() 346 assert.NoError(t, err) 347 348 // Check scenarios of serverId and repo 349 configFile.Resolver.ServerId = "serverId" 350 err = configFile.validateConfig() 351 assert.EqualError(t, err, resolutionErrorPrefix+setRepositoryError) 352 configFile.Resolver.Repo = "repo" 353 err = configFile.validateConfig() 354 assert.NoError(t, err) 355 356 // Set Server Id with environment variable 357 configFile.Resolver.ServerId = "" 358 configFile.Resolver.Repo = "repo" 359 setEnvCallBack := testsutils.SetEnvWithCallbackAndAssert(t, coreutils.ServerID, "serverId") 360 err = configFile.validateConfig() 361 assert.NoError(t, err) 362 setEnvCallBack() 363 364 configFile.Resolver.ServerId = "" 365 err = configFile.validateConfig() 366 assert.EqualError(t, err, resolutionErrorPrefix+setServerIdError) 367 368 // Check scenarios of serverId and release/snapshot repositories 369 configFile.Resolver.ServerId = "serverId" 370 configFile.Resolver.SnapshotRepo = "snapshotRepo" 371 err = configFile.validateConfig() 372 assert.EqualError(t, err, resolutionErrorPrefix+setSnapshotAndReleaseError) 373 configFile.Resolver.ReleaseRepo = "releaseRepo" 374 err = configFile.validateConfig() 375 assert.NoError(t, err) 376 configFile.Resolver.ServerId = "" 377 err = configFile.validateConfig() 378 assert.EqualError(t, err, resolutionErrorPrefix+setServerIdError) 379 } 380 381 func TestValidateConfigDeployer(t *testing.T) { 382 // Create and check empty config 383 tempDirPath := createTempEnv(t) 384 defer testsutils.RemoveAllAndAssert(t, tempDirPath) 385 configFile := NewConfigFile(project.Go, createContext(t)) 386 err := configFile.validateConfig() 387 assert.NoError(t, err) 388 389 // Check scenarios of serverId and repo 390 configFile.Deployer.ServerId = "serverId" 391 err = configFile.validateConfig() 392 assert.EqualError(t, err, deploymentErrorPrefix+setRepositoryError) 393 configFile.Deployer.Repo = "repo" 394 err = configFile.validateConfig() 395 assert.NoError(t, err) 396 397 // Set Server Id with environment variable 398 configFile.Deployer.ServerId = "" 399 configFile.Deployer.Repo = "repo" 400 setEnvCallBack := testsutils.SetEnvWithCallbackAndAssert(t, coreutils.ServerID, "serverId") 401 err = configFile.validateConfig() 402 assert.NoError(t, err) 403 setEnvCallBack() 404 405 configFile.Deployer.ServerId = "" 406 err = configFile.validateConfig() 407 assert.EqualError(t, err, deploymentErrorPrefix+setServerIdError) 408 409 // Check scenarios of serverId and release/snapshot repositories 410 configFile.Deployer.ServerId = "serverId" 411 configFile.Deployer.ReleaseRepo = "releaseRepo" 412 err = configFile.validateConfig() 413 assert.EqualError(t, err, deploymentErrorPrefix+setSnapshotAndReleaseError) 414 configFile.Deployer.SnapshotRepo = "snapshotRepo" 415 err = configFile.validateConfig() 416 assert.NoError(t, err) 417 configFile.Deployer.ServerId = "" 418 err = configFile.validateConfig() 419 assert.EqualError(t, err, deploymentErrorPrefix+setServerIdError) 420 } 421 422 // Set JFROG_CLI_HOME_DIR environment variable to be a new temp directory 423 func createTempEnv(t *testing.T) string { 424 tmpDir, err := fileutils.CreateTempDir() 425 assert.NoError(t, err) 426 testsutils.SetEnvAndAssert(t, coreutils.HomeDir, tmpDir) 427 return tmpDir 428 } 429 430 // Create new Codegangsta context with all required flags. 431 func createContext(t *testing.T, stringFlags ...string) *cli.Context { 432 flagSet := flag.NewFlagSet("TestFlagSet", flag.ContinueOnError) 433 flags := setBoolFlags(flagSet, global, usesPlugin, useWrapper, deployMavenDesc, deployIvyDesc, nugetV2) 434 flags = append(flags, setStringFlags(flagSet, stringFlags...)...) 435 assert.NoError(t, flagSet.Parse(flags)) 436 return cli.NewContext(nil, flagSet, nil) 437 } 438 439 // Set boolean flags and initialize them to true. Return a slice of them. 440 func setBoolFlags(flagSet *flag.FlagSet, flags ...string) []string { 441 cmdFlags := []string{} 442 for _, boolFlag := range flags { 443 flagSet.Bool(boolFlag, true, "") 444 cmdFlags = append(cmdFlags, "--"+boolFlag) 445 } 446 return cmdFlags 447 } 448 449 // Set string flags. Return a slice of their values. 450 func setStringFlags(flagSet *flag.FlagSet, flags ...string) []string { 451 cmdFlags := []string{} 452 for _, stringFlag := range flags { 453 flagSet.String(strings.Split(stringFlag, "=")[0], "", "") 454 cmdFlags = append(cmdFlags, "--"+stringFlag) 455 } 456 return cmdFlags 457 } 458 459 // Read yaml configuration from disk, check version and type. 460 func checkCommonAndGetConfiguration(t *testing.T, projectType string, tempDirPath string) *viper.Viper { 461 config, err := project.ReadConfigFile(filepath.Join(tempDirPath, "projects", projectType+".yaml"), project.YAML) 462 assert.NoError(t, err) 463 assert.Equal(t, BuildConfVersion, config.GetInt("version")) 464 assert.Equal(t, projectType, config.GetString("type")) 465 return config 466 }