github.com/motyar/up@v0.2.10/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-west-2
   116    • eu-central-1
   117    • ap-northeast-1
   118    • ap-southeast-1
   119    • ap-southeast-2
   120    • us-east-2
   121    • us-west-1
   122    • ap-northeast-2
   123    • ap-south-1
   124    • sa-east-1
   125    • ca-central-1`)
   126  	})
   127  
   128  	t.Run("invalid", func(t *testing.T) {
   129  		c := Config{
   130  			Name:    "api",
   131  			Type:    "server",
   132  			Regions: []string{"us-west-1", "us-west-9"},
   133  		}
   134  
   135  		assert.NoError(t, c.Default(), "default")
   136  
   137  		assert.EqualError(t, c.Validate(), `.regions: "us-west-9" is invalid, must be one of:
   138  
   139    • us-east-1
   140    • us-west-2
   141    • eu-west-1
   142    • eu-west-2
   143    • eu-central-1
   144    • ap-northeast-1
   145    • ap-southeast-1
   146    • ap-southeast-2
   147    • us-east-2
   148    • us-west-1
   149    • ap-northeast-2
   150    • ap-south-1
   151    • sa-east-1
   152    • ca-central-1`)
   153  	})
   154  }
   155  
   156  func TestConfig_defaultRegions(t *testing.T) {
   157  	t.Run("regions from config", func(t *testing.T) {
   158  		regions := []string{"us-west-2", "us-east-1"}
   159  		c := Config{
   160  			Name:    "api",
   161  			Type:    "server",
   162  			Regions: regions,
   163  		}
   164  		assert.NoError(t, c.Default(), "default")
   165  
   166  		assert.NoError(t, c.defaultRegions(), "defaultRegions")
   167  		assert.Equal(t, 2, len(c.Regions), "regions should have length 2")
   168  		assert.Equal(t, regions, c.Regions, "should read regions from config")
   169  		assert.NoError(t, c.Validate(), "validate")
   170  	})
   171  
   172  	t.Run("regions from AWS_REGION", func(t *testing.T) {
   173  		region := "sa-east-1"
   174  		os.Setenv("AWS_REGION", region)
   175  
   176  		defer os.Setenv("AWS_REGION", "")
   177  		c := Config{
   178  			Name: "api",
   179  			Type: "server",
   180  		}
   181  		assert.NoError(t, c.Default(), "default")
   182  
   183  		assert.NoError(t, c.defaultRegions(), "defaultRegions")
   184  		assert.Equal(t, 1, len(c.Regions), "regions should have length 1")
   185  		assert.Equal(t, region, c.Regions[0], "should read regions from AWS_REGION")
   186  		assert.NoError(t, c.Default(), "default")
   187  		assert.NoError(t, c.Validate(), "validate")
   188  	})
   189  
   190  	t.Run("regions from AWS_DEFAULT_REGION", func(t *testing.T) {
   191  		region := "sa-east-1"
   192  
   193  		os.Setenv("AWS_DEFAULT_REGION", region)
   194  		defer os.Setenv("AWS_DEFAULT_REGION", "")
   195  
   196  		c := Config{
   197  			Name: "api",
   198  			Type: "server",
   199  		}
   200  		assert.NoError(t, c.Default(), "default")
   201  
   202  		assert.NoError(t, c.defaultRegions(), "defaultRegions")
   203  		assert.Equal(t, 1, len(c.Regions), "regions should have length 1")
   204  		assert.Equal(t, region, c.Regions[0], "should read regions from AWS_DEFAULT_REGION")
   205  		assert.NoError(t, c.Validate(), "validate")
   206  	})
   207  
   208  	t.Run("regions from shared config with default profile", func(t *testing.T) {
   209  		content := `
   210  		[default]
   211  		region = sa-east-1
   212  		output = json
   213  		[profile another-profile]
   214  		region = ap-southeast-2
   215  		output = json`
   216  
   217  		tmpfile, err := ioutil.TempFile("", "config")
   218  		assert.NoError(t, err)
   219  		defer os.Remove(tmpfile.Name())
   220  
   221  		_, err = tmpfile.WriteString(content)
   222  		assert.NoError(t, err)
   223  
   224  		os.Setenv("AWS_CONFIG_FILE", tmpfile.Name())
   225  		defer os.Setenv("AWS_CONFIG_FILE", "")
   226  
   227  		c := Config{
   228  			Name: "api",
   229  			Type: "server",
   230  		}
   231  		assert.NoError(t, c.Default(), "default")
   232  
   233  		assert.NoError(t, c.defaultRegions(), "defaultRegions")
   234  		assert.Equal(t, 1, len(c.Regions), "regions should have length 1")
   235  		assert.Equal(t, "sa-east-1", c.Regions[0], "should read regions from shared config with default profile")
   236  		assert.NoError(t, c.Validate(), "validate")
   237  	})
   238  
   239  	t.Run("regions from shared config with AWS_PROFILE profile", func(t *testing.T) {
   240  		content := `
   241  		[default]
   242  		region = sa-east-1
   243  		output = json
   244  		[profile another-profile]
   245  		region = ap-southeast-2
   246  		output = json`
   247  
   248  		tmpfile, err := ioutil.TempFile("", "config")
   249  		assert.NoError(t, err)
   250  		defer os.Remove(tmpfile.Name())
   251  
   252  		_, err = tmpfile.WriteString(content)
   253  		assert.NoError(t, err)
   254  
   255  		os.Setenv("AWS_CONFIG_FILE", tmpfile.Name())
   256  		defer os.Setenv("AWS_CONFIG_FILE", "")
   257  
   258  		os.Setenv("AWS_PROFILE", "another-profile")
   259  		defer os.Setenv("AWS_PROFILE", "")
   260  
   261  		c := Config{
   262  			Name: "api",
   263  			Type: "server",
   264  		}
   265  		assert.NoError(t, c.Default(), "default")
   266  
   267  		assert.NoError(t, c.defaultRegions(), "defaultRegions")
   268  		assert.Equal(t, 1, len(c.Regions), "regions should have length 1")
   269  		assert.Equal(t, "ap-southeast-2", c.Regions[0], "should read regions from shared config with AWS_PROFILE profile")
   270  		assert.NoError(t, c.Validate(), "validate")
   271  	})
   272  
   273  	t.Run("default region must be us-west-2", func(t *testing.T) {
   274  		// Make sure we aren't reading AWS config file
   275  		os.Setenv("AWS_CONFIG_FILE", "does-not-exist")
   276  
   277  		c := Config{
   278  			Name: "api",
   279  			Type: "server",
   280  		}
   281  		assert.NoError(t, c.Default(), "default")
   282  
   283  		assert.NoError(t, c.defaultRegions(), "defaultRegions")
   284  		assert.Equal(t, 1, len(c.Regions), "regions should have length 1")
   285  		assert.Equal(t, "us-west-2", c.Regions[0], "default region must be us-west-2")
   286  		assert.NoError(t, c.Validate(), "validate")
   287  	})
   288  }