github.com/AngusLu/go-swagger@v0.28.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/go-openapi/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  }