github.com/suedadam/up@v0.1.12/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 }