github.com/webonyx/up@v0.7.4-0.20180808230834-91b94e551323/config/stages_test.go (about) 1 package config 2 3 import ( 4 "testing" 5 6 "github.com/tj/assert" 7 ) 8 9 func TestStage_Override(t *testing.T) { 10 c, err := ParseConfigString(`{ 11 "name": "app", 12 "regions": ["us-west-2"], 13 "lambda": { 14 "memory": 128 15 }, 16 "hooks": { 17 "build": "parcel index.html -o build", 18 "clean": "rm -fr build" 19 }, 20 "proxy": { 21 "command": "node app.js" 22 }, 23 "stages": { 24 "production": { 25 "lambda": { 26 "memory": 1024 27 }, 28 "hooks": { 29 "build": "parcel index.html -o build --production" 30 } 31 }, 32 "staging": { 33 "proxy": { 34 "command": "node app.js --foo=bar" 35 } 36 } 37 } 38 }`) 39 40 assert.NoError(t, err, "parse") 41 assert.NoError(t, c.Default(), "default") 42 assert.NoError(t, c.Validate(), "validate") 43 44 assert.NoError(t, c.Override("production"), "override") 45 assert.Equal(t, 1024, c.Lambda.Memory) 46 assert.Equal(t, Hook{`parcel index.html -o build --production`}, c.Hooks.Build) 47 assert.Equal(t, `node app.js`, c.Proxy.Command) 48 49 assert.NoError(t, c.Override("staging"), "override") 50 assert.Equal(t, `node app.js --foo=bar`, c.Proxy.Command) 51 } 52 53 func TestStages_Default(t *testing.T) { 54 t.Run("no custom stages", func(t *testing.T) { 55 s := Stages{} 56 57 assert.NoError(t, s.Default(), "default") 58 assert.NoError(t, s.Validate(), "validate") 59 60 assert.Len(t, s, 3) 61 assert.Equal(t, "staging", s["staging"].Name) 62 assert.Equal(t, "production", s["production"].Name) 63 }) 64 65 t.Run("custom stages", func(t *testing.T) { 66 s := Stages{ 67 "beta": &Stage{}, 68 } 69 70 assert.NoError(t, s.Default(), "default") 71 assert.NoError(t, s.Validate(), "validate") 72 73 assert.Len(t, s, 4) 74 assert.Equal(t, "beta", s["beta"].Name) 75 assert.Equal(t, true, s["beta"].Zone) 76 }) 77 } 78 79 func TestStages_Validate(t *testing.T) { 80 t.Run("no stages", func(t *testing.T) { 81 s := Stages{} 82 assert.NoError(t, s.Validate(), "validate") 83 }) 84 85 t.Run("some stages", func(t *testing.T) { 86 s := Stages{ 87 "staging": &Stage{ 88 Domain: "gh-polls-stage.com", 89 }, 90 "production": &Stage{ 91 Domain: "gh-polls.com", 92 }, 93 } 94 95 assert.NoError(t, s.Default(), "default") 96 assert.NoError(t, s.Validate(), "validate") 97 assert.Equal(t, "staging", s["staging"].Name) 98 assert.Equal(t, "production", s["production"].Name) 99 }) 100 101 t.Run("valid zone boolean", func(t *testing.T) { 102 s := Stages{ 103 "production": &Stage{ 104 Domain: "gh-polls.com", 105 Zone: false, 106 }, 107 } 108 109 assert.NoError(t, s.Default(), "default") 110 assert.NoError(t, s.Validate(), "validate") 111 }) 112 113 t.Run("valid zone string", func(t *testing.T) { 114 s := Stages{ 115 "production": &Stage{ 116 Domain: "api.gh-polls.com", 117 Zone: "api.gh-polls.com", 118 }, 119 } 120 121 assert.NoError(t, s.Default(), "default") 122 assert.NoError(t, s.Validate(), "validate") 123 }) 124 125 t.Run("invalid zone type", func(t *testing.T) { 126 s := Stages{ 127 "production": &Stage{ 128 Domain: "api.gh-polls.com", 129 Zone: 123, 130 }, 131 } 132 133 assert.NoError(t, s.Default(), "default") 134 assert.EqualError(t, s.Validate(), `stage "production": .zone is an invalid type, must be string or boolean`) 135 }) 136 } 137 138 func TestStages_List(t *testing.T) { 139 stage := &Stage{ 140 Domain: "gh-polls-stage.com", 141 } 142 143 prod := &Stage{ 144 Domain: "gh-polls.com", 145 } 146 147 s := Stages{ 148 "staging": stage, 149 "production": prod, 150 } 151 152 list := []*Stage{ 153 stage, 154 prod, 155 } 156 157 stages := s.List() 158 assert.Equal(t, list, stages) 159 } 160 161 func TestStages_GetByDomain(t *testing.T) { 162 stage := &Stage{ 163 Domain: "gh-polls-stage.com", 164 } 165 166 prod := &Stage{ 167 Domain: "gh-polls.com", 168 } 169 170 s := Stages{ 171 "staging": stage, 172 "production": prod, 173 } 174 175 assert.Equal(t, prod, s.GetByDomain("gh-polls.com")) 176 }