github.com/AngusLu/go-swagger@v0.28.0/scan/responses_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/go-openapi/spec" 25 "github.com/stretchr/testify/assert" 26 ) 27 28 func TestParseResponses(t *testing.T) { 29 docFile := "../fixtures/goparsing/classification/operations/responses.go" 30 fileTree, err := goparser.ParseFile(classificationProg.Fset, docFile, nil, goparser.ParseComments) 31 if err != nil { 32 log.Fatal(err) 33 } 34 35 rp := newResponseParser(classificationProg) 36 responses := make(map[string]spec.Response) 37 err = rp.Parse(fileTree, responses) 38 if err != nil { 39 t.Fatal(err) 40 } 41 assert.Len(t, responses, 9) 42 cr, ok := responses["complexerOne"] 43 assert.True(t, ok) 44 assert.Len(t, cr.Headers, 7) 45 for k, header := range cr.Headers { 46 switch k { 47 case "id": 48 assert.Equal(t, "integer", header.Type) 49 assert.Equal(t, "int64", header.Format) 50 case "name": 51 assert.Equal(t, "string", header.Type) 52 assert.Equal(t, "", header.Format) 53 case "age": 54 assert.Equal(t, "integer", header.Type) 55 assert.Equal(t, "int32", header.Format) 56 case "notes": 57 assert.Equal(t, "string", header.Type) 58 assert.Equal(t, "", header.Format) 59 case "extra": 60 assert.Equal(t, "string", header.Type) 61 assert.Equal(t, "", header.Format) 62 case "createdAt": 63 assert.Equal(t, "string", header.Type) 64 assert.Equal(t, "date-time", header.Format) 65 case "NoTagName": 66 assert.Equal(t, "string", header.Type) 67 assert.Equal(t, "", header.Format) 68 default: 69 assert.Fail(t, "unknown header: "+k) 70 } 71 } 72 73 cpr, ok := responses["complexerPointerOne"] 74 assert.True(t, ok) 75 assert.Len(t, cpr.Headers, 4) 76 for k, header := range cpr.Headers { 77 switch k { 78 case "id": 79 assert.Equal(t, "integer", header.Type) 80 assert.Equal(t, "int64", header.Format) 81 case "name": 82 assert.Equal(t, "string", header.Type) 83 assert.Equal(t, "", header.Format) 84 case "age": 85 assert.Equal(t, "integer", header.Type) 86 assert.Equal(t, "int32", header.Format) 87 case "extra": 88 assert.Equal(t, "integer", header.Type) 89 assert.Equal(t, "int64", header.Format) 90 default: 91 assert.Fail(t, "unknown header: "+k) 92 } 93 } 94 95 sos, ok := responses["simpleOnes"] 96 assert.True(t, ok) 97 assert.Len(t, sos.Headers, 1) 98 99 sosf, ok := responses["simpleOnesFunc"] 100 assert.True(t, ok) 101 assert.Len(t, sosf.Headers, 1) 102 103 res, ok := responses["someResponse"] 104 assert.True(t, ok) 105 assert.Len(t, res.Headers, 7) 106 107 for k, header := range res.Headers { 108 switch k { 109 case "id": 110 assert.Equal(t, "ID of this some response instance.\nids in this application start at 11 and are smaller than 1000", header.Description) 111 assert.Equal(t, "integer", header.Type) 112 assert.Equal(t, "int64", header.Format) 113 //assert.Equal(t, "ID", header.Extensions["x-go-name"]) 114 assert.EqualValues(t, 1000, *header.Maximum) 115 assert.True(t, header.ExclusiveMaximum) 116 assert.EqualValues(t, 10, *header.Minimum) 117 assert.True(t, header.ExclusiveMinimum) 118 assert.Equal(t, 11, header.Default, "ID default value is incorrect") 119 120 case "score": 121 assert.Equal(t, "The Score of this model", header.Description) 122 assert.Equal(t, "integer", header.Type) 123 assert.Equal(t, "int32", header.Format) 124 //assert.Equal(t, "Score", header.Extensions["x-go-name"]) 125 assert.EqualValues(t, 45, *header.Maximum) 126 assert.False(t, header.ExclusiveMaximum) 127 assert.EqualValues(t, 3, *header.Minimum) 128 assert.False(t, header.ExclusiveMinimum) 129 assert.Equal(t, 27, header.Example) 130 131 case "x-hdr-name": 132 assert.Equal(t, "Name of this some response instance", header.Description) 133 assert.Equal(t, "string", header.Type) 134 //assert.Equal(t, "Name", header.Extensions["x-go-name"]) 135 assert.EqualValues(t, 4, *header.MinLength) 136 assert.EqualValues(t, 50, *header.MaxLength) 137 assert.Equal(t, "[A-Za-z0-9-.]*", header.Pattern) 138 139 case "active": 140 assert.Equal(t, "Active state of the record", header.Description) 141 assert.Equal(t, "boolean", header.Type) 142 assert.Equal(t, true, header.Default) 143 144 case "created": 145 assert.Equal(t, "Created holds the time when this entry was created", header.Description) 146 assert.Equal(t, "string", header.Type) 147 assert.Equal(t, "date-time", header.Format) 148 //assert.Equal(t, "Created", header.Extensions["x-go-name"]) 149 150 case "foo_slice": 151 assert.Equal(t, "a FooSlice has foos which are strings", header.Description) 152 //assert.Equal(t, "FooSlice", header.Extensions["x-go-name"]) 153 assert.Equal(t, "array", header.Type) 154 assert.True(t, header.UniqueItems) 155 assert.Equal(t, "pipe", header.CollectionFormat) 156 assert.NotNil(t, header.Items, "foo_slice should have had an items property") 157 assert.EqualValues(t, 3, *header.MinItems, "'foo_slice' should have had 3 min items") 158 assert.EqualValues(t, 10, *header.MaxItems, "'foo_slice' should have had 10 max items") 159 itprop := header.Items 160 assert.EqualValues(t, 3, *itprop.MinLength, "'foo_slice.items.minLength' should have been 3") 161 assert.EqualValues(t, 10, *itprop.MaxLength, "'foo_slice.items.maxLength' should have been 10") 162 assert.EqualValues(t, "\\w+", itprop.Pattern, "'foo_slice.items.pattern' should have \\w+") 163 assert.Equal(t, "foo", itprop.Example) 164 165 case "bar_slice": 166 assert.Equal(t, "a BarSlice has bars which are strings", header.Description) 167 assert.Equal(t, "array", header.Type) 168 assert.True(t, header.UniqueItems) 169 assert.Equal(t, "pipe", header.CollectionFormat) 170 assert.NotNil(t, header.Items, "bar_slice should have had an items property") 171 assert.EqualValues(t, 3, *header.MinItems, "'bar_slice' should have had 3 min items") 172 assert.EqualValues(t, 10, *header.MaxItems, "'bar_slice' should have had 10 max items") 173 itprop := header.Items 174 if assert.NotNil(t, itprop) { 175 assert.EqualValues(t, 4, *itprop.MinItems, "'bar_slice.items.minItems' should have been 4") 176 assert.EqualValues(t, 9, *itprop.MaxItems, "'bar_slice.items.maxItems' should have been 9") 177 itprop2 := itprop.Items 178 if assert.NotNil(t, itprop2) { 179 assert.EqualValues(t, 5, *itprop2.MinItems, "'bar_slice.items.items.minItems' should have been 5") 180 assert.EqualValues(t, 8, *itprop2.MaxItems, "'bar_slice.items.items.maxItems' should have been 8") 181 itprop3 := itprop2.Items 182 if assert.NotNil(t, itprop3) { 183 assert.EqualValues(t, 3, *itprop3.MinLength, "'bar_slice.items.items.items.minLength' should have been 3") 184 assert.EqualValues(t, 10, *itprop3.MaxLength, "'bar_slice.items.items.items.maxLength' should have been 10") 185 assert.EqualValues(t, "\\w+", itprop3.Pattern, "'bar_slice.items.items.items.pattern' should have \\w+") 186 } 187 } 188 } 189 190 default: 191 assert.Fail(t, "unknown property: "+k) 192 } 193 } 194 195 assert.NotNil(t, res.Schema) 196 aprop := res.Schema 197 assert.Equal(t, "array", aprop.Type[0]) 198 assert.NotNil(t, aprop.Items) 199 assert.NotNil(t, aprop.Items.Schema) 200 itprop := aprop.Items.Schema 201 assert.Len(t, itprop.Properties, 4) 202 assert.Len(t, itprop.Required, 3) 203 assertProperty(t, itprop, "integer", "id", "int32", "ID") 204 iprop, ok := itprop.Properties["id"] 205 assert.True(t, ok) 206 assert.Equal(t, "ID of this some response instance.\nids in this application start at 11 and are smaller than 1000", iprop.Description) 207 assert.EqualValues(t, 1000, *iprop.Maximum) 208 assert.True(t, iprop.ExclusiveMaximum, "'id' should have had an exclusive maximum") 209 assert.NotNil(t, iprop.Minimum) 210 assert.EqualValues(t, 10, *iprop.Minimum) 211 assert.True(t, iprop.ExclusiveMinimum, "'id' should have had an exclusive minimum") 212 213 assertRef(t, itprop, "pet", "Pet", "#/definitions/pet") 214 iprop, ok = itprop.Properties["pet"] 215 assert.True(t, ok) 216 // if itprop.Ref.String() == "" { 217 // assert.Equal(t, "The Pet to add to this NoModel items bucket.\nPets can appear more than once in the bucket", iprop.Description) 218 // } 219 220 assertProperty(t, itprop, "integer", "quantity", "int16", "Quantity") 221 iprop, ok = itprop.Properties["quantity"] 222 assert.True(t, ok) 223 assert.Equal(t, "The amount of pets to add to this bucket.", iprop.Description) 224 assert.EqualValues(t, 1, *iprop.Minimum) 225 assert.EqualValues(t, 10, *iprop.Maximum) 226 227 assertProperty(t, itprop, "string", "notes", "", "Notes") 228 iprop, ok = itprop.Properties["notes"] 229 assert.True(t, ok) 230 assert.Equal(t, "Notes to add to this item.\nThis can be used to add special instructions.", iprop.Description) 231 232 res, ok = responses["resp"] 233 assert.True(t, ok) 234 assert.NotNil(t, res.Schema) 235 assert.Equal(t, "#/definitions/user", res.Schema.Ref.String()) 236 }