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  }