github.com/6543-forks/go-swagger@v0.26.0/generator/response_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  	"io/ioutil"
    21  	"log"
    22  	"os"
    23  	"path/filepath"
    24  	"testing"
    25  
    26  	"github.com/go-openapi/spec"
    27  	"github.com/stretchr/testify/assert"
    28  	"github.com/stretchr/testify/require"
    29  )
    30  
    31  func TestSimpleResponseRender(t *testing.T) {
    32  	b, err := opBuilder("updateTask", "../fixtures/codegen/todolist.responses.yml")
    33  	require.NoError(t, err)
    34  
    35  	op, err := b.MakeOperation()
    36  	require.NoError(t, err)
    37  
    38  	var buf bytes.Buffer
    39  	opts := opts()
    40  	require.NoError(t, templates.MustGet("serverResponses").Execute(&buf, op))
    41  
    42  	ff, err := opts.LanguageOpts.FormatContent("update_task_responses.go", buf.Bytes())
    43  	require.NoErrorf(t, err, buf.String())
    44  
    45  	assertInCode(t, "o.XErrorCode", string(ff))
    46  	assertInCode(t, "o.Payload", string(ff))
    47  }
    48  
    49  func TestDefaultResponseRender(t *testing.T) {
    50  	b, err := opBuilder("getAllParameters", "../fixtures/codegen/todolist.responses.yml")
    51  	require.NoError(t, err)
    52  
    53  	op, err := b.MakeOperation()
    54  	require.NoError(t, err)
    55  
    56  	var buf bytes.Buffer
    57  	opts := opts()
    58  	require.NoError(t, templates.MustGet("clientResponse").Execute(&buf, op))
    59  
    60  	ff, err := opts.LanguageOpts.FormatContent("get_all_parameters_responses.go", buf.Bytes())
    61  	require.NoErrorf(t, err, buf.String())
    62  
    63  	res := string(ff)
    64  	assertInCode(t, "type GetAllParametersDefault struct", res)
    65  	assertInCode(t, `if response.Code()/100 == 2`, res)
    66  	assertNotInCode(t, `switch response.Code()`, res)
    67  	assertNotInCode(t, "o.Payload", res)
    68  }
    69  
    70  func TestSimpleResponses(t *testing.T) {
    71  	b, err := opBuilder("updateTask", "../fixtures/codegen/todolist.responses.yml")
    72  	require.NoError(t, err)
    73  
    74  	_, _, op, ok := b.Analyzed.OperationForName("updateTask")
    75  	require.True(t, ok)
    76  	require.NotNil(t, op)
    77  	require.NotNil(t, op.Responses)
    78  
    79  	resolver := &typeResolver{ModelsPackage: b.ModelsPackage, Doc: b.Doc}
    80  	require.NotNil(t, op.Responses.Default)
    81  
    82  	resp, err := spec.ResolveResponse(b.Doc.Spec(), op.Responses.Default.Ref)
    83  	require.NoError(t, err)
    84  
    85  	defCtx := responseTestContext{
    86  		OpID: "updateTask",
    87  		Name: "default",
    88  	}
    89  	res, err := b.MakeResponse("a", defCtx.Name, false, resolver, -1, *resp)
    90  	require.NoError(t, err)
    91  
    92  	defCtx.Require(t, *resp, res)
    93  
    94  	for code, response := range op.Responses.StatusCodeResponses {
    95  		sucCtx := responseTestContext{
    96  			OpID:      "updateTask",
    97  			Name:      "success",
    98  			IsSuccess: code/100 == 2,
    99  		}
   100  		res, err := b.MakeResponse("a", sucCtx.Name, sucCtx.IsSuccess, resolver, code, response)
   101  		require.NoError(t, err)
   102  		sucCtx.Require(t, response, res)
   103  	}
   104  }
   105  
   106  func TestInlinedSchemaResponses(t *testing.T) {
   107  	b, err := opBuilder("getTasks", "../fixtures/codegen/todolist.responses.yml")
   108  	require.NoError(t, err)
   109  
   110  	_, _, op, ok := b.Analyzed.OperationForName("getTasks")
   111  	require.True(t, ok)
   112  	require.NotNil(t, op)
   113  	require.NotNil(t, op.Responses)
   114  
   115  	resolver := &typeResolver{ModelsPackage: b.ModelsPackage, Doc: b.Doc}
   116  	require.NotNil(t, op.Responses.Default)
   117  
   118  	resp := *op.Responses.Default
   119  	defCtx := responseTestContext{
   120  		OpID: "getTasks",
   121  		Name: "default",
   122  	}
   123  	res, err := b.MakeResponse("a", defCtx.Name, false, resolver, -1, resp)
   124  	require.NoError(t, err)
   125  
   126  	defCtx.Require(t, resp, res)
   127  
   128  	for code, response := range op.Responses.StatusCodeResponses {
   129  		sucCtx := responseTestContext{
   130  			OpID:      "getTasks",
   131  			Name:      "success",
   132  			IsSuccess: code/100 == 2,
   133  		}
   134  		res, err := b.MakeResponse("a", sucCtx.Name, sucCtx.IsSuccess, resolver, code, response)
   135  		require.NoError(t, err)
   136  		sucCtx.Require(t, response, res)
   137  		assert.Len(t, b.ExtraSchemas, 1)
   138  		// ExtraSchema is not a definition: it is rendered in current operations package
   139  		assert.Equal(t, "[]*SuccessBodyItems0", res.Schema.GoType)
   140  	}
   141  }
   142  
   143  type responseTestContext struct {
   144  	OpID      string
   145  	Name      string
   146  	IsSuccess bool
   147  }
   148  
   149  func (ctx *responseTestContext) Assert(t testing.TB, response spec.Response, res GenResponse) bool {
   150  	if !assert.Equal(t, ctx.IsSuccess, res.IsSuccess) {
   151  		return false
   152  	}
   153  
   154  	if !assert.Equal(t, ctx.Name, res.Name) {
   155  		return false
   156  	}
   157  
   158  	if !assert.Equal(t, response.Description, res.Description) {
   159  		return false
   160  	}
   161  
   162  	if len(response.Headers) > 0 {
   163  		for k, v := range response.Headers {
   164  			found := false
   165  			for _, h := range res.Headers {
   166  				if h.Name == k {
   167  					found = true
   168  					if k == "X-Last-Task-Id" {
   169  						hctx := &respHeaderTestContext{k, "swag.FormatInt64", "swag.ConvertInt64"}
   170  						if !hctx.Assert(t, v, h) {
   171  							return false
   172  						}
   173  						break
   174  					}
   175  					if k == "X-Error-Code" {
   176  						hctx := &respHeaderTestContext{k, "", ""}
   177  						if !hctx.Assert(t, v, h) {
   178  							return false
   179  						}
   180  					}
   181  
   182  					break
   183  				}
   184  			}
   185  			if !assert.True(t, found) {
   186  				return false
   187  			}
   188  		}
   189  	}
   190  
   191  	if response.Schema != nil {
   192  		if !assert.NotNil(t, res.Schema) {
   193  			return false
   194  		}
   195  	} else {
   196  		if !assert.Nil(t, res.Schema) {
   197  			return false
   198  		}
   199  	}
   200  
   201  	return true
   202  }
   203  
   204  func (ctx *responseTestContext) Require(t testing.TB, response spec.Response, res GenResponse) {
   205  	if !ctx.Assert(t, response, res) {
   206  		t.FailNow()
   207  	}
   208  }
   209  
   210  type respHeaderTestContext struct {
   211  	Name      string
   212  	Formatter string
   213  	Converter string
   214  }
   215  
   216  func (ctx *respHeaderTestContext) Assert(t testing.TB, header spec.Header, hdr GenHeader) bool {
   217  	if !assert.Equal(t, ctx.Name, hdr.Name) {
   218  		return false
   219  	}
   220  	if !assert.Equal(t, "a", hdr.ReceiverName) {
   221  		return false
   222  	}
   223  	if !assert.Equal(t, ctx.Formatter, hdr.Formatter) {
   224  		return false
   225  	}
   226  	if !assert.Equal(t, ctx.Converter, hdr.Converter) {
   227  		return false
   228  	}
   229  	if !assert.Equal(t, header.Description, hdr.Description) {
   230  		return false
   231  	}
   232  	if !assert.Equal(t, header.Minimum, hdr.Minimum) || !assert.Equal(t, header.ExclusiveMinimum, hdr.ExclusiveMinimum) {
   233  		return false
   234  	}
   235  	if !assert.Equal(t, header.Maximum, hdr.Maximum) || !assert.Equal(t, header.ExclusiveMaximum, hdr.ExclusiveMaximum) {
   236  		return false
   237  	}
   238  	if !assert.Equal(t, header.MinLength, hdr.MinLength) {
   239  		return false
   240  	}
   241  	if !assert.Equal(t, header.MaxLength, hdr.MaxLength) {
   242  		return false
   243  	}
   244  	if !assert.Equal(t, header.Pattern, hdr.Pattern) {
   245  		return false
   246  	}
   247  	if !assert.Equal(t, header.MaxItems, hdr.MaxItems) {
   248  		return false
   249  	}
   250  	if !assert.Equal(t, header.MinItems, hdr.MinItems) {
   251  		return false
   252  	}
   253  	if !assert.Equal(t, header.UniqueItems, hdr.UniqueItems) {
   254  		return false
   255  	}
   256  	if !assert.Equal(t, header.MultipleOf, hdr.MultipleOf) {
   257  		return false
   258  	}
   259  	if !assert.EqualValues(t, header.Enum, hdr.Enum) {
   260  		return false
   261  	}
   262  	if !assert.Equal(t, header.Type, hdr.SwaggerType) {
   263  		return false
   264  	}
   265  	if !assert.Equal(t, header.Format, hdr.SwaggerFormat) {
   266  		return false
   267  	}
   268  	return true
   269  }
   270  
   271  func TestGenResponses_Issue540(t *testing.T) {
   272  	b, err := opBuilder("postPet", "../fixtures/bugs/540/swagger.yml")
   273  	require.NoError(t, err)
   274  
   275  	op, err := b.MakeOperation()
   276  	require.NoError(t, err)
   277  
   278  	var buf bytes.Buffer
   279  	opts := opts()
   280  	require.NoError(t, templates.MustGet("serverResponses").Execute(&buf, op))
   281  
   282  	ff, err := opts.LanguageOpts.FormatContent("post_pet_responses.go", buf.Bytes())
   283  	require.NoErrorf(t, err, buf.String())
   284  
   285  	assertInCode(t, "func (o *PostPetOK) WithPayload(payload models.Pet) *PostPetOK {", string(ff))
   286  	assertInCode(t, "func (o *PostPetOK) SetPayload(payload models.Pet) {", string(ff))
   287  }
   288  
   289  func TestGenResponses_Issue718_NotRequired(t *testing.T) {
   290  	b, err := opBuilder("doEmpty", "../fixtures/codegen/todolist.simple.yml")
   291  	require.NoError(t, err)
   292  
   293  	op, err := b.MakeOperation()
   294  	require.NoError(t, err)
   295  
   296  	var buf bytes.Buffer
   297  	opts := opts()
   298  	require.NoError(t, templates.MustGet("serverResponses").Execute(&buf, op))
   299  
   300  	ff, err := opts.LanguageOpts.FormatContent("do_empty_responses.go", buf.Bytes())
   301  	require.NoErrorf(t, err, buf.String())
   302  
   303  	assertInCode(t, "if payload == nil", string(ff))
   304  	assertInCode(t, "payload = make([]models.Foo, 0, 50)", string(ff))
   305  }
   306  
   307  func TestGenResponses_Issue718_Required(t *testing.T) {
   308  	b, err := opBuilder("doEmpty", "../fixtures/codegen/todolist.simple.yml")
   309  	require.NoError(t, err)
   310  	op, err := b.MakeOperation()
   311  	require.NoError(t, err)
   312  	var buf bytes.Buffer
   313  	opts := opts()
   314  	require.NoError(t, templates.MustGet("serverResponses").Execute(&buf, op))
   315  	ff, err := opts.LanguageOpts.FormatContent("do_empty_responses.go", buf.Bytes())
   316  	if err != nil {
   317  		fmt.Println(buf.String())
   318  	}
   319  	require.NoError(t, err)
   320  	assertInCode(t, "if payload == nil", string(ff))
   321  	assertInCode(t, "payload = make([]models.Foo, 0, 50)", string(ff))
   322  }
   323  
   324  // Issue776 includes references that span multiple files. Flattening or Expanding is required
   325  func TestGenResponses_Issue776_Spec(t *testing.T) {
   326  	log.SetOutput(ioutil.Discard)
   327  	defer func() {
   328  		log.SetOutput(os.Stdout)
   329  	}()
   330  
   331  	b, err := opBuilderWithFlatten("GetItem", "../fixtures/bugs/776/spec.yaml")
   332  	require.NoError(t, err)
   333  	op, err := b.MakeOperation()
   334  	require.NoError(t, err)
   335  	var buf bytes.Buffer
   336  	opts := opts()
   337  	require.NoError(t, templates.MustGet("serverResponses").Execute(&buf, op))
   338  	ff, err := opts.LanguageOpts.FormatContent("do_empty_responses.go", buf.Bytes())
   339  	if err != nil {
   340  		fmt.Println(buf.String())
   341  	}
   342  	require.NoError(t, err)
   343  	// This should be models.Item if flat works correctly
   344  	assertInCode(t, "Payload *models.Item", string(ff))
   345  	assertNotInCode(t, "type GetItemOKBody struct", string(ff))
   346  }
   347  
   348  func TestGenResponses_Issue776_SwaggerTemplate(t *testing.T) {
   349  	//spec.Debug = true
   350  	log.SetOutput(ioutil.Discard)
   351  	defer func() {
   352  		log.SetOutput(os.Stdout)
   353  		//spec.Debug = false
   354  	}()
   355  
   356  	b, err := opBuilderWithFlatten("getHealthy", "../fixtures/bugs/776/swagger-template.yml")
   357  	require.NoError(t, err)
   358  	op, err := b.MakeOperation()
   359  	require.NoError(t, err)
   360  	var buf bytes.Buffer
   361  	opts := opts()
   362  	require.NoError(t, templates.MustGet("serverResponses").Execute(&buf, op))
   363  	ff, err := opts.LanguageOpts.FormatContent("do_empty_responses.go", buf.Bytes())
   364  	if err != nil {
   365  		fmt.Println(buf.String())
   366  	}
   367  	require.NoError(t, err)
   368  	assertInCode(t, "Payload *models.Error", string(ff))
   369  }
   370  
   371  func TestIssue846(t *testing.T) {
   372  	// do it 8 times, to ensure it's always in the same order
   373  	for i := 0; i < 8; i++ {
   374  		b, err := opBuilder("getFoo", "../fixtures/bugs/846/swagger.yml")
   375  		require.NoError(t, err)
   376  		op, err := b.MakeOperation()
   377  		require.NoError(t, err)
   378  		var buf bytes.Buffer
   379  		opts := opts()
   380  		require.NoError(t, templates.MustGet("clientResponse").Execute(&buf, op))
   381  		ff, err := opts.LanguageOpts.FormatContent("do_empty_responses.go", buf.Bytes())
   382  		if err != nil {
   383  			fmt.Println(buf.String())
   384  		}
   385  		require.NoError(t, err)
   386  		// sorted by code
   387  		assert.Regexp(t, "(?s)"+
   388  			"GetFooOK struct.+"+
   389  			"GetFooNotFound struct.+"+
   390  			"GetFooInternalServerError struct", string(ff))
   391  		// sorted by name
   392  		assert.Regexp(t, "(?s)"+
   393  			"GetFooInternalServerErrorBody struct.+"+
   394  			"GetFooNotFoundBody struct.+"+
   395  			"GetFooOKBody struct", string(ff))
   396  	}
   397  }
   398  
   399  func TestIssue881(t *testing.T) {
   400  	b, err := opBuilder("getFoo", "../fixtures/bugs/881/swagger.yml")
   401  	require.NoError(t, err)
   402  	op, err := b.MakeOperation()
   403  	require.NoError(t, err)
   404  	var buf bytes.Buffer
   405  	require.NoError(t, templates.MustGet("serverResponses").Execute(&buf, op))
   406  }
   407  
   408  func TestIssue881Deep(t *testing.T) {
   409  	b, err := opBuilder("getFoo", "../fixtures/bugs/881/deep.yml")
   410  	require.NoError(t, err)
   411  	op, err := b.MakeOperation()
   412  	require.NoError(t, err)
   413  	var buf bytes.Buffer
   414  	require.NoError(t, templates.MustGet("serverResponses").Execute(&buf, op))
   415  }
   416  
   417  func TestGenResponses_XGoName(t *testing.T) {
   418  	b, err := opBuilder("putTesting", "../fixtures/specs/response_name.json")
   419  	require.NoError(t, err)
   420  	op, err := b.MakeOperation()
   421  	require.NoError(t, err)
   422  	var buf bytes.Buffer
   423  	opts := opts()
   424  	require.NoError(t, templates.MustGet("serverResponses").Execute(&buf, op))
   425  	ff, err := opts.LanguageOpts.FormatContent("put_testing_responses.go", buf.Bytes())
   426  	if err != nil {
   427  		fmt.Println(buf.String())
   428  	}
   429  	require.NoError(t, err)
   430  	assertInCode(t, "const PutTestingAlternateNameCode int =", string(ff))
   431  	assertInCode(t, "type PutTestingAlternateName struct {", string(ff))
   432  	assertInCode(t, "func NewPutTestingAlternateName() *PutTestingAlternateName {", string(ff))
   433  	assertInCode(t, "func (o *PutTestingAlternateName) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) {", string(ff))
   434  }
   435  
   436  func TestGenResponses_Issue892(t *testing.T) {
   437  	b, err := methodPathOpBuilder("get", "/media/search", "../fixtures/bugs/982/swagger.yaml")
   438  	require.NoError(t, err)
   439  
   440  	op, err := b.MakeOperation()
   441  	require.NoError(t, err)
   442  
   443  	var buf bytes.Buffer
   444  	opts := opts()
   445  	require.NoError(t, templates.MustGet("clientResponse").Execute(&buf, op))
   446  
   447  	ff, err := opts.LanguageOpts.FormatContent("get_media_search_responses.go", buf.Bytes())
   448  	require.NoErrorf(t, err, buf.String())
   449  
   450  	assertInCode(t, "o.Media = aO0", string(ff))
   451  }
   452  
   453  func TestGenResponses_Issue1013(t *testing.T) {
   454  	b, err := methodPathOpBuilder("get", "/test", "../fixtures/bugs/1013/fixture-1013.yaml")
   455  	require.NoError(t, err)
   456  
   457  	op, err := b.MakeOperation()
   458  	require.NoError(t, err)
   459  
   460  	var buf bytes.Buffer
   461  	opt := opts()
   462  	require.NoError(t, templates.MustGet("serverResponses").Execute(&buf, op))
   463  
   464  	ff, err := opt.LanguageOpts.FormatContent("foo.go", buf.Bytes())
   465  	require.NoErrorf(t, err, buf.String())
   466  	assertInCode(t, "Payload *models.Response `json:\"body,omitempty\"`", string(ff))
   467  
   468  	buf.Reset()
   469  	b, err = methodPathOpBuilder("get", "/test2", "../fixtures/bugs/1013/fixture-1013.yaml")
   470  	require.NoError(t, err)
   471  
   472  	op, err = b.MakeOperation()
   473  	require.NoError(t, err)
   474  
   475  	opt = opts()
   476  	require.NoError(t, templates.MustGet("serverResponses").Execute(&buf, op))
   477  	ff, err = opt.LanguageOpts.FormatContent("foo.go", buf.Bytes())
   478  	require.NoErrorf(t, err, buf.String())
   479  	assertInCode(t, "Payload *models.Response `json:\"body,omitempty\"`", string(ff))
   480  }
   481  
   482  func TestGenResponse_15362_WithExpand(t *testing.T) {
   483  	log.SetOutput(ioutil.Discard)
   484  	defer func() {
   485  		log.SetOutput(os.Stdout)
   486  	}()
   487  
   488  	fixtureConfig := map[string]map[string][]string{
   489  		// load expectations for parameters in operation get_nested_required_responses.go
   490  		"getNestedRequired": { // fixture index
   491  			"serverResponses": { // executed template
   492  				// expected code lines
   493  				`const GetNestedRequiredOKCode int = 200`,
   494  				`type GetNestedRequiredOK struct {`,
   495  				"	Payload [][][][]*GetNestedRequiredOKBodyItems0 `json:\"body,omitempty\"`",
   496  				`func NewGetNestedRequiredOK() *GetNestedRequiredOK {`,
   497  				`	return &GetNestedRequiredOK{`,
   498  				`func (o *GetNestedRequiredOK) WithPayload(payload [][][][]*GetNestedRequiredOKBodyItems0) *GetNestedRequiredOK {`,
   499  				`func (o *GetNestedRequiredOK) SetPayload(payload [][][][]*GetNestedRequiredOKBodyItems0) {`,
   500  				`func (o *GetNestedRequiredOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) {`,
   501  			},
   502  			"serverOperation": { // executed template
   503  				// expected code lines
   504  				`type GetNestedRequiredOKBodyItems0 struct {`,
   505  				"	Pkcs *string `json:\"pkcs\"`",
   506  				`func (o *GetNestedRequiredOKBodyItems0) Validate(formats strfmt.Registry) error {`,
   507  				`	if err := o.validatePkcs(formats); err != nil {`,
   508  				`		return errors.CompositeValidationError(res...`,
   509  				`func (o *GetNestedRequiredOKBodyItems0) validatePkcs(formats strfmt.Registry) error {`,
   510  				`	if err := validate.Required("pkcs", "body", o.Pkcs); err != nil {`,
   511  			},
   512  		},
   513  	}
   514  
   515  	// assertParams also works for responses
   516  	assertParams(t, fixtureConfig, filepath.Join("..", "fixtures", "bugs", "1536", "fixture-1536-2-responses.yaml"), true, false)
   517  }
   518  
   519  func TestGenResponse_1572(t *testing.T) {
   520  	log.SetOutput(ioutil.Discard)
   521  	defer func() {
   522  		log.SetOutput(os.Stdout)
   523  	}()
   524  
   525  	// testing fixture-1572.yaml with minimal flatten
   526  	// edge cases for operations schemas
   527  
   528  	/*
   529  	        Run the following test caes and exercise the minimal flatten mode:
   530  	   - [x] nil schema in body param / response
   531  	   - [x] interface{} in body param /response
   532  	   - [x] additional schema reused from model (body param and response) (with maps or arrays)
   533  	   - [x] primitive body / response
   534  	   - [x] $ref'ed response and param (check that minimal flatten expands it)
   535  
   536  	*/
   537  
   538  	fixtureConfig := map[string]map[string][]string{
   539  
   540  		// load expectations for responses in operation get_interface_responses.go
   541  		"getInterface": { // fixture index
   542  			"serverResponses": { // executed template
   543  				// expected code lines
   544  				`const GetInterfaceOKCode int = 200`,
   545  				`type GetInterfaceOK struct {`,
   546  				"	Payload interface{} `json:\"body,omitempty\"`",
   547  				`func NewGetInterfaceOK() *GetInterfaceOK {`,
   548  				`	return &GetInterfaceOK{`,
   549  				`func (o *GetInterfaceOK) WithPayload(payload interface{}) *GetInterfaceOK {`,
   550  				`	o.Payload = payload`,
   551  				`	return o`,
   552  				`func (o *GetInterfaceOK) SetPayload(payload interface{}) {`,
   553  				`	o.Payload = payload`,
   554  				`func (o *GetInterfaceOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) {`,
   555  				`	rw.WriteHeader(200`,
   556  				`	payload := o.Payload`,
   557  				`	if err := producer.Produce(rw, payload); err != nil {`,
   558  			},
   559  		},
   560  
   561  		// load expectations for responses in operation get_primitive_responses.go
   562  		"getPrimitive": { // fixture index
   563  			"serverResponses": { // executed template
   564  				// expected code lines
   565  				`const GetPrimitiveOKCode int = 200`,
   566  				`type GetPrimitiveOK struct {`,
   567  				"	Payload float32 `json:\"body,omitempty\"`",
   568  				`func NewGetPrimitiveOK() *GetPrimitiveOK {`,
   569  				`	return &GetPrimitiveOK{`,
   570  				`func (o *GetPrimitiveOK) WithPayload(payload float32) *GetPrimitiveOK {`,
   571  				`	o.Payload = payload`,
   572  				`	return o`,
   573  				`func (o *GetPrimitiveOK) SetPayload(payload float32) {`,
   574  				`	o.Payload = payload`,
   575  				`func (o *GetPrimitiveOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) {`,
   576  				`	rw.WriteHeader(200`,
   577  				`	payload := o.Payload`,
   578  				`	if err := producer.Produce(rw, payload); err != nil {`,
   579  			},
   580  		},
   581  
   582  		// load expectations for responses in operation get_null_responses.go
   583  		"getNull": { // fixture index
   584  			"serverResponses": { // executed template
   585  				// expected code lines
   586  				`const GetNullOKCode int = 200`,
   587  				`type GetNullOK struct {`,
   588  				"	Payload interface{} `json:\"body,omitempty\"`",
   589  				`func NewGetNullOK() *GetNullOK {`,
   590  				`	return &GetNullOK{`,
   591  				`func (o *GetNullOK) WithPayload(payload interface{}) *GetNullOK {`,
   592  				`	o.Payload = payload`,
   593  				`	return o`,
   594  				`func (o *GetNullOK) SetPayload(payload interface{}) {`,
   595  				`	o.Payload = payload`,
   596  				`func (o *GetNullOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) {`,
   597  				`	rw.WriteHeader(200`,
   598  				`	payload := o.Payload`,
   599  				`	if err := producer.Produce(rw, payload); err != nil {`,
   600  				`const GetNullRequestProcessedCode int = 203`,
   601  				`/*GetNullRequestProcessed OK`,
   602  				`swagger:response getNullRequestProcessed`,
   603  				`*/`,
   604  				`type GetNullRequestProcessed struct {`,
   605  				`func NewGetNullRequestProcessed() *GetNullRequestProcessed {`,
   606  				`	return &GetNullRequestProcessed{`,
   607  				`func (o *GetNullRequestProcessed) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) {`,
   608  				`	rw.Header().Del(runtime.HeaderContentType`,
   609  				`	rw.WriteHeader(203`,
   610  			},
   611  		},
   612  
   613  		// load expectations for responses in operation get_model_interface_responses.go
   614  		"getModelInterface": { // fixture index
   615  			"serverResponses": { // executed template
   616  				// expected code lines
   617  				`const GetModelInterfaceOKCode int = 200`,
   618  				`type GetModelInterfaceOK struct {`,
   619  				"	Payload []models.ModelInterface `json:\"body,omitempty\"`",
   620  				`func NewGetModelInterfaceOK() *GetModelInterfaceOK {`,
   621  				`	return &GetModelInterfaceOK{`,
   622  				`func (o *GetModelInterfaceOK) WithPayload(payload []models.ModelInterface) *GetModelInterfaceOK {`,
   623  				`	o.Payload = payload`,
   624  				`	return o`,
   625  				`func (o *GetModelInterfaceOK) SetPayload(payload []models.ModelInterface) {`,
   626  				`	o.Payload = payload`,
   627  				`func (o *GetModelInterfaceOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) {`,
   628  				`	rw.WriteHeader(200`,
   629  				`	payload := o.Payload`,
   630  				`	if payload == nil {`,
   631  				`		payload = make([]models.ModelInterface, 0, 50`,
   632  				`	if err := producer.Produce(rw, payload); err != nil {`,
   633  			},
   634  		},
   635  	}
   636  
   637  	// assertParams also works for responses
   638  	assertParams(t, fixtureConfig, filepath.Join("..", "fixtures", "enhancements", "1572", "fixture-1572.yaml"), true, false)
   639  }
   640  
   641  func TestGenResponse_1893(t *testing.T) {
   642  	log.SetOutput(ioutil.Discard)
   643  	defer func() {
   644  		log.SetOutput(os.Stdout)
   645  	}()
   646  
   647  	fixtureConfig := map[string]map[string][]string{
   648  		// load expectations for parameters in operation get_nested_required_responses.go
   649  		"getRecords": { // fixture index
   650  			"clientResponse": { // executed template
   651  				// expected code lines
   652  				`type GetRecordsStatus512 struct {`,
   653  				`type GetRecordsStatus515 struct {`,
   654  			},
   655  			"serverResponses": { // executed template
   656  				// expected code lines
   657  				`type GetRecordsStatus512 struct {`,
   658  				`type GetRecordsStatus515 struct {`,
   659  			},
   660  		},
   661  	}
   662  	// assertParams also works for responses
   663  	assertParams(t, fixtureConfig, filepath.Join("..", "fixtures", "bugs", "1893", "fixture-1893.yaml"), true, false)
   664  }