github.com/go-swagger/go-swagger@v0.31.0/generator/enum_test.go (about)

     1  // Copyright 2015 go-swagger maintainers
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //    http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package generator
    16  
    17  import (
    18  	"bytes"
    19  	"fmt"
    20  	"strings"
    21  	"testing"
    22  
    23  	"github.com/go-openapi/loads"
    24  	"github.com/stretchr/testify/assert"
    25  	"github.com/stretchr/testify/require"
    26  )
    27  
    28  func TestEnum_StringThing(t *testing.T) {
    29  	specDoc, err := loads.Spec("../fixtures/codegen/todolist.enums.yml")
    30  	require.NoError(t, err)
    31  
    32  	definitions := specDoc.Spec().Definitions
    33  	k := "StringThing"
    34  	schema := definitions[k]
    35  	opts := opts()
    36  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
    37  	require.NoError(t, err)
    38  
    39  	buf := bytes.NewBuffer(nil)
    40  	err = templates.MustGet("model").Execute(buf, genModel)
    41  	require.NoError(t, err)
    42  
    43  	ff, err := opts.LanguageOpts.FormatContent("string_thing.go", buf.Bytes())
    44  	require.NoErrorf(t, err, buf.String())
    45  
    46  	res := string(ff)
    47  	assertInCode(t, "var stringThingEnum []interface{}", res)
    48  	assertInCode(t, k+") validateStringThingEnum(path, location string, value StringThing)", res)
    49  	assertInCode(t, "m.validateStringThingEnum(\"\", \"body\", m)", res)
    50  }
    51  
    52  func TestEnum_ComposedThing(t *testing.T) {
    53  	specDoc, err := loads.Spec("../fixtures/codegen/todolist.enums.yml")
    54  	require.NoError(t, err)
    55  
    56  	definitions := specDoc.Spec().Definitions
    57  	k := "ComposedThing"
    58  	schema := definitions[k]
    59  	opts := opts()
    60  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
    61  	require.NoError(t, err)
    62  
    63  	buf := bytes.NewBuffer(nil)
    64  	err = templates.MustGet("model").Execute(buf, genModel)
    65  	require.NoError(t, err)
    66  
    67  	ff, err := opts.LanguageOpts.FormatContent("composed_thing.go", buf.Bytes())
    68  	require.NoErrorf(t, err, buf.String())
    69  
    70  	res := string(ff)
    71  	assertInCode(t, "m.StringThing.Validate(formats)", res)
    72  	assertInCode(t, "var composedThingTypeNamePropEnum []interface{}", res)
    73  	assertInCode(t, "m.validateNameEnum(\"name\", \"body\", *m.Name)", res)
    74  	assertInCode(t, k+") validateNameEnum(path, location string, value string)", res)
    75  }
    76  
    77  func TestEnum_IntThing(t *testing.T) {
    78  	specDoc, err := loads.Spec("../fixtures/codegen/todolist.enums.yml")
    79  	require.NoError(t, err)
    80  
    81  	definitions := specDoc.Spec().Definitions
    82  	k := "IntThing"
    83  	schema := definitions[k]
    84  	opts := opts()
    85  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
    86  	require.NoError(t, err)
    87  
    88  	buf := bytes.NewBuffer(nil)
    89  	err = templates.MustGet("model").Execute(buf, genModel)
    90  	require.NoError(t, err)
    91  
    92  	ff, err := opts.LanguageOpts.FormatContent("int_thing.go", buf.Bytes())
    93  	require.NoErrorf(t, err, buf.String())
    94  
    95  	res := string(ff)
    96  	assertInCode(t, "var intThingEnum []interface{}", res)
    97  	assertInCode(t, k+") validateIntThingEnum(path, location string, value IntThing)", res)
    98  	assertInCode(t, "m.validateIntThingEnum(\"\", \"body\", m)", res)
    99  }
   100  
   101  func TestEnum_FloatThing(t *testing.T) {
   102  	specDoc, err := loads.Spec("../fixtures/codegen/todolist.enums.yml")
   103  	require.NoError(t, err)
   104  
   105  	definitions := specDoc.Spec().Definitions
   106  	k := "FloatThing"
   107  	schema := definitions[k]
   108  	opts := opts()
   109  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
   110  	require.NoError(t, err)
   111  
   112  	buf := bytes.NewBuffer(nil)
   113  	err = templates.MustGet("model").Execute(buf, genModel)
   114  	require.NoError(t, err)
   115  
   116  	ff, err := opts.LanguageOpts.FormatContent("float_thing.go", buf.Bytes())
   117  	require.NoErrorf(t, err, buf.String())
   118  
   119  	res := string(ff)
   120  	assertInCode(t, "var floatThingEnum []interface{}", res)
   121  	assertInCode(t, k+") validateFloatThingEnum(path, location string, value FloatThing)", res)
   122  	assertInCode(t, "m.validateFloatThingEnum(\"\", \"body\", m)", res)
   123  }
   124  
   125  func TestEnum_SliceThing(t *testing.T) {
   126  	specDoc, err := loads.Spec("../fixtures/codegen/todolist.enums.yml")
   127  	require.NoError(t, err)
   128  
   129  	definitions := specDoc.Spec().Definitions
   130  	k := "SliceThing"
   131  	schema := definitions[k]
   132  	opts := opts()
   133  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
   134  	require.NoError(t, err)
   135  
   136  	buf := bytes.NewBuffer(nil)
   137  	err = templates.MustGet("model").Execute(buf, genModel)
   138  	require.NoError(t, err)
   139  
   140  	ff, err := opts.LanguageOpts.FormatContent("slice_thing.go", buf.Bytes())
   141  	require.NoErrorf(t, err, buf.String())
   142  
   143  	res := string(ff)
   144  	assertInCode(t, "var sliceThingEnum []interface{}", res)
   145  	assertInCode(t, k+") validateSliceThingEnum(path, location string, value []string)", res)
   146  	assertInCode(t, "m.validateSliceThingEnum(\"\", \"body\", m)", res)
   147  }
   148  
   149  func TestEnum_SliceAndItemsThing(t *testing.T) {
   150  	specDoc, err := loads.Spec("../fixtures/codegen/todolist.enums.yml")
   151  	require.NoError(t, err)
   152  
   153  	definitions := specDoc.Spec().Definitions
   154  	k := "SliceAndItemsThing"
   155  	schema := definitions[k]
   156  	opts := opts()
   157  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
   158  	require.NoError(t, err)
   159  
   160  	buf := bytes.NewBuffer(nil)
   161  	err = templates.MustGet("model").Execute(buf, genModel)
   162  	require.NoError(t, err)
   163  
   164  	ff, err := opts.LanguageOpts.FormatContent("slice_and_items_thing.go", buf.Bytes())
   165  	require.NoErrorf(t, err, buf.String())
   166  
   167  	res := string(ff)
   168  	assertInCode(t, "var sliceAndItemsThingEnum []interface{}", res)
   169  	assertInCode(t, k+") validateSliceAndItemsThingEnum(path, location string, value []string)", res)
   170  	assertInCode(t, "m.validateSliceAndItemsThingEnum(\"\", \"body\", m)", res)
   171  	assertInCode(t, "var sliceAndItemsThingItemsEnum []interface{}", res)
   172  	assertInCode(t, k+") validateSliceAndItemsThingItemsEnum(path, location string, value string)", res)
   173  	assertInCode(t, "m.validateSliceAndItemsThingItemsEnum(strconv.Itoa(i), \"body\", m[i])", res)
   174  }
   175  
   176  func TestEnum_SliceAndAdditionalItemsThing(t *testing.T) {
   177  	specDoc, err := loads.Spec("../fixtures/codegen/todolist.enums.yml")
   178  	require.NoError(t, err)
   179  
   180  	definitions := specDoc.Spec().Definitions
   181  	k := "SliceAndAdditionalItemsThing"
   182  	schema := definitions[k]
   183  	opts := opts()
   184  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
   185  	require.NoError(t, err)
   186  
   187  	buf := bytes.NewBuffer(nil)
   188  	err = templates.MustGet("model").Execute(buf, genModel)
   189  	require.NoError(t, err)
   190  
   191  	ff, err := opts.LanguageOpts.FormatContent("slice_and_additional_items_thing.go", buf.Bytes())
   192  	require.NoErrorf(t, err, buf.String())
   193  
   194  	res := string(ff)
   195  	assertInCode(t, "var sliceAndAdditionalItemsThingEnum []interface{}", res)
   196  	assertInCode(t, k+") validateSliceAndAdditionalItemsThingEnum(path, location string, value *SliceAndAdditionalItemsThing)", res)
   197  	assertInCode(t, "var sliceAndAdditionalItemsThingTypeP0PropEnum []interface{}", res)
   198  	assertInCode(t, k+") validateP0Enum(path, location string, value string)", res)
   199  	assertInCode(t, "m.validateP0Enum(\"0\", \"body\", *m.P0)", res)
   200  	assertInCode(t, "var sliceAndAdditionalItemsThingItemsEnum []interface{}", res)
   201  	assertInCode(t, k+") validateSliceAndAdditionalItemsThingItemsEnum(path, location string, value float32)", res)
   202  	assertInCode(t, "m.validateSliceAndAdditionalItemsThingItemsEnum(strconv.Itoa(i+1), \"body\", m.SliceAndAdditionalItemsThingItems[i])", res)
   203  }
   204  
   205  func TestEnum_MapThing(t *testing.T) {
   206  	specDoc, err := loads.Spec("../fixtures/codegen/todolist.enums.yml")
   207  	require.NoError(t, err)
   208  
   209  	definitions := specDoc.Spec().Definitions
   210  	k := "MapThing"
   211  	schema := definitions[k]
   212  	opts := opts()
   213  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
   214  	require.NoError(t, err)
   215  
   216  	buf := bytes.NewBuffer(nil)
   217  	err = templates.MustGet("model").Execute(buf, genModel)
   218  	require.NoError(t, err)
   219  
   220  	ff, err := opts.LanguageOpts.FormatContent("map_thing.go", buf.Bytes())
   221  	require.NoErrorf(t, err, buf.String())
   222  
   223  	res := string(ff)
   224  	assertInCode(t, "var mapThingEnum []interface{}", res)
   225  	assertInCode(t, k+") validateMapThingEnum(path, location string, value MapThing)", res)
   226  	assertInCode(t, "m.validateMapThingEnum(\"\", \"body\", m)", res)
   227  	assertInCode(t, "var mapThingValueEnum []interface{}", res)
   228  	assertInCode(t, k+") validateMapThingValueEnum(path, location string, value string)", res)
   229  	assertInCode(t, "m.validateMapThingValueEnum(k, \"body\", m[k])", res)
   230  }
   231  
   232  func TestEnum_ObjectThing(t *testing.T) {
   233  	defer discardOutput()()
   234  
   235  	// verify that additionalItems render the same from an expanded and a flattened spec
   236  	// known issue: there are some slight differences in generated code and variables for enum,
   237  	// depending on how the spec has been preprocessed
   238  	specs := []string{
   239  		"../fixtures/codegen/todolist.enums.yml",
   240  		"../fixtures/codegen/todolist.enums.flattened.json", // this one is the first one, after "swagger flatten"
   241  	}
   242  	k := "ObjectThing"
   243  	for _, toPin := range specs {
   244  		fixture := toPin
   245  
   246  		t.Run(fmt.Sprintf("%s from spec %s", k, fixture), func(t *testing.T) {
   247  			specDoc, err := loads.Spec(fixture)
   248  			require.NoError(t, err)
   249  
   250  			definitions := specDoc.Spec().Definitions
   251  			schema := definitions[k]
   252  			opts := opts()
   253  			genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
   254  			require.NoError(t, err)
   255  
   256  			buf := bytes.NewBuffer(nil)
   257  			err = templates.MustGet("model").Execute(buf, genModel)
   258  			require.NoError(t, err)
   259  
   260  			ff, err := opts.LanguageOpts.FormatContent("object_thing.go", buf.Bytes())
   261  			require.NoErrorf(t, err, buf.String())
   262  
   263  			res := string(ff)
   264  			// all these remain unaffected
   265  			assertInCode(t, "var objectThingTypeNamePropEnum []interface{}", res)
   266  			assertInCode(t, "var objectThingTypeFlowerPropEnum []interface{}", res)
   267  			assertInCode(t, "var objectThingTypeFlourPropEnum []interface{}", res)
   268  			assertInCode(t, "var objectThingTypeWolvesPropEnum []interface{}", res)
   269  			assertInCode(t, "var objectThingWolvesValueEnum []interface{}", res)
   270  			assertInCode(t, "var objectThingCatsItemsEnum []interface{}", res)
   271  			assertInCode(t, k+") validateNameEnum(path, location string, value string)", res)
   272  			assertInCode(t, k+") validateFlowerEnum(path, location string, value int32)", res)
   273  			assertInCode(t, k+") validateFlourEnum(path, location string, value float32)", res)
   274  			assertInCode(t, k+") validateWolvesEnum(path, location string, value map[string]string)", res)
   275  			assertInCode(t, k+") validateWolvesValueEnum(path, location string, value string)", res)
   276  			assertInCode(t, k+") validateCatsItemsEnum(path, location string, value string)", res)
   277  			assertInCode(t, k+") validateCats(", res)
   278  			assertInCode(t, "m.validateNameEnum(\"name\", \"body\", *m.Name)", res)
   279  			assertInCode(t, "m.validateFlowerEnum(\"flower\", \"body\", m.Flower)", res)
   280  			assertInCode(t, "m.validateFlourEnum(\"flour\", \"body\", m.Flour)", res)
   281  			assertInCode(t, "m.validateWolvesEnum(\"wolves\", \"body\", m.Wolves)", res)
   282  			assertInCode(t, "m.validateWolvesValueEnum(\"wolves\"+\".\"+k, \"body\", m.Wolves[k])", res)
   283  			assertInCode(t, "m.validateCatsItemsEnum(\"cats\"+\".\"+strconv.Itoa(i), \"body\", m.Cats[i])", res)
   284  
   285  			// small naming differences may be found between the expand and the flatten version of spec
   286  			namingDifference := "Tuple0"
   287  			pathDifference := "P"
   288  			if strings.Contains(fixture, "flattened") {
   289  				// when expanded, all defs are in the same template for AdditionalItems
   290  				schema := definitions["objectThingLions"]
   291  				genModel, err = makeGenDefinition("ObjectThingLions", "models", schema, specDoc, opts)
   292  				require.NoError(t, err)
   293  
   294  				buf = bytes.NewBuffer(nil)
   295  				err := templates.MustGet("model").Execute(buf, genModel)
   296  				require.NoError(t, err)
   297  
   298  				ff, err := opts.LanguageOpts.FormatContent("object_thing_lions.go", buf.Bytes())
   299  				require.NoErrorf(t, err, buf.String())
   300  
   301  				res = string(ff)
   302  				namingDifference = ""
   303  				pathDifference = ""
   304  			}
   305  			// now common check resumes
   306  			assertInCode(t, "var objectThingLions"+namingDifference+"TypeP0PropEnum []interface{}", res)
   307  			assertInCode(t, "var objectThingLions"+namingDifference+"TypeP1PropEnum []interface{}", res)
   308  			assertInCode(t, "var objectThingLions"+namingDifference+"ItemsEnum []interface{}", res)
   309  			assertInCode(t, "m.validateP1Enum(\""+pathDifference+"1\", \"body\", *m.P1)", res)
   310  			assertInCode(t, "m.validateP0Enum(\""+pathDifference+"0\", \"body\", *m.P0)", res)
   311  			assertInCode(t, k+"Lions"+namingDifference+") validateObjectThingLions"+namingDifference+"ItemsEnum(path, location string, value float64)", res)
   312  
   313  			if namingDifference != "" {
   314  				assertInCode(t, "m.validateObjectThingLions"+namingDifference+"ItemsEnum(strconv.Itoa(i), \"body\", m.ObjectThingLions"+namingDifference+"Items[i])", res)
   315  				assertInCode(t, "var objectThingTypeLionsPropEnum []interface{}", res)
   316  				assertInCode(t, k+") validateLionsEnum(path, location string, value float64)", res)
   317  			} else {
   318  				assertInCode(t, "m.validateObjectThingLions"+namingDifference+"ItemsEnum(strconv.Itoa(i+2), \"body\", m.ObjectThingLions"+namingDifference+"Items[i])", res)
   319  				assertInCode(t, "var objectThingLionsItemsEnum []interface{}", res)
   320  				assertInCode(t, k+"Lions) validateObjectThingLionsItemsEnum(path, location string, value float64)", res)
   321  			}
   322  		})
   323  	}
   324  }
   325  
   326  func TestEnum_ComputeInstance(t *testing.T) {
   327  	// ensure that the enum validation for the anonymous object under the delegate property
   328  	// is rendered.
   329  
   330  	specDoc, err := loads.Spec("../fixtures/codegen/todolist.enums.yml")
   331  	require.NoError(t, err)
   332  
   333  	definitions := specDoc.Spec().Definitions
   334  	k := "ComputeInstance"
   335  	schema := definitions[k]
   336  	opts := opts()
   337  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
   338  	require.NoError(t, err)
   339  
   340  	buf := bytes.NewBuffer(nil)
   341  	err = templates.MustGet("model").Execute(buf, genModel)
   342  	require.NoError(t, err)
   343  
   344  	ff, err := opts.LanguageOpts.FormatContent("object_thing.go", buf.Bytes())
   345  	require.NoErrorf(t, err, buf.String())
   346  
   347  	res := string(ff)
   348  	assertInCode(t, "Region *string `json:\"region\"`", res)
   349  	assertInCode(t, "var computeInstanceTypeRegionPropEnum []interface{}", res)
   350  	assertInCode(t, "m.validateRegionEnum(\"region\", \"body\", *m.Region)", res)
   351  }
   352  
   353  func TestEnum_Cluster(t *testing.T) {
   354  	defer discardOutput()()
   355  
   356  	// ensure that the enum validation for the anonymous object under the delegate property
   357  	// is rendered.
   358  	specDoc, err := loads.Spec("../fixtures/codegen/todolist.enums.yml")
   359  	require.NoError(t, err)
   360  
   361  	definitions := specDoc.Spec().Definitions
   362  	k := "Cluster"
   363  	schema := definitions[k]
   364  	opts := opts()
   365  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
   366  	require.NoError(t, err)
   367  
   368  	buf := bytes.NewBuffer(nil)
   369  	err = templates.MustGet("model").Execute(buf, genModel)
   370  	require.NoError(t, err)
   371  
   372  	ff, err := opts.LanguageOpts.FormatContent("object_thing.go", buf.Bytes())
   373  	require.NoErrorf(t, err, buf.String())
   374  
   375  	res := string(ff)
   376  	assertInCode(t, "Data *ClusterData `json:\"data\"`", res)
   377  	assertInCode(t, `ClusterDataStatusScheduled string = "scheduled"`, res)
   378  	assertInCode(t, `ClusterDataStatusBuilding string = "building"`, res)
   379  	assertInCode(t, `ClusterDataStatusUp string = "up"`, res)
   380  	assertInCode(t, `ClusterDataStatusDeleting string = "deleting"`, res)
   381  	assertInCode(t, `ClusterDataStatusExited string = "exited"`, res)
   382  	assertInCode(t, `ClusterDataStatusError string = "error"`, res)
   383  }
   384  
   385  func TestEnum_NewPrototype(t *testing.T) {
   386  	// ensure that the enum validation for the anonymous object under the delegate property
   387  	// is rendered.
   388  	specDoc, err := loads.Spec("../fixtures/codegen/todolist.enums.yml")
   389  	require.NoError(t, err)
   390  
   391  	definitions := specDoc.Spec().Definitions
   392  	k := "NewPrototype"
   393  	schema := definitions[k]
   394  	opts := opts()
   395  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
   396  	require.NoError(t, err)
   397  
   398  	buf := bytes.NewBuffer(nil)
   399  	err = templates.MustGet("model").Execute(buf, genModel)
   400  	require.NoError(t, err)
   401  
   402  	ff, err := opts.LanguageOpts.FormatContent("object_thing.go", buf.Bytes())
   403  	require.NoErrorf(t, err, buf.String())
   404  
   405  	res := string(ff)
   406  	assertInCode(t, "ActivatingUser *NewPrototypeActivatingUser `json:\"activating_user,omitempty\"`", res)
   407  	assertInCode(t, "Delegate *NewPrototypeDelegate `json:\"delegate\"`", res)
   408  	assertInCode(t, "Role *string `json:\"role\"`", res)
   409  	assertInCode(t, "var newPrototypeTypeRolePropEnum []interface{}", res)
   410  	assertInCode(t, "var newPrototypeDelegateTypeKindPropEnum []interface{}", res)
   411  	assertInCode(t, "m.validateDelegate(formats)", res)
   412  	assertInCode(t, "m.validateRole(formats)", res)
   413  	assertInCode(t, "m.validateActivatingUser(formats)", res)
   414  	assertInCode(t, "m.Delegate.Validate(formats)", res)
   415  	assertInCode(t, "m.ActivatingUser.Validate(formats)", res)
   416  }
   417  
   418  func TestEnum_Issue265(t *testing.T) {
   419  	specDoc, err := loads.Spec("../fixtures/codegen/sodabooth.json")
   420  	require.NoError(t, err)
   421  
   422  	definitions := specDoc.Spec().Definitions
   423  	k := "SodaBrand"
   424  	schema := definitions[k]
   425  	opts := opts()
   426  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
   427  	require.NoError(t, err)
   428  
   429  	buf := bytes.NewBuffer(nil)
   430  	err = templates.MustGet("model").Execute(buf, genModel)
   431  	require.NoError(t, err)
   432  
   433  	ff, err := opts.LanguageOpts.FormatContent("soda_brand.go", buf.Bytes())
   434  	require.NoErrorf(t, err, buf.String())
   435  
   436  	res := string(ff)
   437  	assert.Equal(t, 1, strings.Count(res, "m.validateSodaBrandEnum"))
   438  }
   439  
   440  func TestGenerateModel_Issue303(t *testing.T) {
   441  	specDoc, e := loads.Spec("../fixtures/enhancements/303/swagger.yml")
   442  	require.NoError(t, e)
   443  
   444  	opts := opts()
   445  	tt := templateTest{t, templates.MustGet("model").Lookup("schema")}
   446  	definitions := specDoc.Spec().Definitions
   447  	for name, schema := range definitions {
   448  		genModel, err := makeGenDefinition(name, "models", schema, specDoc, opts)
   449  		require.NoError(t, err)
   450  
   451  		assert.Equal(t, name, genModel.Name)
   452  		assert.Equal(t, name, genModel.GoType)
   453  		assert.True(t, genModel.IsEnumCI)
   454  
   455  		extension := genModel.Extensions["x-go-enum-ci"]
   456  		require.NotNil(t, extension)
   457  
   458  		xGoEnumCI, ok := extension.(bool)
   459  		assert.True(t, ok)
   460  		assert.True(t, xGoEnumCI)
   461  
   462  		buf := bytes.NewBuffer(nil)
   463  		require.NoError(t, tt.template.Execute(buf, genModel))
   464  
   465  		ff, err := opts.LanguageOpts.FormatContent("case_insensitive_enum_definition.go", buf.Bytes())
   466  		require.NoErrorf(t, err, buf.String())
   467  
   468  		res := string(ff)
   469  		assertInCode(t, `if err := validate.EnumCase(path, location, value, vegetableEnum, false); err != nil {`, res)
   470  	}
   471  }
   472  
   473  func TestEnum_Issue325(t *testing.T) {
   474  	specDoc, err := loads.Spec("../fixtures/codegen/sodabooths.json")
   475  	require.NoError(t, err)
   476  
   477  	definitions := specDoc.Spec().Definitions
   478  	k := "SodaBrand"
   479  	schema := definitions[k]
   480  	opts := opts()
   481  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
   482  	require.NoError(t, err)
   483  
   484  	buf := bytes.NewBuffer(nil)
   485  	err = templates.MustGet("model").Execute(buf, genModel)
   486  	require.NoError(t, err)
   487  
   488  	ff, err := opts.LanguageOpts.FormatContent("soda_brand.go", buf.Bytes())
   489  	require.NoErrorf(t, err, buf.String())
   490  
   491  	res := string(ff)
   492  	assertInCode(t, "var sodaBrandEnum []interface{}", res)
   493  	assertInCode(t, "err := validate.EnumCase(path, location, value, sodaBrandEnum, true)", res)
   494  	assert.Equal(t, 1, strings.Count(res, "m.validateSodaBrandEnum"))
   495  
   496  	k = "Soda"
   497  	schema = definitions[k]
   498  	genModel, err = makeGenDefinition(k, "models", schema, specDoc, opts)
   499  	require.NoError(t, err)
   500  
   501  	buf = bytes.NewBuffer(nil)
   502  	err = templates.MustGet("model").Execute(buf, genModel)
   503  	require.NoError(t, err)
   504  
   505  	ff, err = opts.LanguageOpts.FormatContent("soda.go", buf.Bytes())
   506  	require.NoErrorf(t, err, buf.String())
   507  
   508  	res = string(ff)
   509  	assertInCode(t, "var sodaTypeBrandPropEnum []interface{}", res)
   510  	assertInCode(t, "err := validate.EnumCase(path, location, value, sodaTypeBrandPropEnum, true)", res)
   511  	assert.Equal(t, 1, strings.Count(res, "m.validateBrandEnum"))
   512  }
   513  
   514  func TestEnum_Issue352(t *testing.T) {
   515  	specDoc, err := loads.Spec("../fixtures/codegen/todolist.enums.yml")
   516  	require.NoError(t, err)
   517  
   518  	definitions := specDoc.Spec().Definitions
   519  	k := "slp_action_enum"
   520  	schema := definitions[k]
   521  	opts := opts()
   522  	genModel, err := makeGenDefinition(k, "models", schema, specDoc, opts)
   523  	require.NoError(t, err)
   524  
   525  	buf := bytes.NewBuffer(nil)
   526  	err = templates.MustGet("model").Execute(buf, genModel)
   527  	require.NoError(t, err)
   528  
   529  	ff, err := opts.LanguageOpts.FormatContent("slp_action_enum.go", buf.Bytes())
   530  	require.NoErrorf(t, err, buf.String())
   531  
   532  	res := string(ff)
   533  	assertInCode(t, ", value SlpActionEnum", res)
   534  }