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 }