github.com/circl-dev/go-swagger@v0.31.0/scan/parameters_test.go (about) 1 // +build !go1.11 2 3 // Copyright 2015 go-swagger maintainers 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 17 package scan 18 19 import ( 20 goparser "go/parser" 21 "log" 22 "testing" 23 24 "github.com/circl-dev/spec" 25 "github.com/stretchr/testify/assert" 26 ) 27 28 const ( 29 gcBadEnum = "bad_enum" 30 ) 31 32 func TestScanFileParam(t *testing.T) { 33 docFile := "../fixtures/goparsing/classification/operations/noparams.go" 34 fileTree, err := goparser.ParseFile(classificationProg.Fset, docFile, nil, goparser.ParseComments) 35 if err != nil { 36 log.Fatal(err) 37 } 38 sp := newParameterParser(classificationProg) 39 noParamOps := make(map[string]*spec.Operation) 40 err = sp.Parse(fileTree, noParamOps) 41 if err != nil { 42 log.Fatal(err) 43 } 44 assert.Len(t, noParamOps, 10) 45 46 of, ok := noParamOps["myOperation"] 47 assert.True(t, ok) 48 assert.Len(t, of.Parameters, 1) 49 fileParam := of.Parameters[0] 50 assert.Equal(t, "MyFormFile desc.", fileParam.Description) 51 assert.Equal(t, "formData", fileParam.In) 52 assert.Equal(t, "file", fileParam.Type) 53 assert.False(t, fileParam.Required) 54 55 emb, ok := noParamOps["myOtherOperation"] 56 assert.True(t, ok) 57 assert.Len(t, emb.Parameters, 2) 58 fileParam = emb.Parameters[0] 59 assert.Equal(t, "MyFormFile desc.", fileParam.Description) 60 assert.Equal(t, "formData", fileParam.In) 61 assert.Equal(t, "file", fileParam.Type) 62 assert.False(t, fileParam.Required) 63 extraParam := emb.Parameters[1] 64 assert.Equal(t, "ExtraParam desc.", extraParam.Description) 65 assert.Equal(t, "formData", extraParam.In) 66 assert.Equal(t, "integer", extraParam.Type) 67 assert.True(t, extraParam.Required) 68 69 ffp, ok := noParamOps["myFuncOperation"] 70 assert.True(t, ok) 71 assert.Len(t, ffp.Parameters, 1) 72 fileParam = ffp.Parameters[0] 73 assert.Equal(t, "MyFormFile desc.", fileParam.Description) 74 assert.Equal(t, "formData", fileParam.In) 75 assert.Equal(t, "file", fileParam.Type) 76 assert.False(t, fileParam.Required) 77 } 78 79 func TestParamsParser(t *testing.T) { 80 docFile := "../fixtures/goparsing/classification/operations/noparams.go" 81 fileTree, err := goparser.ParseFile(classificationProg.Fset, docFile, nil, goparser.ParseComments) 82 if err != nil { 83 log.Fatal(err) 84 } 85 sp := newParameterParser(classificationProg) 86 noParamOps := make(map[string]*spec.Operation) 87 err = sp.Parse(fileTree, noParamOps) 88 if err != nil { 89 log.Fatal(err) 90 } 91 assert.Len(t, noParamOps, 10) 92 93 cr, okParam := noParamOps["yetAnotherOperation"] 94 assert.True(t, okParam) 95 assert.Len(t, cr.Parameters, 8) 96 for _, param := range cr.Parameters { 97 switch param.Name { 98 case "id": 99 assert.Equal(t, "integer", param.Type) 100 assert.Equal(t, "int64", param.Format) 101 case "name": 102 assert.Equal(t, "string", param.Type) 103 assert.Equal(t, "", param.Format) 104 case "age": 105 assert.Equal(t, "integer", param.Type) 106 assert.Equal(t, "int32", param.Format) 107 case "notes": 108 assert.Equal(t, "string", param.Type) 109 assert.Equal(t, "", param.Format) 110 case "extra": 111 assert.Equal(t, "string", param.Type) 112 assert.Equal(t, "", param.Format) 113 case "createdAt": 114 assert.Equal(t, "string", param.Type) 115 assert.Equal(t, "date-time", param.Format) 116 case "informity": 117 assert.Equal(t, "string", param.Type) 118 assert.Equal(t, "formData", param.In) 119 case "NoTagName": 120 assert.Equal(t, "string", param.Type) 121 assert.Equal(t, "", param.Format) 122 default: 123 assert.Fail(t, "unknown property: "+param.Name) 124 } 125 } 126 127 ob, okParam := noParamOps["updateOrder"] 128 assert.True(t, okParam) 129 assert.Len(t, ob.Parameters, 1) 130 bodyParam := ob.Parameters[0] 131 assert.Equal(t, "The order to submit.", bodyParam.Description) 132 assert.Equal(t, "body", bodyParam.In) 133 assert.Equal(t, "#/definitions/order", bodyParam.Schema.Ref.String()) 134 assert.True(t, bodyParam.Required) 135 136 mop, okParam := noParamOps["getOrders"] 137 assert.True(t, okParam) 138 assert.Len(t, mop.Parameters, 2) 139 ordersParam := mop.Parameters[0] 140 assert.Equal(t, "The orders", ordersParam.Description) 141 assert.True(t, ordersParam.Required) 142 assert.Equal(t, "array", ordersParam.Type) 143 otherParam := mop.Parameters[1] 144 assert.Equal(t, "And another thing", otherParam.Description) 145 146 op, okParam := noParamOps["someOperation"] 147 assert.True(t, okParam) 148 assert.Len(t, op.Parameters, 10) 149 150 for _, param := range op.Parameters { 151 switch param.Name { 152 case "id": 153 assert.Equal(t, "ID of this no model instance.\nids in this application start at 11 and are smaller than 1000", param.Description) 154 assert.Equal(t, "path", param.In) 155 assert.Equal(t, "integer", param.Type) 156 assert.Equal(t, "int64", param.Format) 157 assert.True(t, param.Required) 158 assert.Equal(t, "ID", param.Extensions["x-go-name"]) 159 assert.EqualValues(t, 1000, *param.Maximum) 160 assert.True(t, param.ExclusiveMaximum) 161 assert.EqualValues(t, 10, *param.Minimum) 162 assert.True(t, param.ExclusiveMinimum) 163 assert.Equal(t, 1, param.Default, "%s default value is incorrect", param.Name) 164 165 case "score": 166 assert.Equal(t, "The Score of this model", param.Description) 167 assert.Equal(t, "query", param.In) 168 assert.Equal(t, "integer", param.Type) 169 assert.Equal(t, "int32", param.Format) 170 assert.True(t, param.Required) 171 assert.Equal(t, "Score", param.Extensions["x-go-name"]) 172 assert.EqualValues(t, 45, *param.Maximum) 173 assert.False(t, param.ExclusiveMaximum) 174 assert.EqualValues(t, 3, *param.Minimum) 175 assert.False(t, param.ExclusiveMinimum) 176 assert.Equal(t, 2, param.Default, "%s default value is incorrect", param.Name) 177 assert.Equal(t, 27, param.Example) 178 179 case "x-hdr-name": 180 assert.Equal(t, "Name of this no model instance", param.Description) 181 assert.Equal(t, "header", param.In) 182 assert.Equal(t, "string", param.Type) 183 assert.True(t, param.Required) 184 assert.Equal(t, "Name", param.Extensions["x-go-name"]) 185 assert.EqualValues(t, 4, *param.MinLength) 186 assert.EqualValues(t, 50, *param.MaxLength) 187 assert.Equal(t, "[A-Za-z0-9-.]*", param.Pattern) 188 189 case "created": 190 assert.Equal(t, "Created holds the time when this entry was created", param.Description) 191 assert.Equal(t, "query", param.In) 192 assert.Equal(t, "string", param.Type) 193 assert.Equal(t, "date-time", param.Format) 194 assert.False(t, param.Required) 195 assert.Equal(t, "Created", param.Extensions["x-go-name"]) 196 197 case "category": 198 assert.Equal(t, "The Category of this model", param.Description) 199 assert.Equal(t, "query", param.In) 200 assert.Equal(t, "string", param.Type) 201 assert.True(t, param.Required) 202 assert.Equal(t, "Category", param.Extensions["x-go-name"]) 203 assert.EqualValues(t, []interface{}{"foo", "bar", "none"}, param.Enum, "%s enum values are incorrect", param.Name) 204 assert.Equal(t, "bar", param.Default, "%s default value is incorrect", param.Name) 205 case "type": 206 assert.Equal(t, "Type of this model", param.Description) 207 assert.Equal(t, "query", param.In) 208 assert.Equal(t, "integer", param.Type) 209 assert.EqualValues(t, []interface{}{1, 3, 5}, param.Enum, "%s enum values are incorrect", param.Name) 210 case gcBadEnum: 211 assert.Equal(t, "query", param.In) 212 assert.Equal(t, "integer", param.Type) 213 assert.EqualValues(t, []interface{}{1, "rsq", "qaz"}, param.Enum, "%s enum values are incorrect", param.Name) 214 case "foo_slice": 215 assert.Equal(t, "a FooSlice has foos which are strings", param.Description) 216 assert.Equal(t, "FooSlice", param.Extensions["x-go-name"]) 217 assert.Equal(t, "query", param.In) 218 assert.Equal(t, "array", param.Type) 219 assert.False(t, param.Required) 220 assert.True(t, param.UniqueItems) 221 assert.Equal(t, "pipe", param.CollectionFormat) 222 assert.EqualValues(t, 3, *param.MinItems, "'foo_slice' should have had 3 min items") 223 assert.EqualValues(t, 10, *param.MaxItems, "'foo_slice' should have had 10 max items") 224 itprop := param.Items 225 assert.EqualValues(t, 3, *itprop.MinLength, "'foo_slice.items.minLength' should have been 3") 226 assert.EqualValues(t, 10, *itprop.MaxLength, "'foo_slice.items.maxLength' should have been 10") 227 assert.EqualValues(t, "\\w+", itprop.Pattern, "'foo_slice.items.pattern' should have \\w+") 228 assert.EqualValues(t, "bar", itprop.Default, "'foo_slice.items.default' should have bar default value") 229 230 case "items": 231 assert.Equal(t, "Items", param.Extensions["x-go-name"]) 232 assert.Equal(t, "body", param.In) 233 assert.NotNil(t, param.Schema) 234 aprop := param.Schema 235 assert.Equal(t, "array", aprop.Type[0]) 236 assert.NotNil(t, aprop.Items) 237 assert.NotNil(t, aprop.Items.Schema) 238 itprop := aprop.Items.Schema 239 assert.Len(t, itprop.Properties, 4) 240 assert.Len(t, itprop.Required, 3) 241 assertProperty(t, itprop, "integer", "id", "int32", "ID") 242 iprop, ok := itprop.Properties["id"] 243 assert.True(t, ok) 244 assert.Equal(t, "ID of this no model instance.\nids in this application start at 11 and are smaller than 1000", iprop.Description) 245 assert.EqualValues(t, 1000, *iprop.Maximum) 246 assert.True(t, iprop.ExclusiveMaximum, "'id' should have had an exclusive maximum") 247 assert.NotNil(t, iprop.Minimum) 248 assert.EqualValues(t, 10, *iprop.Minimum) 249 assert.True(t, iprop.ExclusiveMinimum, "'id' should have had an exclusive minimum") 250 assert.Equal(t, 3, iprop.Default, "Items.ID default value is incorrect") 251 252 assertRef(t, itprop, "pet", "Pet", "#/definitions/pet") 253 iprop, ok = itprop.Properties["pet"] 254 assert.True(t, ok) 255 // if itprop.Ref.String() == "" { 256 // assert.Equal(t, "The Pet to add to this NoModel items bucket.\nPets can appear more than once in the bucket", iprop.Description) 257 // } 258 259 assertProperty(t, itprop, "integer", "quantity", "int16", "Quantity") 260 iprop, ok = itprop.Properties["quantity"] 261 assert.True(t, ok) 262 assert.Equal(t, "The amount of pets to add to this bucket.", iprop.Description) 263 assert.EqualValues(t, 1, *iprop.Minimum) 264 assert.EqualValues(t, 10, *iprop.Maximum) 265 266 assertProperty(t, itprop, "string", "notes", "", "Notes") 267 iprop, ok = itprop.Properties["notes"] 268 assert.True(t, ok) 269 assert.Equal(t, "Notes to add to this item.\nThis can be used to add special instructions.", iprop.Description) 270 271 case "bar_slice": 272 assert.Equal(t, "a BarSlice has bars which are strings", param.Description) 273 assert.Equal(t, "BarSlice", param.Extensions["x-go-name"]) 274 assert.Equal(t, "query", param.In) 275 assert.Equal(t, "array", param.Type) 276 assert.False(t, param.Required) 277 assert.True(t, param.UniqueItems) 278 assert.Equal(t, "pipe", param.CollectionFormat) 279 assert.NotNil(t, param.Items, "bar_slice should have had an items property") 280 assert.EqualValues(t, 3, *param.MinItems, "'bar_slice' should have had 3 min items") 281 assert.EqualValues(t, 10, *param.MaxItems, "'bar_slice' should have had 10 max items") 282 itprop := param.Items 283 if assert.NotNil(t, itprop) { 284 assert.EqualValues(t, 4, *itprop.MinItems, "'bar_slice.items.minItems' should have been 4") 285 assert.EqualValues(t, 9, *itprop.MaxItems, "'bar_slice.items.maxItems' should have been 9") 286 itprop2 := itprop.Items 287 if assert.NotNil(t, itprop2) { 288 assert.EqualValues(t, 5, *itprop2.MinItems, "'bar_slice.items.items.minItems' should have been 5") 289 assert.EqualValues(t, 8, *itprop2.MaxItems, "'bar_slice.items.items.maxItems' should have been 8") 290 itprop3 := itprop2.Items 291 if assert.NotNil(t, itprop3) { 292 assert.EqualValues(t, 3, *itprop3.MinLength, "'bar_slice.items.items.items.minLength' should have been 3") 293 assert.EqualValues(t, 10, *itprop3.MaxLength, "'bar_slice.items.items.items.maxLength' should have been 10") 294 assert.EqualValues(t, "\\w+", itprop3.Pattern, "'bar_slice.items.items.items.pattern' should have \\w+") 295 } 296 } 297 } 298 299 default: 300 assert.Fail(t, "unknown property: "+param.Name) 301 } 302 } 303 304 // assert that the order of the parameters is maintained 305 order, ok := noParamOps["anotherOperation"] 306 assert.True(t, ok) 307 assert.Len(t, order.Parameters, 10) 308 309 for index, param := range order.Parameters { 310 switch param.Name { 311 case "id": 312 assert.Equal(t, 0, index, "%s index incorrect", param.Name) 313 case "score": 314 assert.Equal(t, 1, index, "%s index incorrect", param.Name) 315 case "x-hdr-name": 316 assert.Equal(t, 2, index, "%s index incorrect", param.Name) 317 case "created": 318 assert.Equal(t, 3, index, "%s index incorrect", param.Name) 319 case "category": 320 assert.Equal(t, 4, index, "%s index incorrect", param.Name) 321 case "type": 322 assert.Equal(t, 5, index, "%s index incorrect", param.Name) 323 case gcBadEnum: 324 assert.Equal(t, 6, index, "%s index incorrect", param.Name) 325 case "foo_slice": 326 assert.Equal(t, 7, index, "%s index incorrect", param.Name) 327 case "bar_slice": 328 assert.Equal(t, 8, index, "%s index incorrect", param.Name) 329 case "items": 330 assert.Equal(t, 9, index, "%s index incorrect", param.Name) 331 default: 332 assert.Fail(t, "unknown property: "+param.Name) 333 } 334 } 335 336 // check that aliases work correctly 337 aliasOp, ok := noParamOps["someAliasOperation"] 338 assert.True(t, ok) 339 assert.Len(t, aliasOp.Parameters, 4) 340 for _, param := range aliasOp.Parameters { 341 switch param.Name { 342 case "intAlias": 343 assert.Equal(t, "query", param.In) 344 assert.Equal(t, "integer", param.Type) 345 assert.Equal(t, "int64", param.Format) 346 assert.True(t, param.Required) 347 assert.EqualValues(t, 10, *param.Maximum) 348 assert.EqualValues(t, 1, *param.Minimum) 349 case "stringAlias": 350 assert.Equal(t, "query", param.In) 351 assert.Equal(t, "string", param.Type) 352 case "intAliasPath": 353 assert.Equal(t, "path", param.In) 354 assert.Equal(t, "integer", param.Type) 355 assert.Equal(t, "int64", param.Format) 356 case "intAliasForm": 357 assert.Equal(t, "formData", param.In) 358 assert.Equal(t, "integer", param.Type) 359 assert.Equal(t, "int64", param.Format) 360 default: 361 assert.Fail(t, "unknown property: "+param.Name) 362 } 363 } 364 }