github.com/getgauge/gauge@v1.6.9/env/env_test.go (about) 1 /*---------------------------------------------------------------- 2 * Copyright (c) ThoughtWorks, Inc. 3 * Licensed under the Apache License, Version 2.0 4 * See LICENSE in the project root for license information. 5 *----------------------------------------------------------------*/ 6 7 package env 8 9 import ( 10 "os" 11 "path/filepath" 12 "testing" 13 14 "github.com/getgauge/common" 15 "github.com/getgauge/gauge/config" 16 . "gopkg.in/check.v1" 17 ) 18 19 func Test(t *testing.T) { TestingT(t) } 20 21 type MySuite struct{} 22 23 var _ = Suite(&MySuite{}) 24 25 func (s *MySuite) TestLoadDefaultEnv(c *C) { 26 os.Clearenv() 27 config.ProjectRoot = "_testdata/proj1" 28 29 e := LoadEnv(common.DefaultEnvDir, nil) 30 31 c.Assert(e, Equals, nil) 32 c.Assert(os.Getenv("gauge_reports_dir"), Equals, "reports") 33 c.Assert(os.Getenv("gauge_environment"), Equals, common.DefaultEnvDir) 34 c.Assert(os.Getenv("overwrite_reports"), Equals, "true") 35 c.Assert(os.Getenv("screenshot_on_failure"), Equals, "true") 36 c.Assert(os.Getenv("logs_directory"), Equals, "logs") 37 c.Assert(os.Getenv("gauge_specs_dir"), Equals, "specs") 38 c.Assert(os.Getenv("csv_delimiter"), Equals, ",") 39 defaultScreenshotDir := filepath.Join(config.ProjectRoot, common.DotGauge, "screenshots") 40 c.Assert(os.Getenv("gauge_screenshots_dir"), Equals, defaultScreenshotDir) 41 c.Assert(os.Getenv("gauge_spec_file_extensions"), Equals, ".spec, .md") 42 c.Assert(os.Getenv("allow_case_sensitive_tags"), Equals, "false") 43 } 44 45 // If default env dir is present, the values present in there should overwrite 46 // the default values (present in the code), even when env flag is passed 47 func (s *MySuite) TestLoadDefaultEnvFromDirIfPresent(c *C) { 48 os.Clearenv() 49 config.ProjectRoot = "_testdata/proj2" 50 51 e := LoadEnv("foo", nil) 52 53 c.Assert(e, Equals, nil) 54 c.Assert(os.Getenv("gauge_reports_dir"), Equals, "reports_dir") 55 c.Assert(os.Getenv("gauge_environment"), Equals, "foo") 56 c.Assert(os.Getenv("overwrite_reports"), Equals, "false") 57 c.Assert(os.Getenv("screenshot_on_failure"), Equals, "false") 58 c.Assert(os.Getenv("logs_directory"), Equals, "logs") 59 c.Assert(os.Getenv("gauge_specs_dir"), Equals, "anotherSpecDir") 60 } 61 62 func (s *MySuite) TestLoadDefaultEnvFromCustomDir(c *C) { 63 os.Clearenv() 64 config.ProjectRoot = "_testdata/proj9" 65 os.Setenv("gauge_env_dir", "customEnv") 66 67 e := LoadEnv(common.DefaultEnvDir, nil) 68 69 c.Assert(e, Equals, nil) 70 c.Assert(os.Getenv("gauge_reports_dir"), Equals, "reports") 71 c.Assert(os.Getenv("gauge_environment"), Equals, common.DefaultEnvDir) 72 c.Assert(os.Getenv("overwrite_reports"), Equals, "true") 73 c.Assert(os.Getenv("screenshot_on_failure"), Equals, "true") 74 c.Assert(os.Getenv("logs_directory"), Equals, "logs") 75 c.Assert(os.Getenv("gauge_specs_dir"), Equals, "specs") 76 c.Assert(os.Getenv("csv_delimiter"), Equals, ",") 77 defaultScreenshotDir := filepath.Join(config.ProjectRoot, common.DotGauge, "screenshots") 78 c.Assert(os.Getenv("gauge_screenshots_dir"), Equals, defaultScreenshotDir) 79 c.Assert(os.Getenv("gauge_spec_file_extensions"), Equals, ".spec, .md") 80 c.Assert(os.Getenv("allow_case_sensitive_tags"), Equals, "false") 81 } 82 83 func (s *MySuite) TestLoadDefaultEnvFromDirIfPresentFromCustomDir(c *C) { 84 os.Clearenv() 85 os.Setenv("gauge_env_dir", "customEnv") 86 config.ProjectRoot = "_testdata/proj10" 87 88 e := LoadEnv("foo", nil) 89 90 c.Assert(e, Equals, nil) 91 c.Assert(os.Getenv("gauge_reports_dir"), Equals, "reports_dir") 92 c.Assert(os.Getenv("gauge_environment"), Equals, "foo") 93 c.Assert(os.Getenv("overwrite_reports"), Equals, "false") 94 c.Assert(os.Getenv("screenshot_on_failure"), Equals, "false") 95 c.Assert(os.Getenv("logs_directory"), Equals, "logs") 96 c.Assert(os.Getenv("gauge_specs_dir"), Equals, "anotherSpecDir") 97 } 98 99 func (s *MySuite) TestLoadDefaultEnvFromManifestDir(c *C) { 100 os.Clearenv() 101 config.ProjectRoot = "_testdata/proj7" 102 103 e := LoadEnv(common.DefaultEnvDir, nil) 104 105 c.Assert(e, Equals, nil) 106 c.Assert(os.Getenv("gauge_reports_dir"), Equals, "reports") 107 c.Assert(os.Getenv("gauge_environment"), Equals, common.DefaultEnvDir) 108 c.Assert(os.Getenv("overwrite_reports"), Equals, "true") 109 c.Assert(os.Getenv("screenshot_on_failure"), Equals, "true") 110 c.Assert(os.Getenv("logs_directory"), Equals, "logs") 111 c.Assert(os.Getenv("gauge_specs_dir"), Equals, "specs") 112 c.Assert(os.Getenv("csv_delimiter"), Equals, ",") 113 defaultScreenshotDir := filepath.Join(config.ProjectRoot, common.DotGauge, "screenshots") 114 c.Assert(os.Getenv("gauge_screenshots_dir"), Equals, defaultScreenshotDir) 115 c.Assert(os.Getenv("gauge_spec_file_extensions"), Equals, ".spec, .md") 116 c.Assert(os.Getenv("allow_case_sensitive_tags"), Equals, "false") 117 } 118 119 func (s *MySuite) TestLoadDefaultEnvFromDirIfPresentFromManifestDir(c *C) { 120 os.Clearenv() 121 config.ProjectRoot = "_testdata/proj8" 122 123 e := LoadEnv("foo", nil) 124 125 c.Assert(e, Equals, nil) 126 c.Assert(os.Getenv("gauge_reports_dir"), Equals, "reports_dir") 127 c.Assert(os.Getenv("gauge_environment"), Equals, "foo") 128 c.Assert(os.Getenv("overwrite_reports"), Equals, "false") 129 c.Assert(os.Getenv("screenshot_on_failure"), Equals, "false") 130 c.Assert(os.Getenv("logs_directory"), Equals, "logs") 131 c.Assert(os.Getenv("gauge_specs_dir"), Equals, "anotherSpecDir") 132 } 133 134 // If default env dir is present, the values present in there should overwrite 135 // the default values (present in the code), even when env flag is passed. 136 // If the passed env also has the same values, that should take precedence. 137 func (s *MySuite) TestLoadDefaultEnvFromDirAndOverwritePassedEnv(c *C) { 138 os.Clearenv() 139 config.ProjectRoot = "_testdata/proj2" 140 141 e := LoadEnv("bar", nil) 142 143 c.Assert(e, Equals, nil) 144 c.Assert(os.Getenv("gauge_reports_dir"), Equals, "reports_dir") 145 c.Assert(os.Getenv("gauge_environment"), Equals, "bar") 146 c.Assert(os.Getenv("overwrite_reports"), Equals, "false") 147 c.Assert(os.Getenv("screenshot_on_failure"), Equals, "true") 148 c.Assert(os.Getenv("logs_directory"), Equals, "bar/logs") 149 c.Assert(os.Getenv("gauge_specs_dir"), Equals, "bar/specs") 150 } 151 152 func (s *MySuite) TestLoadDefaultEnvEvenIfDefaultEnvNotPresent(c *C) { 153 os.Clearenv() 154 config.ProjectRoot = "" 155 156 e := LoadEnv(common.DefaultEnvDir, nil) 157 158 c.Assert(e, Equals, nil) 159 c.Assert(os.Getenv("gauge_reports_dir"), Equals, "reports") 160 c.Assert(os.Getenv("gauge_environment"), Equals, common.DefaultEnvDir) 161 c.Assert(os.Getenv("overwrite_reports"), Equals, "true") 162 c.Assert(os.Getenv("screenshot_on_failure"), Equals, "true") 163 c.Assert(os.Getenv("logs_directory"), Equals, "logs") 164 c.Assert(os.Getenv("gauge_specs_dir"), Equals, "specs") 165 } 166 167 func (s *MySuite) TestLoadDefaultEnvWithOtherPropertiesSetInShell(c *C) { 168 os.Clearenv() 169 os.Setenv("foo", "bar") 170 os.Setenv("logs_directory", "custom_logs_dir") 171 os.Setenv("gauge_specs_dir", "custom_specs_dir") 172 config.ProjectRoot = "_testdata/proj1" 173 174 e := LoadEnv(common.DefaultEnvDir, nil) 175 176 c.Assert(e, Equals, nil) 177 c.Assert(os.Getenv("foo"), Equals, "bar") 178 c.Assert(os.Getenv("property1"), Equals, "value1") 179 c.Assert(os.Getenv("logs_directory"), Equals, "custom_logs_dir") 180 c.Assert(os.Getenv("gauge_specs_dir"), Equals, "custom_specs_dir") 181 } 182 183 func (s *MySuite) TestLoadDefaultEnvWithOtherPropertiesNotSetInShell(c *C) { 184 os.Clearenv() 185 config.ProjectRoot = "_testdata/proj1" 186 187 e := LoadEnv(common.DefaultEnvDir, nil) 188 189 c.Assert(e, Equals, nil) 190 c.Assert(os.Getenv("property1"), Equals, "value1") 191 } 192 193 func (s *MySuite) TestLoadCustomEnvAlongWithDefaultEnv(c *C) { 194 os.Clearenv() 195 config.ProjectRoot = "_testdata/proj1" 196 197 e := LoadEnv("foo", nil) 198 199 c.Assert(e, Equals, nil) 200 c.Assert(os.Getenv("gauge_reports_dir"), Equals, "reports") 201 c.Assert(os.Getenv("overwrite_reports"), Equals, "true") 202 c.Assert(os.Getenv("screenshot_on_failure"), Equals, "false") 203 c.Assert(os.Getenv("logs_directory"), Equals, "foo/logs") 204 c.Assert(os.Getenv("gauge_specs_dir"), Equals, "foo/specs") 205 } 206 207 func (s *MySuite) TestLoadCustomEnvAlongWithOtherPropertiesSetInShell(c *C) { 208 os.Clearenv() 209 os.Setenv("gauge_reports_dir", "custom_reports_dir") 210 os.Setenv("gauge_specs_dir", "custom_specs_dir") 211 config.ProjectRoot = "_testdata/proj1" 212 213 e := LoadEnv("foo", nil) 214 215 c.Assert(e, Equals, nil) 216 c.Assert(os.Getenv("gauge_reports_dir"), Equals, "custom_reports_dir") 217 c.Assert(os.Getenv("overwrite_reports"), Equals, "true") 218 c.Assert(os.Getenv("screenshot_on_failure"), Equals, "false") 219 c.Assert(os.Getenv("logs_directory"), Equals, "foo/logs") 220 c.Assert(os.Getenv("gauge_specs_dir"), Equals, "custom_specs_dir") 221 } 222 223 func (s *MySuite) TestLoadCustomEnvWithCommentsInPropertiesSet(c *C) { 224 os.Clearenv() 225 config.ProjectRoot = "_testdata/proj1" 226 227 e := LoadEnv("test", nil) 228 229 c.Assert(e, Equals, nil) 230 c.Assert(os.Getenv("test_url"), Equals, "http://testurl") 231 } 232 233 func (s *MySuite) TestLoadMultipleEnv(c *C) { 234 os.Clearenv() 235 config.ProjectRoot = "_testdata/proj2" 236 237 e := LoadEnv("bar, foo", nil) 238 239 c.Assert(e, Equals, nil) 240 c.Assert(os.Getenv("screenshot_on_failure"), Equals, "true") 241 c.Assert(os.Getenv("logs_directory"), Equals, "bar/logs") 242 } 243 244 func (s *MySuite) TestLoadMultipleEnvEnsureFirstOneDecides(c *C) { 245 os.Clearenv() 246 config.ProjectRoot = "_testdata/proj2" 247 248 e := LoadEnv("bar, default", nil) 249 250 c.Assert(e, Equals, nil) 251 c.Assert(os.Getenv("screenshot_on_failure"), Equals, "true") 252 c.Assert(os.Getenv("logs_directory"), Equals, "bar/logs") 253 c.Assert(os.Getenv("gauge_reports_dir"), Equals, "reports_dir") 254 } 255 256 func (s *MySuite) TestEnvPropertyIsSet(c *C) { 257 os.Clearenv() 258 os.Setenv("foo", "bar") 259 260 actual := isPropertySet("foo") 261 262 c.Assert(actual, Equals, true) 263 } 264 265 func (s *MySuite) TestEnvPropertyIsNotSet(c *C) { 266 os.Clearenv() 267 268 actual := isPropertySet("foo") 269 270 c.Assert(actual, Equals, false) 271 } 272 273 func (s *MySuite) TestFatalErrorIsThrownIfEnvNotFound(c *C) { 274 os.Clearenv() 275 config.ProjectRoot = "_testdata/proj1" 276 277 e := LoadEnv("bar", nil) 278 c.Assert(e.Error(), Equals, "Failed to load env. bar environment does not exist") 279 } 280 281 func (s *MySuite) TestLoadDefaultEnvWithSubstitutedVariables(c *C) { 282 os.Clearenv() 283 os.Setenv("foo", "bar") 284 os.Setenv("property1", "value1") 285 286 config.ProjectRoot = "_testdata/proj3" 287 288 e := LoadEnv(common.DefaultEnvDir, nil) 289 290 c.Assert(e, Equals, nil) 291 292 c.Assert(os.Getenv("property1"), Equals, "value1") 293 c.Assert(os.Getenv("property3"), Equals, "bar/value1") 294 c.Assert(os.Getenv("property2"), Equals, "value1/value2") 295 } 296 297 func (s *MySuite) TestLoadDefaultEmptyEnvWithSubstitutedVariables(c *C) { 298 os.Clearenv() 299 os.Setenv("property1", "") 300 301 config.ProjectRoot = "_testdata/proj1" 302 303 e := LoadEnv(common.DefaultEnvDir, nil) 304 305 c.Assert(e, Equals, nil) 306 307 c.Assert(os.Getenv("property1"), Equals, "value1") 308 } 309 310 func (s *MySuite) TestLoadDefaultEnvWithMissingSubstitutedVariable(c *C) { 311 os.Clearenv() 312 config.ProjectRoot = "_testdata/proj5" 313 e := LoadEnv(common.DefaultEnvDir, nil) 314 c.Assert(e.Error(), Equals, "Failed to load env. [missingProperty] env variable(s) are not set") 315 } 316 317 func (s *MySuite) TestLoadDefaultEnvWithMissingSubstitutedVariableWhenAssignedToProperty(c *C) { 318 os.Clearenv() 319 config.ProjectRoot = "_testdata/proj4" 320 e := LoadEnv("missing", nil) 321 c.Assert(e.Error(), Equals, "Failed to load env. [c] env variable(s) are not set") 322 } 323 324 func (s *MySuite) TestLoadDefaultEnvWithMissingSubstitutedVariableAcrossMultipleFiles(c *C) { 325 os.Clearenv() 326 config.ProjectRoot = "_testdata/proj4" 327 e := LoadEnv("missing-multi", nil) 328 c.Assert(e.Error(), Equals, "Failed to load env. [d] env variable(s) are not set") 329 } 330 331 func (s *MySuite) TestCurrentEnvironmentIsPopulated(c *C) { 332 os.Clearenv() 333 config.ProjectRoot = "_testdata/proj1" 334 335 e := LoadEnv("foo", nil) 336 337 c.Assert(e, Equals, nil) 338 c.Assert(CurrentEnvironments(), Equals, "foo") 339 } 340 341 func (s *MySuite) TestGetDefaultSpecFileExtensions(c *C) { 342 os.Clearenv() 343 var contains = func(c []string, what string) bool { 344 for _, x := range c { 345 if x == what { 346 return true 347 } 348 } 349 return false 350 } 351 352 exts := GaugeSpecFileExtensions() 353 for _, expected := range []string{".spec", ".md"} { 354 c.Assert(contains(exts, expected), Equals, true) 355 } 356 } 357 358 func (s *MySuite) TestGetSpecFileExtensionsSetViaEnv(c *C) { 359 os.Clearenv() 360 os.Setenv(gaugeSpecFileExtensions, ".foo, .bar") 361 var contains = func(c []string, what string) bool { 362 for _, x := range c { 363 if x == what { 364 return true 365 } 366 } 367 return false 368 } 369 370 exts := GaugeSpecFileExtensions() 371 for _, expected := range []string{".foo", ".bar"} { 372 c.Assert(contains(exts, expected), Equals, true) 373 } 374 } 375 376 func (s *MySuite) TestShouldNotGetDefaultExtensionsWhenEnvIsSet(c *C) { 377 os.Clearenv() 378 os.Setenv(gaugeSpecFileExtensions, ".foo, .bar") 379 var contains = func(c []string, what string) bool { 380 for _, x := range c { 381 if x == what { 382 return true 383 } 384 } 385 return false 386 } 387 388 exts := GaugeSpecFileExtensions() 389 for _, expected := range []string{".spec", ".md"} { 390 c.Assert(contains(exts, expected), Equals, false) 391 } 392 } 393 394 func (s *MySuite) TestLoadDefaultEnvWithSubstitutedVariablesFromProperties(c *C) { 395 os.Clearenv() 396 config.ProjectRoot = "_testdata/proj4" 397 e := LoadEnv(common.DefaultEnvDir, nil) 398 c.Assert(e, Equals, nil) 399 c.Assert(os.Getenv("service_url"), Equals, "http://default.service.com") 400 c.Assert(os.Getenv("path"), Equals, "api/default/endpoint") 401 c.Assert(os.Getenv("api_url"), Equals, "http://default.service.com/api/default/endpoint") 402 } 403 404 func (s *MySuite) TestLoadEnvWithSubstitutedVariablesFromProperties(c *C) { 405 os.Clearenv() 406 config.ProjectRoot = "_testdata/proj4" 407 e := LoadEnv("foo", nil) 408 c.Assert(e, Equals, nil) 409 c.Assert(os.Getenv("service_url"), Equals, "http://foo.service.com") 410 c.Assert(os.Getenv("path"), Equals, "api/default/endpoint") 411 c.Assert(os.Getenv("api_url"), Equals, "http://foo.service.com/api/default/endpoint") 412 c.Assert(os.Getenv("nested"), Equals, "http://foo.service.com/api/default/endpoint") 413 } 414 415 func (s *MySuite) TestLoadEnvWithSubstitutedVariablesFromPropertiesAndSetInShell(c *C) { 416 os.Clearenv() 417 os.Setenv("service_url", "http://system.service.com") 418 config.ProjectRoot = "_testdata/proj4" 419 e := LoadEnv("foo", nil) 420 c.Assert(e, Equals, nil) 421 c.Assert(os.Getenv("service_url"), Equals, "http://system.service.com") 422 c.Assert(os.Getenv("path"), Equals, "api/default/endpoint") 423 c.Assert(os.Getenv("api_url"), Equals, "http://system.service.com/api/default/endpoint") 424 c.Assert(os.Getenv("nested"), Equals, "http://system.service.com/api/default/endpoint") 425 } 426 427 func (s *MySuite) TestLoadEnvWithCircularPropertiesAcrossEnvironments(c *C) { 428 os.Clearenv() 429 config.ProjectRoot = "_testdata/proj6" 430 e := LoadEnv("circular", nil) 431 c.Assert(e, ErrorMatches, "Failed to load env. circular reference in:\n.*\n") 432 } 433 434 func (s *MySuite) TestLoadEnvWithCircularPropertiesAcrossFiles(c *C) { 435 os.Clearenv() 436 config.ProjectRoot = "_testdata/proj4" 437 e := LoadEnv("circular", func(err error) { 438 c.Assert(err, ErrorMatches, "circular reference in:\n.*\n.*\n.*\n") 439 }) 440 c.Assert(e, Equals, nil) 441 } 442 443 func (s *MySuite) TestLoadEnvWithAcyclicProperties(c *C) { 444 os.Clearenv() 445 config.ProjectRoot = "_testdata/proj4" 446 e := LoadEnv("acyclic", nil) 447 c.Assert(e, Equals, nil) 448 c.Assert(os.Getenv("a"), Equals, "foo/foo/foo") 449 c.Assert(os.Getenv("b"), Equals, "foo") 450 c.Assert(os.Getenv("c"), Equals, "foo") 451 c.Assert(os.Getenv("d"), Equals, "foo") 452 c.Assert(os.Getenv("e"), Equals, "foo") 453 c.Assert(os.Getenv("f"), Equals, "foo") 454 }