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 }