github.com/orteth01/up@v0.2.0/config_test.go (about)

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