github.com/webonyx/up@v0.7.4-0.20180808230834-91b94e551323/config/config_test.go (about)

     1  package config
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/tj/assert"
     9  )
    10  
    11  func TestConfig_Name(t *testing.T) {
    12  	t.Run("valid", func(t *testing.T) {
    13  		c := Config{
    14  			Name: "my-app123",
    15  		}
    16  
    17  		assert.NoError(t, c.Default(), "default")
    18  		assert.NoError(t, c.Validate(), "validate")
    19  	})
    20  
    21  	t.Run("invalid", func(t *testing.T) {
    22  		c := Config{
    23  			Name: "my app",
    24  		}
    25  
    26  		assert.NoError(t, c.Default(), "default")
    27  		assert.EqualError(t, c.Validate(), `.name "my app": must contain only lowercase alphanumeric characters and '-'`)
    28  	})
    29  
    30  	t.Run("invalid", func(t *testing.T) {
    31  		c := Config{
    32  			Name: "MYAPP",
    33  		}
    34  
    35  		assert.NoError(t, c.Default(), "default")
    36  		assert.EqualError(t, c.Validate(), `.name "MYAPP": must contain only lowercase alphanumeric characters and '-'`)
    37  	})
    38  }
    39  
    40  func TestConfig_Type(t *testing.T) {
    41  	t.Run("default", func(t *testing.T) {
    42  		c := Config{
    43  			Name: "api",
    44  		}
    45  
    46  		assert.NoError(t, c.Default(), "default")
    47  		assert.NoError(t, c.Validate(), "validate")
    48  		assert.Equal(t, "server", c.Type)
    49  	})
    50  
    51  	t.Run("valid", func(t *testing.T) {
    52  		c := Config{
    53  			Name: "api",
    54  			Type: "server",
    55  		}
    56  
    57  		assert.NoError(t, c.Default(), "default")
    58  		assert.NoError(t, c.Validate(), "validate")
    59  	})
    60  
    61  	t.Run("invalid", func(t *testing.T) {
    62  		c := Config{
    63  			Name: "api",
    64  			Type: "something",
    65  		}
    66  
    67  		assert.NoError(t, c.Default(), "default")
    68  		assert.EqualError(t, c.Validate(), `.type: "something" is invalid, must be one of:
    69  
    70    • static
    71    • server`)
    72  	})
    73  }
    74  
    75  func TestConfig_Regions(t *testing.T) {
    76  	t.Skip()
    77  
    78  	t.Run("valid multiple", func(t *testing.T) {
    79  		c := Config{
    80  			Name:    "api",
    81  			Type:    "server",
    82  			Regions: []string{"us-west-2", "us-east-1"},
    83  		}
    84  
    85  		assert.NoError(t, c.Default(), "default")
    86  		assert.NoError(t, c.Validate(), "validate")
    87  	})
    88  
    89  	t.Run("valid multiple", func(t *testing.T) {
    90  		c := Config{
    91  			Name:    "api",
    92  			Type:    "server",
    93  			Regions: []string{"us-west-2", "us-east-1"},
    94  		}
    95  
    96  		assert.NoError(t, c.Default(), "default")
    97  		assert.NoError(t, c.Validate(), "validate")
    98  	})
    99  
   100  	t.Run("valid globbing", func(t *testing.T) {
   101  		c := Config{
   102  			Name:    "api",
   103  			Type:    "server",
   104  			Regions: []string{"us-*", "us-east-1", "ca-central-*"},
   105  		}
   106  
   107  		assert.NoError(t, c.Default(), "default")
   108  		assert.NoError(t, c.Validate(), "validate")
   109  		assert.Equal(t, []string{"us-east-2", "us-east-1", "us-west-1", "us-west-2", "us-east-1", "ca-central-1"}, c.Regions)
   110  	})
   111  
   112  	t.Run("invalid globbing", func(t *testing.T) {
   113  		c := Config{
   114  			Name:    "api",
   115  			Type:    "server",
   116  			Regions: []string{"uss-*"},
   117  		}
   118  
   119  		assert.NoError(t, c.Default(), "default")
   120  
   121  		assert.EqualError(t, c.Validate(), `.regions: "uss-*" is invalid, must be one of:
   122  
   123    • us-east-2
   124    • us-east-1
   125    • us-west-1
   126    • us-west-2
   127    • ap-south-1
   128    • ap-northeast-2
   129    • ap-southeast-1
   130    • ap-southeast-2
   131    • ap-northeast-1
   132    • ca-central-1
   133    • eu-central-1
   134    • eu-west-1
   135    • eu-west-2
   136    • eu-west-3
   137    • sa-east-1`)
   138  	})
   139  
   140  	t.Run("invalid", func(t *testing.T) {
   141  		c := Config{
   142  			Name:    "api",
   143  			Type:    "server",
   144  			Regions: []string{"us-west-1", "us-west-9"},
   145  		}
   146  
   147  		assert.NoError(t, c.Default(), "default")
   148  
   149  		assert.EqualError(t, c.Validate(), `.regions: "us-west-9" is invalid, must be one of:
   150  
   151    • us-east-2
   152    • us-east-1
   153    • us-west-1
   154    • us-west-2
   155    • ap-south-1
   156    • ap-northeast-2
   157    • ap-southeast-1
   158    • ap-southeast-2
   159    • ap-northeast-1
   160    • ca-central-1
   161    • eu-central-1
   162    • eu-west-1
   163    • eu-west-2
   164    • eu-west-3
   165    • sa-east-1`)
   166  	})
   167  }
   168  
   169  func TestConfig_defaultRegions(t *testing.T) {
   170  	t.Run("regions from config", func(t *testing.T) {
   171  		regions := []string{"us-east-1"}
   172  		c := Config{
   173  			Name:    "api",
   174  			Type:    "server",
   175  			Regions: regions,
   176  		}
   177  		assert.NoError(t, c.Default(), "default")
   178  
   179  		assert.NoError(t, c.defaultRegions(), "defaultRegions")
   180  		assert.Equal(t, 1, len(c.Regions), "regions should have length 2")
   181  		assert.Equal(t, regions, c.Regions, "should read regions from config")
   182  		assert.NoError(t, c.Validate(), "validate")
   183  	})
   184  
   185  	t.Run("regions from AWS_REGION", func(t *testing.T) {
   186  		region := "sa-east-1"
   187  		os.Setenv("AWS_REGION", region)
   188  
   189  		defer os.Setenv("AWS_REGION", "")
   190  		c := Config{
   191  			Name: "api",
   192  			Type: "server",
   193  		}
   194  		assert.NoError(t, c.Default(), "default")
   195  
   196  		assert.NoError(t, c.defaultRegions(), "defaultRegions")
   197  		assert.Equal(t, 1, len(c.Regions), "regions should have length 1")
   198  		assert.Equal(t, region, c.Regions[0], "should read regions from AWS_REGION")
   199  		assert.NoError(t, c.Default(), "default")
   200  		assert.NoError(t, c.Validate(), "validate")
   201  	})
   202  
   203  	t.Run("regions from AWS_DEFAULT_REGION", func(t *testing.T) {
   204  		region := "sa-east-1"
   205  
   206  		os.Setenv("AWS_DEFAULT_REGION", region)
   207  		defer os.Setenv("AWS_DEFAULT_REGION", "")
   208  
   209  		c := Config{
   210  			Name: "api",
   211  			Type: "server",
   212  		}
   213  		assert.NoError(t, c.Default(), "default")
   214  
   215  		assert.NoError(t, c.defaultRegions(), "defaultRegions")
   216  		assert.Equal(t, 1, len(c.Regions), "regions should have length 1")
   217  		assert.Equal(t, region, c.Regions[0], "should read regions from AWS_DEFAULT_REGION")
   218  		assert.NoError(t, c.Validate(), "validate")
   219  	})
   220  
   221  	t.Run("regions from shared config with default profile", func(t *testing.T) {
   222  		content := `
   223  		[default]
   224  		region = sa-east-1
   225  		output = json
   226  		[profile another-profile]
   227  		region = ap-southeast-2
   228  		output = json`
   229  
   230  		tmpfile, err := ioutil.TempFile("", "config")
   231  		assert.NoError(t, err)
   232  		defer os.Remove(tmpfile.Name())
   233  
   234  		_, err = tmpfile.WriteString(content)
   235  		assert.NoError(t, err)
   236  
   237  		os.Setenv("AWS_CONFIG_FILE", tmpfile.Name())
   238  		defer os.Setenv("AWS_CONFIG_FILE", "")
   239  
   240  		c := Config{
   241  			Name: "api",
   242  			Type: "server",
   243  		}
   244  		assert.NoError(t, c.Default(), "default")
   245  
   246  		assert.NoError(t, c.defaultRegions(), "defaultRegions")
   247  		assert.Equal(t, 1, len(c.Regions), "regions should have length 1")
   248  		assert.Equal(t, "sa-east-1", c.Regions[0], "should read regions from shared config with default profile")
   249  		assert.NoError(t, c.Validate(), "validate")
   250  	})
   251  
   252  	t.Run("regions from shared config with AWS_PROFILE profile", func(t *testing.T) {
   253  		content := `
   254  		[default]
   255  		region = sa-east-1
   256  		output = json
   257  		[profile another-profile]
   258  		region = ap-southeast-2
   259  		output = json`
   260  
   261  		tmpfile, err := ioutil.TempFile("", "config")
   262  		assert.NoError(t, err)
   263  		defer os.Remove(tmpfile.Name())
   264  
   265  		_, err = tmpfile.WriteString(content)
   266  		assert.NoError(t, err)
   267  
   268  		os.Setenv("AWS_CONFIG_FILE", tmpfile.Name())
   269  		defer os.Setenv("AWS_CONFIG_FILE", "")
   270  
   271  		os.Setenv("AWS_PROFILE", "another-profile")
   272  		defer os.Setenv("AWS_PROFILE", "")
   273  
   274  		c := Config{
   275  			Name: "api",
   276  			Type: "server",
   277  		}
   278  		assert.NoError(t, c.Default(), "default")
   279  
   280  		assert.NoError(t, c.defaultRegions(), "defaultRegions")
   281  		assert.Equal(t, 1, len(c.Regions), "regions should have length 1")
   282  		assert.Equal(t, "ap-southeast-2", c.Regions[0], "should read regions from shared config with AWS_PROFILE profile")
   283  		assert.NoError(t, c.Validate(), "validate")
   284  	})
   285  
   286  	t.Run("default region must be us-west-2", func(t *testing.T) {
   287  		// Make sure we aren't reading AWS config file
   288  		os.Setenv("AWS_CONFIG_FILE", "does-not-exist")
   289  
   290  		c := Config{
   291  			Name: "api",
   292  			Type: "server",
   293  		}
   294  		assert.NoError(t, c.Default(), "default")
   295  
   296  		assert.NoError(t, c.defaultRegions(), "defaultRegions")
   297  		assert.Equal(t, 1, len(c.Regions), "regions should have length 1")
   298  		assert.Equal(t, "us-west-2", c.Regions[0], "default region must be us-west-2")
   299  		assert.NoError(t, c.Validate(), "validate")
   300  	})
   301  }