github.com/AliyunContainerService/cli@v0.0.0-20181009023821-814ced4b30d0/cli/compose/schema/schema_test.go (about) 1 package schema 2 3 import ( 4 "testing" 5 6 "gotest.tools/assert" 7 ) 8 9 type dict map[string]interface{} 10 11 func TestValidate(t *testing.T) { 12 config := dict{ 13 "version": "3.0", 14 "services": dict{ 15 "foo": dict{ 16 "image": "busybox", 17 }, 18 }, 19 } 20 21 assert.NilError(t, Validate(config, "3.0")) 22 } 23 24 func TestValidateUndefinedTopLevelOption(t *testing.T) { 25 config := dict{ 26 "version": "3.0", 27 "helicopters": dict{ 28 "foo": dict{ 29 "image": "busybox", 30 }, 31 }, 32 } 33 34 err := Validate(config, "3.0") 35 assert.ErrorContains(t, err, "Additional property helicopters is not allowed") 36 } 37 38 func TestValidateAllowsXTopLevelFields(t *testing.T) { 39 config := dict{ 40 "version": "3.4", 41 "x-extra-stuff": dict{}, 42 } 43 44 err := Validate(config, "3.4") 45 assert.NilError(t, err) 46 } 47 48 func TestValidateAllowsXFields(t *testing.T) { 49 config := dict{ 50 "version": "3.7", 51 "services": dict{ 52 "bar": dict{ 53 "x-extra-stuff": dict{}, 54 }, 55 }, 56 "volumes": dict{ 57 "bar": dict{ 58 "x-extra-stuff": dict{}, 59 }, 60 }, 61 "networks": dict{ 62 "bar": dict{ 63 "x-extra-stuff": dict{}, 64 }, 65 }, 66 "configs": dict{ 67 "bar": dict{ 68 "x-extra-stuff": dict{}, 69 }, 70 }, 71 "secrets": dict{ 72 "bar": dict{ 73 "x-extra-stuff": dict{}, 74 }, 75 }, 76 } 77 err := Validate(config, "3.7") 78 assert.NilError(t, err) 79 } 80 81 func TestValidateSecretConfigNames(t *testing.T) { 82 config := dict{ 83 "version": "3.5", 84 "configs": dict{ 85 "bar": dict{ 86 "name": "foobar", 87 }, 88 }, 89 "secrets": dict{ 90 "baz": dict{ 91 "name": "foobaz", 92 }, 93 }, 94 } 95 96 err := Validate(config, "3.5") 97 assert.NilError(t, err) 98 } 99 100 func TestValidateInvalidVersion(t *testing.T) { 101 config := dict{ 102 "version": "2.1", 103 "services": dict{ 104 "foo": dict{ 105 "image": "busybox", 106 }, 107 }, 108 } 109 110 err := Validate(config, "2.1") 111 assert.ErrorContains(t, err, "unsupported Compose file version: 2.1") 112 } 113 114 type array []interface{} 115 116 func TestValidatePlacement(t *testing.T) { 117 config := dict{ 118 "version": "3.3", 119 "services": dict{ 120 "foo": dict{ 121 "image": "busybox", 122 "deploy": dict{ 123 "placement": dict{ 124 "preferences": array{ 125 dict{ 126 "spread": "node.labels.az", 127 }, 128 }, 129 }, 130 }, 131 }, 132 }, 133 } 134 135 assert.NilError(t, Validate(config, "3.3")) 136 } 137 138 func TestValidateIsolation(t *testing.T) { 139 config := dict{ 140 "version": "3.5", 141 "services": dict{ 142 "foo": dict{ 143 "image": "busybox", 144 "isolation": "some-isolation-value", 145 }, 146 }, 147 } 148 assert.NilError(t, Validate(config, "3.5")) 149 } 150 151 func TestValidateRollbackConfig(t *testing.T) { 152 config := dict{ 153 "version": "3.4", 154 "services": dict{ 155 "foo": dict{ 156 "image": "busybox", 157 "deploy": dict{ 158 "rollback_config": dict{ 159 "parallelism": 1, 160 }, 161 }, 162 }, 163 }, 164 } 165 166 assert.NilError(t, Validate(config, "3.7")) 167 } 168 169 func TestValidateRollbackConfigWithOrder(t *testing.T) { 170 config := dict{ 171 "version": "3.4", 172 "services": dict{ 173 "foo": dict{ 174 "image": "busybox", 175 "deploy": dict{ 176 "rollback_config": dict{ 177 "parallelism": 1, 178 "order": "start-first", 179 }, 180 }, 181 }, 182 }, 183 } 184 185 assert.NilError(t, Validate(config, "3.7")) 186 } 187 188 func TestValidateRollbackConfigWithUpdateConfig(t *testing.T) { 189 config := dict{ 190 "version": "3.4", 191 "services": dict{ 192 "foo": dict{ 193 "image": "busybox", 194 "deploy": dict{ 195 "update_config": dict{ 196 "parallelism": 1, 197 "order": "start-first", 198 }, 199 "rollback_config": dict{ 200 "parallelism": 1, 201 "order": "start-first", 202 }, 203 }, 204 }, 205 }, 206 } 207 208 assert.NilError(t, Validate(config, "3.7")) 209 } 210 211 func TestValidateRollbackConfigWithUpdateConfigFull(t *testing.T) { 212 config := dict{ 213 "version": "3.4", 214 "services": dict{ 215 "foo": dict{ 216 "image": "busybox", 217 "deploy": dict{ 218 "update_config": dict{ 219 "parallelism": 1, 220 "order": "start-first", 221 "delay": "10s", 222 "failure_action": "pause", 223 "monitor": "10s", 224 }, 225 "rollback_config": dict{ 226 "parallelism": 1, 227 "order": "start-first", 228 "delay": "10s", 229 "failure_action": "pause", 230 "monitor": "10s", 231 }, 232 }, 233 }, 234 }, 235 } 236 237 assert.NilError(t, Validate(config, "3.7")) 238 }