github.com/ffalor/go-swagger@v0.0.0-20231011000038-9f25265ac351/generator/client_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  	"log"
    19  	"os"
    20  	"path/filepath"
    21  	"strconv"
    22  	"strings"
    23  	"testing"
    24  
    25  	"github.com/stretchr/testify/assert"
    26  	"github.com/stretchr/testify/require"
    27  )
    28  
    29  const (
    30  	basicFixture = "../fixtures/petstores/petstore.json"
    31  )
    32  
    33  func testClientGenOpts() *GenOpts {
    34  	g := &GenOpts{}
    35  	g.Target = "."
    36  	g.APIPackage = defaultAPIPackage
    37  	g.ModelPackage = defaultModelPackage
    38  	g.ServerPackage = defaultServerPackage
    39  	g.ClientPackage = defaultClientPackage
    40  	g.Principal = ""
    41  	g.IncludeModel = true
    42  	g.IncludeHandler = true
    43  	g.IncludeParameters = true
    44  	g.IncludeResponses = true
    45  	g.IncludeSupport = true
    46  	g.TemplateDir = ""
    47  	g.DumpData = false
    48  	g.IsClient = true
    49  	if err := g.EnsureDefaults(); err != nil {
    50  		panic(err)
    51  	}
    52  	return g
    53  }
    54  
    55  func Test_GenerateClient(t *testing.T) {
    56  	t.Parallel()
    57  	defer discardOutput()()
    58  
    59  	// exercise safeguards
    60  	err := GenerateClient("test", []string{"model1"}, []string{"op1", "op2"}, nil)
    61  	assert.Error(t, err)
    62  
    63  	opts := testClientGenOpts()
    64  	opts.TemplateDir = "dir/nowhere"
    65  	err = GenerateClient("test", []string{"model1"}, []string{"op1", "op2"}, opts)
    66  	assert.Error(t, err)
    67  
    68  	opts = testClientGenOpts()
    69  	opts.TemplateDir = "http://nowhere.com"
    70  	err = GenerateClient("test", []string{"model1"}, []string{"op1", "op2"}, opts)
    71  	assert.Error(t, err)
    72  
    73  	opts = testClientGenOpts()
    74  	opts.Spec = "dir/nowhere.yaml"
    75  	err = GenerateClient("test", []string{"model1"}, []string{"op1", "op2"}, opts)
    76  	assert.Error(t, err)
    77  
    78  	opts = testClientGenOpts()
    79  	opts.Spec = basicFixture
    80  	err = GenerateClient("test", []string{"model1"}, []string{}, opts)
    81  	assert.Error(t, err)
    82  
    83  	opts = testClientGenOpts()
    84  	// bad content in spec (HTML...)
    85  	opts.Spec = "https://github.com/OAI/OpenAPI-Specification/blob/master/examples/v2.0/json/petstore.json"
    86  	err = GenerateClient("test", []string{}, []string{}, opts)
    87  	assert.Error(t, err)
    88  
    89  	opts = testClientGenOpts()
    90  	// no operations selected
    91  	opts.Spec = "https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v2.0/yaml/petstore.yaml"
    92  	err = GenerateClient("test", []string{}, []string{"wrongOperationID"}, opts)
    93  	assert.Error(t, err)
    94  
    95  	opts = testClientGenOpts()
    96  	// generate remote spec
    97  	opts.Spec = "https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v2.0/yaml/petstore.yaml"
    98  	cwd, _ := os.Getwd()
    99  	tft, _ := os.MkdirTemp(cwd, "generated")
   100  	defer func() {
   101  		_ = os.RemoveAll(tft)
   102  	}()
   103  	opts.Target = tft
   104  	opts.IsClient = true
   105  	DefaultSectionOpts(opts)
   106  
   107  	defer func() {
   108  		_ = os.RemoveAll(opts.Target)
   109  	}()
   110  	err = GenerateClient("test", []string{}, []string{}, opts)
   111  	assert.NoError(t, err)
   112  
   113  	// just checks this does not fail
   114  	origStdout := os.Stdout
   115  	defer func() {
   116  		os.Stdout = origStdout
   117  	}()
   118  	tgt, _ := os.MkdirTemp(cwd, "dumped")
   119  	defer func() {
   120  		_ = os.RemoveAll(tgt)
   121  	}()
   122  	os.Stdout, _ = os.Create(filepath.Join(tgt, "stdout"))
   123  	opts.DumpData = true
   124  	err = GenerateClient("test", []string{}, []string{}, opts)
   125  	assert.NoError(t, err)
   126  	_, err = os.Stat(filepath.Join(tgt, "stdout"))
   127  	assert.NoError(t, err)
   128  }
   129  
   130  func assertImports(t testing.TB, baseImport, code string) {
   131  	assertRegexpInCode(t, baseImport, code)
   132  	assertRegexpInCode(t, `"`+baseImport+`/abc_linux"`, code)
   133  	assertRegexpInCode(t, `"`+baseImport+`/abc_linux"`, code)
   134  	assertRegexpInCode(t, `"`+baseImport+`/abc_test"`, code)
   135  	assertRegexpInCode(t, `apiops\s+"`+baseImport+`/api"`, code)
   136  	assertRegexpInCode(t, `"`+baseImport+`/custom"`, code)
   137  	assertRegexpInCode(t, `"`+baseImport+`/hash_tag_donuts"`, code)
   138  	assertRegexpInCode(t, `"`+baseImport+`/nr123abc"`, code)
   139  	assertRegexpInCode(t, `"`+baseImport+`/nr_at_donuts"`, code)
   140  	assertRegexpInCode(t, `"`+baseImport+`/plus_donuts`, code)
   141  	assertRegexpInCode(t, `strfmtops "`+baseImport+`/strfmt`, code)
   142  	assertRegexpInCode(t, `"`+baseImport+`/forced`, code)
   143  	assertRegexpInCode(t, `"`+baseImport+`/nr12nasty`, code)
   144  	assertRegexpInCode(t, `"`+baseImport+`/override`, code)
   145  	assertRegexpInCode(t, `"`+baseImport+`/gtl`, code)
   146  	assertRegexpInCode(t, `"`+baseImport+`/operationsops`, code)
   147  }
   148  
   149  func TestClient(t *testing.T) {
   150  	t.Parallel()
   151  	defer discardOutput()()
   152  
   153  	base := os.Getenv("GOPATH")
   154  	if base == "" {
   155  		base = "."
   156  	} else {
   157  		base = filepath.Join(base, "src")
   158  		err := os.MkdirAll(base, 0755)
   159  		require.NoError(t, err)
   160  	}
   161  	targetdir, err := os.MkdirTemp(base, "swagger_nogo")
   162  	require.NoError(t, err, "Failed to create a test target directory: %v", err)
   163  
   164  	defer func() {
   165  		_ = os.RemoveAll(targetdir)
   166  		log.SetOutput(os.Stdout)
   167  	}()
   168  
   169  	tests := []struct {
   170  		name      string
   171  		spec      string
   172  		template  string
   173  		wantError bool
   174  		prepare   func(opts *GenOpts)
   175  		verify    func(testing.TB, string)
   176  	}{
   177  		{
   178  			name:      "InvalidSpec",
   179  			wantError: true,
   180  			prepare: func(opts *GenOpts) {
   181  				opts.Spec = invalidSpecExample
   182  				opts.ValidateSpec = true
   183  			},
   184  		},
   185  		{
   186  			name: "BaseImportDisabled",
   187  			prepare: func(opts *GenOpts) {
   188  				opts.LanguageOpts.BaseImportFunc = nil
   189  			},
   190  			wantError: false,
   191  		},
   192  		{
   193  			name:      "Non_existing_contributor_template",
   194  			template:  "NonExistingContributorTemplate",
   195  			wantError: true,
   196  		},
   197  		{
   198  			name:      "Existing_contributor",
   199  			template:  "stratoscale",
   200  			wantError: false,
   201  		},
   202  		{
   203  			name:      "packages mangling",
   204  			wantError: false,
   205  			spec:      filepath.Join("..", "fixtures", "bugs", "2111", "fixture-2111.yaml"),
   206  			verify: func(t testing.TB, target string) {
   207  				require.True(t, fileExists(target, "client"))
   208  
   209  				// assert package generation based on mangled tags
   210  				target = filepath.Join(target, "client")
   211  				assert.True(t, fileExists(target, "abc_linux"))
   212  				assert.True(t, fileExists(target, "abc_test"))
   213  				assert.True(t, fileExists(target, "api"))
   214  				assert.True(t, fileExists(target, "custom"))
   215  				assert.True(t, fileExists(target, "hash_tag_donuts"))
   216  				assert.True(t, fileExists(target, "nr123abc"))
   217  				assert.True(t, fileExists(target, "nr_at_donuts"))
   218  				assert.True(t, fileExists(target, "operations"))
   219  				assert.True(t, fileExists(target, "plus_donuts"))
   220  				assert.True(t, fileExists(target, "strfmt"))
   221  				assert.True(t, fileExists(target, "forced"))
   222  				assert.True(t, fileExists(target, "gtl"))
   223  				assert.True(t, fileExists(target, "nr12nasty"))
   224  				assert.True(t, fileExists(target, "override"))
   225  				assert.True(t, fileExists(target, "operationsops"))
   226  
   227  				buf, err := os.ReadFile(filepath.Join(target, "foo_client.go"))
   228  				require.NoError(t, err)
   229  
   230  				// assert client import, with deconfliction
   231  				code := string(buf)
   232  				baseImport := `github.com/ffalor/go-swagger/generator/swagger_nogo\d+/packages_mangling/client`
   233  				assertImports(t, baseImport, code)
   234  
   235  				assertInCode(t, `cli.Strfmt = strfmtops.New(transport, formats)`, code)
   236  				assertInCode(t, `cli.API = apiops.New(transport, formats)`, code)
   237  				assertInCode(t, `cli.Operations = operations.New(transport, formats)`, code)
   238  			},
   239  		},
   240  		{
   241  			name:      "packages flattening",
   242  			wantError: false,
   243  			spec:      filepath.Join("..", "fixtures", "bugs", "2111", "fixture-2111.yaml"),
   244  			prepare: func(opts *GenOpts) {
   245  				opts.SkipTagPackages = true
   246  			},
   247  			verify: func(t testing.TB, target string) {
   248  				require.True(t, fileExists(target, "client"))
   249  
   250  				// packages are not created here
   251  				target = filepath.Join(target, "client")
   252  				assert.False(t, fileExists(target, "abc_linux"))
   253  				assert.False(t, fileExists(target, "abc_test"))
   254  				assert.False(t, fileExists(target, "api"))
   255  				assert.False(t, fileExists(target, "custom"))
   256  				assert.False(t, fileExists(target, "hash_tag_donuts"))
   257  				assert.False(t, fileExists(target, "nr123abc"))
   258  				assert.False(t, fileExists(target, "nr_at_donuts"))
   259  				assert.False(t, fileExists(target, "plus_donuts"))
   260  				assert.False(t, fileExists(target, "strfmt"))
   261  				assert.False(t, fileExists(target, "forced"))
   262  				assert.False(t, fileExists(target, "gtl"))
   263  				assert.False(t, fileExists(target, "nr12nasty"))
   264  				assert.False(t, fileExists(target, "override"))
   265  				assert.False(t, fileExists(target, "operationsops"))
   266  
   267  				assert.True(t, fileExists(target, "operations"))
   268  			},
   269  		},
   270  		{
   271  			name:      "name with trailing API",
   272  			spec:      filepath.Join("..", "fixtures", "bugs", "2278", "fixture-2278.yaml"),
   273  			wantError: false,
   274  		},
   275  	}
   276  
   277  	t.Run("generate client", func(t *testing.T) {
   278  		for idx, toPin := range tests {
   279  			tt := toPin
   280  			i := idx
   281  			t.Run(tt.name, func(t *testing.T) {
   282  				t.Parallel()
   283  				opts := testClientGenOpts()
   284  				opts.Spec = basicFixture
   285  				opts.Target = filepath.Join(targetdir, opts.LanguageOpts.ManglePackageName(tt.name, "client_test"+strconv.Itoa(i)))
   286  				err := os.MkdirAll(opts.Target, 0755)
   287  				require.NoError(t, err)
   288  
   289  				if tt.spec == "" {
   290  					opts.Spec = basicFixture
   291  				} else {
   292  					opts.Spec = tt.spec
   293  				}
   294  				opts.Template = tt.template
   295  
   296  				if tt.prepare != nil {
   297  					tt.prepare(opts)
   298  				}
   299  
   300  				err = GenerateClient("foo", nil, nil, opts)
   301  				if tt.wantError {
   302  					require.Errorf(t, err, "expected an error for client build fixture: %s", opts.Spec)
   303  				} else {
   304  					require.NoError(t, err, "unexpected error for client build fixture: %s", opts.Spec)
   305  				}
   306  
   307  				if tt.verify != nil {
   308  					tt.verify(t, opts.Target)
   309  				}
   310  			})
   311  		}
   312  	})
   313  }
   314  
   315  func TestGenClient_1518(t *testing.T) {
   316  	t.Parallel()
   317  	defer discardOutput()()
   318  
   319  	// test client response handling when unexpected success response kicks in
   320  
   321  	opts := testClientGenOpts()
   322  	opts.Spec = filepath.Join("..", "fixtures", "bugs", "1518", "fixture-1518.yaml")
   323  
   324  	cwd, _ := os.Getwd()
   325  	tft, _ := os.MkdirTemp(cwd, "generated")
   326  	opts.Target = tft
   327  
   328  	defer func() {
   329  		_ = os.RemoveAll(tft)
   330  	}()
   331  
   332  	err := GenerateClient("client", []string{}, []string{}, opts)
   333  	require.NoError(t, err)
   334  
   335  	fixtureConfig := map[string][]string{
   336  		"client/operations/operations_client.go": { // generated file
   337  			// expected code lines
   338  			`success, ok := result.(*GetRecords1OK)`,
   339  			`if ok {`,
   340  			`return success, nil`,
   341  			`msg := fmt.Sprintf(`,
   342  			`panic(msg)`,
   343  			// expected code lines
   344  			`success, ok := result.(*GetRecords2OK)`,
   345  			`if ok {`,
   346  			`return success, nil`,
   347  			`unexpectedSuccess := result.(*GetRecords2Default)`,
   348  			`return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code())`,
   349  			// expected code lines
   350  			`switch value := result.(type) {`,
   351  			`case *GetRecords3OK:`,
   352  			`return value, nil, nil`,
   353  			`case *GetRecords3Created:`,
   354  			`return nil, value, nil`,
   355  			`msg := fmt.Sprintf(`,
   356  			`panic(msg)`,
   357  			// expected code lines
   358  			`switch value := result.(type) {`,
   359  			`case *GetRecords4OK:`,
   360  			`return value, nil, nil`,
   361  			`case *GetRecords4Created:`,
   362  			`return nil, value, nil`,
   363  			`unexpectedSuccess := result.(*GetRecords4Default)`,
   364  			`return nil, nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code())`,
   365  		},
   366  	}
   367  
   368  	for fileToInspect, expectedCode := range fixtureConfig {
   369  		code, err := os.ReadFile(filepath.Join(opts.Target, filepath.FromSlash(fileToInspect)))
   370  		require.NoError(t, err)
   371  
   372  		for line, codeLine := range expectedCode {
   373  			if !assertInCode(t, strings.TrimSpace(codeLine), string(code)) {
   374  				t.Logf("Code expected did not match in codegenfile %s for expected line %d: %q", fileToInspect, line, expectedCode[line])
   375  			}
   376  		}
   377  	}
   378  }
   379  
   380  func TestGenClient_2945(t *testing.T) {
   381  	t.Parallel()
   382  	defer discardOutput()()
   383  
   384  	opts := testClientGenOpts()
   385  	opts.Spec = filepath.Join("..", "fixtures", "bugs", "2945", "fixture-2945.yaml")
   386  
   387  	cwd, _ := os.Getwd()
   388  	tft, _ := os.MkdirTemp(cwd, "generated")
   389  	opts.Target = tft
   390  
   391  	defer func() {
   392  		_ = os.RemoveAll(tft)
   393  	}()
   394  
   395  	err := GenerateClient("client", []string{}, []string{}, opts)
   396  	require.NoError(t, err)
   397  
   398  	fixtureConfig := map[string][]string{
   399  		"client/operations/get_version_responses.go": { // generated file
   400  			// expected code lines
   401  			`return nil, runtime.NewAPIError("[GET /version] getVersion", response, response.Code())`,
   402  		},
   403  	}
   404  
   405  	for fileToInspect, expectedCode := range fixtureConfig {
   406  		code, err := os.ReadFile(filepath.Join(opts.Target, filepath.FromSlash(fileToInspect)))
   407  		require.NoError(t, err)
   408  
   409  		for line, codeLine := range expectedCode {
   410  			if !assertInCode(t, strings.TrimSpace(codeLine), string(code)) {
   411  				t.Logf("Code expected did not match in codegenfile %s for expected line %d: %q", fileToInspect, line, expectedCode[line])
   412  			}
   413  		}
   414  	}
   415  }
   416  
   417  func TestGenClient_2471(t *testing.T) {
   418  	t.Parallel()
   419  	defer discardOutput()()
   420  
   421  	opts := testClientGenOpts()
   422  	opts.Spec = filepath.Join("..", "fixtures", "bugs", "2471", "fixture-2471.yaml")
   423  
   424  	cwd, _ := os.Getwd()
   425  	tft, _ := os.MkdirTemp(cwd, "generated")
   426  	opts.Target = tft
   427  
   428  	defer func() {
   429  		_ = os.RemoveAll(tft)
   430  	}()
   431  
   432  	err := GenerateClient("client", []string{}, []string{}, opts)
   433  	require.NoError(t, err)
   434  
   435  	fixtureConfig := map[string][]string{
   436  		"client/operations/example_post_parameters.go": { // generated file
   437  			`func (o *ExamplePostParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {`,
   438  			`	if err := r.SetTimeout(o.timeout); err != nil {`,
   439  			`	joinedFoo := o.bindParamFoo(reg)`,
   440  			`	if len(joinedFoo) > 0 {`,
   441  			`		if err := r.SetHeaderParam("Foo", joinedFoo[0]); err != nil {`,
   442  			` joinedFooPath := o.bindParamFooPath(reg)`,
   443  			`	if len(joinedFooPath) > 0 {`,
   444  			`		if err := r.SetPathParam("FooPath", joinedFooPath[0]); err != nil {`,
   445  			` joinedFooQuery := o.bindParamFooQuery(reg)`,
   446  			`	if err := r.SetQueryParam("FooQuery", joinedFooQuery...); err != nil {`,
   447  			`func (o *ExamplePostParams) bindParamFoo(formats strfmt.Registry) []string {`,
   448  			`		fooIR := o.Foo`,
   449  			`   var fooIC []string`,
   450  			` 	for _, fooIIR := range fooIR {`,
   451  			` 	  fooIIV := fooIIR`,
   452  			` 	  fooIC = append(fooIC, fooIIV)`,
   453  			` 	  fooIS := swag.JoinByFormat(fooIC, "")`,
   454  			` 	  return fooIS`,
   455  			`func (o *ExamplePostParams) bindParamFooPath(formats strfmt.Registry) []string {`,
   456  			` 		fooPathIR := o.FooPath`,
   457  			` 	 	var fooPathIC []string`,
   458  			` 	 	for _, fooPathIIR := range fooPathIR {`,
   459  			` 	 		fooPathIIV := fooPathIIR`,
   460  			` 	    fooPathIC = append(fooPathIC, fooPathIIV)`,
   461  			` 	    fooPathIS := swag.JoinByFormat(fooPathIC, "")`,
   462  			`  return fooPathIS`,
   463  			`func (o *ExamplePostParams) bindParamFooQuery(formats strfmt.Registry) []string {`,
   464  			` 	  fooQueryIR := o.FooQuery`,
   465  			` 	  var fooQueryIC []string`,
   466  			` 	  for _, fooQueryIIR := range fooQueryIR {`,
   467  			` 	    fooQueryIIV := fooQueryIIR`,
   468  			` 	    fooQueryIC = append(fooQueryIC, fooQueryIIV)`,
   469  			` 	    fooQueryIS := swag.JoinByFormat(fooQueryIC, "")`,
   470  			`  return fooQueryIS`,
   471  		},
   472  	}
   473  
   474  	for fileToInspect, expectedCode := range fixtureConfig {
   475  		code, err := os.ReadFile(filepath.Join(opts.Target, filepath.FromSlash(fileToInspect)))
   476  		require.NoError(t, err)
   477  
   478  		for line, codeLine := range expectedCode {
   479  			if !assertInCode(t, strings.TrimSpace(codeLine), string(code)) {
   480  				t.Logf("Code expected did not match in codegenfile %s for expected line %d: %q", fileToInspect, line, expectedCode[line])
   481  			}
   482  		}
   483  	}
   484  }
   485  
   486  func TestGenClient_2096(t *testing.T) {
   487  	t.Parallel()
   488  	defer discardOutput()()
   489  
   490  	opts := testClientGenOpts()
   491  	opts.Spec = filepath.Join("..", "fixtures", "bugs", "2096", "fixture-2096.yaml")
   492  
   493  	cwd, _ := os.Getwd()
   494  	tft, _ := os.MkdirTemp(cwd, "generated")
   495  	opts.Target = tft
   496  
   497  	defer func() {
   498  		_ = os.RemoveAll(tft)
   499  	}()
   500  
   501  	err := GenerateClient("client", []string{}, []string{}, opts)
   502  	require.NoError(t, err)
   503  
   504  	fixtureConfig := map[string][]string{
   505  		"client/operations/list_resources_parameters.go": { // generated file
   506  			`type ListResourcesParams struct {`,
   507  			`	Fields []string`,
   508  			`func (o *ListResourcesParams) SetDefaults() {`,
   509  			`	var (`,
   510  			`		fieldsDefault = []string{"first", "second", "third"}`,
   511  			`	val := ListResourcesParams{`,
   512  			`		Fields: fieldsDefault,`,
   513  			`	val.timeout = o.timeout`,
   514  			`	val.Context = o.Context`,
   515  			`	val.HTTPClient = o.HTTPClient`,
   516  			`	*o = val`,
   517  			`	joinedFields := o.bindParamFields(reg)`,
   518  			`	if err := r.SetQueryParam("fields", joinedFields...); err != nil {`,
   519  		},
   520  	}
   521  
   522  	for fileToInspect, expectedCode := range fixtureConfig {
   523  		code, err := os.ReadFile(filepath.Join(opts.Target, filepath.FromSlash(fileToInspect)))
   524  		require.NoError(t, err)
   525  
   526  		for line, codeLine := range expectedCode {
   527  			if !assertInCode(t, strings.TrimSpace(codeLine), string(code)) {
   528  				t.Logf("Code expected did not match in codegenfile %s for expected line %d: %q", fileToInspect, line, expectedCode[line])
   529  			}
   530  		}
   531  	}
   532  }
   533  
   534  func TestGenClient_909_3(t *testing.T) {
   535  	t.Parallel()
   536  	defer discardOutput()()
   537  
   538  	opts := testClientGenOpts()
   539  	opts.Spec = filepath.Join("..", "fixtures", "bugs", "909", "fixture-909-3.yaml")
   540  
   541  	cwd, _ := os.Getwd()
   542  	tft, _ := os.MkdirTemp(cwd, "generated")
   543  	opts.Target = tft
   544  
   545  	defer func() {
   546  		_ = os.RemoveAll(tft)
   547  	}()
   548  
   549  	err := GenerateClient("client", []string{}, []string{}, opts)
   550  	require.NoError(t, err)
   551  
   552  	fixtureConfig := map[string][]string{
   553  		"client/operations/get_optional_parameters.go": { // generated file
   554  			`func (o *GetOptionalParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {`,
   555  			`	if err := r.SetTimeout(o.timeout); err != nil {`,
   556  			`	if o.IsAnOption2 != nil {`,
   557  			`		joinedIsAnOption2 := o.bindParamIsAnOption2(reg)`,
   558  			`		if err := r.SetQueryParam("isAnOption2", joinedIsAnOption2...); err != nil {`,
   559  			`	if o.IsAnOption4 != nil {`,
   560  			`		joinedIsAnOption4 := o.bindParamIsAnOption4(reg)`,
   561  			`		if err := r.SetQueryParam("isAnOption4", joinedIsAnOption4...); err != nil {`,
   562  			`	if o.IsAnOptionalHeader != nil {`,
   563  			`		joinedIsAnOptionalHeader := o.bindParamIsAnOptionalHeader(reg)`,
   564  			`		if len(joinedIsAnOptionalHeader) > 0 {`,
   565  			`			if err := r.SetHeaderParam("isAnOptionalHeader", joinedIsAnOptionalHeader[0]); err != nil {`,
   566  			`	if o.NotAnOption1 != nil {`,
   567  			`		joinedNotAnOption1 := o.bindParamNotAnOption1(reg)`,
   568  			`		if err := r.SetQueryParam("notAnOption1", joinedNotAnOption1...); err != nil {`,
   569  			`	if o.NotAnOption3 != nil {`,
   570  			`		if err := r.SetBodyParam(o.NotAnOption3); err != nil {`,
   571  			`func (o *GetOptionalParams) bindParamIsAnOption2(formats strfmt.Registry) []string {`,
   572  			`	isAnOption2IR := o.IsAnOption2`,
   573  			`	var isAnOption2IC []string`,
   574  			`	for _, isAnOption2IIR := range isAnOption2IR { // explode [][]strfmt.UUID`,
   575  			`		var isAnOption2IIC []string`,
   576  			`		for _, isAnOption2IIIR := range isAnOption2IIR { // explode []strfmt.UUID`,
   577  			`			isAnOption2IIIV := isAnOption2IIIR.String() // strfmt.UUID as string`,
   578  			`			isAnOption2IIC = append(isAnOption2IIC, isAnOption2IIIV)`,
   579  			`		isAnOption2IIS := swag.JoinByFormat(isAnOption2IIC, "")`,
   580  			`		isAnOption2IIV := isAnOption2IIS[0]`,
   581  			`		isAnOption2IC = append(isAnOption2IC, isAnOption2IIV)`,
   582  			`	isAnOption2IS := swag.JoinByFormat(isAnOption2IC, "pipes")`,
   583  			`	return isAnOption2IS`,
   584  			`func (o *GetOptionalParams) bindParamIsAnOption4(formats strfmt.Registry) []string {`,
   585  			`	isAnOption4IR := o.IsAnOption4`,
   586  			`	var isAnOption4IC []string`,
   587  			`	for _, isAnOption4IIR := range isAnOption4IR { // explode [][][]strfmt.UUID`,
   588  			`		var isAnOption4IIC []string`,
   589  			`		for _, isAnOption4IIIR := range isAnOption4IIR { // explode [][]strfmt.UUID`,
   590  			`			var isAnOption4IIIC []string`,
   591  			`			for _, isAnOption4IIIIR := range isAnOption4IIIR { // explode []strfmt.UUID`,
   592  			`				isAnOption4IIIIV := isAnOption4IIIIR.String() // strfmt.UUID as string`,
   593  			`				isAnOption4IIIC = append(isAnOption4IIIC, isAnOption4IIIIV)`,
   594  			`			isAnOption4IIIS := swag.JoinByFormat(isAnOption4IIIC, "pipes")`,
   595  			`			isAnOption4IIIV := isAnOption4IIIS[0]`,
   596  			`			isAnOption4IIC = append(isAnOption4IIC, isAnOption4IIIV)`,
   597  			`		}`,
   598  			`		isAnOption4IIS := swag.JoinByFormat(isAnOption4IIC, "tsv")`,
   599  			`		isAnOption4IIV := isAnOption4IIS[0]`,
   600  			`		isAnOption4IC = append(isAnOption4IC, isAnOption4IIV)`,
   601  			`	isAnOption4IS := swag.JoinByFormat(isAnOption4IC, "csv")`,
   602  			`	return isAnOption4IS`,
   603  			`func (o *GetOptionalParams) bindParamIsAnOptionalHeader(formats strfmt.Registry) []string {`,
   604  			`	isAnOptionalHeaderIR := o.IsAnOptionalHeader`,
   605  			`	var isAnOptionalHeaderIC []string`,
   606  			`	for _, isAnOptionalHeaderIIR := range isAnOptionalHeaderIR { // explode [][]strfmt.UUID`,
   607  			`		var isAnOptionalHeaderIIC []string`,
   608  			`		for _, isAnOptionalHeaderIIIR := range isAnOptionalHeaderIIR { // explode []strfmt.UUID`,
   609  			`			isAnOptionalHeaderIIIV := isAnOptionalHeaderIIIR.String() // strfmt.UUID as string`,
   610  			`			isAnOptionalHeaderIIC = append(isAnOptionalHeaderIIC, isAnOptionalHeaderIIIV)`,
   611  			`		isAnOptionalHeaderIIS := swag.JoinByFormat(isAnOptionalHeaderIIC, "")`,
   612  			`		isAnOptionalHeaderIIV := isAnOptionalHeaderIIS[0]`,
   613  			`		isAnOptionalHeaderIC = append(isAnOptionalHeaderIC, isAnOptionalHeaderIIV)`,
   614  			`	isAnOptionalHeaderIS := swag.JoinByFormat(isAnOptionalHeaderIC, "pipes")`,
   615  			`	return isAnOptionalHeaderIS`,
   616  			`func (o *GetOptionalParams) bindParamNotAnOption1(formats strfmt.Registry) []string {`,
   617  			`	notAnOption1IR := o.NotAnOption1`,
   618  			`	var notAnOption1IC []string`,
   619  			`	for _, notAnOption1IIR := range notAnOption1IR { // explode [][]strfmt.DateTime`,
   620  			`		var notAnOption1IIC []string`,
   621  			`		for _, notAnOption1IIIR := range notAnOption1IIR { // explode []strfmt.DateTime`,
   622  			`			notAnOption1IIIV := notAnOption1IIIR.String() // strfmt.DateTime as string`,
   623  			`			notAnOption1IIC = append(notAnOption1IIC, notAnOption1IIIV)`,
   624  			`		notAnOption1IIS := swag.JoinByFormat(notAnOption1IIC, "pipes")`,
   625  			`		notAnOption1IIV := notAnOption1IIS[0]`,
   626  			`		notAnOption1IC = append(notAnOption1IC, notAnOption1IIV)`,
   627  			`	notAnOption1IS := swag.JoinByFormat(notAnOption1IC, "csv")`,
   628  			`	return notAnOption1IS`,
   629  		},
   630  	}
   631  
   632  	for fileToInspect, expectedCode := range fixtureConfig {
   633  		code, err := os.ReadFile(filepath.Join(opts.Target, filepath.FromSlash(fileToInspect)))
   634  		require.NoError(t, err)
   635  
   636  		for line, codeLine := range expectedCode {
   637  			if !assertInCode(t, strings.TrimSpace(codeLine), string(code)) {
   638  				t.Logf("Code expected did not match in codegenfile %s for expected line %d: %q", fileToInspect, line, expectedCode[line])
   639  			}
   640  		}
   641  	}
   642  }
   643  
   644  func TestGenClient_909_5(t *testing.T) {
   645  	t.Parallel()
   646  	defer discardOutput()()
   647  
   648  	opts := testClientGenOpts()
   649  	opts.Spec = filepath.Join("..", "fixtures", "bugs", "909", "fixture-909-5.yaml")
   650  
   651  	cwd, _ := os.Getwd()
   652  	tft, _ := os.MkdirTemp(cwd, "generated")
   653  	opts.Target = tft
   654  
   655  	defer func() {
   656  		_ = os.RemoveAll(tft)
   657  	}()
   658  
   659  	err := GenerateClient("client", []string{}, []string{}, opts)
   660  	require.NoError(t, err)
   661  
   662  	fixtureConfig := map[string][]string{
   663  		"client/operations/get_optional_responses.go": { // generated file
   664  			`func NewGetOptionalOK() *GetOptionalOK {`,
   665  			`	var (`,
   666  			`		xIsAnOptionalHeader0Default = strfmt.DateTime{}`,
   667  			`		xIsAnOptionalHeader0PrimitiveDefault = float32(345.55)`,
   668  			`		xIsAnOptionalHeader0StringerDefault = strfmt.UUID("524fc6d5-66c6-46f6-90bc-34e0d0139e43")`,
   669  			`		xIsAnOptionalHeader1Default = make([]strfmt.DateTime, 0, 50)`,
   670  			`		xIsAnOptionalHeader2Default = make([][]int32, 0, 50)`,
   671  			`		xIsAnOptionalHeader2NoFormatDefault = make([][]int64, 0, 50)`,
   672  			`		xIsAnOptionalHeader3Default = make([][][]strfmt.UUID, 0, 50)`,
   673  			`	)`,
   674  			`	if err := xIsAnOptionalHeader0Default.UnmarshalText([]byte("2018-01-28T23:54:00.000Z")); err != nil {`,
   675  			`		msg := fmt.Sprintf("invalid default value for xIsAnOptionalHeader0: %v", err)`,
   676  			"	if err := json.Unmarshal([]byte(`[\"2018-01-28T23:54:00.000Z\",\"2018-02-28T23:54:00.000Z\",\"2018-03-28T23:54:00.000Z\",\"2018-04-28T23:54:00.000Z\"]`), &xIsAnOptionalHeader1Default); err != nil {",
   677  			`		msg := fmt.Sprintf("invalid default value for xIsAnOptionalHeader1: %v", err)`,
   678  			"	if err := json.Unmarshal([]byte(`[[21,22,23],[31,32,33]]`), &xIsAnOptionalHeader2Default); err != nil {",
   679  			`		msg := fmt.Sprintf("invalid default value for xIsAnOptionalHeader2: %v", err)`,
   680  			"	if err := json.Unmarshal([]byte(`[[21,22,23],[31,32,33]]`), &xIsAnOptionalHeader2NoFormatDefault); err != nil {",
   681  			`		msg := fmt.Sprintf("invalid default value for xIsAnOptionalHeader2NoFormat: %v", err)`,
   682  			"	if err := json.Unmarshal([]byte(`[[[\"524fc6d5-66c6-46f6-90bc-34e0d0139e43\",\"c8199a5f-f7ce-4fb1-b8af-082256125e89\"],[\"c8199a5f-f7ce-4fb1-b8af-082256125e89\",\"524fc6d5-66c6-46f6-90bc-34e0d0139e43\"]],[[\"c8199a5f-f7ce-4fb1-b8af-082256125e89\",\"524fc6d5-66c6-46f6-90bc-34e0d0139e43\"],[\"524fc6d5-66c6-46f6-90bc-34e0d0139e43\",\"c8199a5f-f7ce-4fb1-b8af-082256125e89\"]]]`), &xIsAnOptionalHeader3Default); err != nil {",
   683  			`		msg := fmt.Sprintf("invalid default value for xIsAnOptionalHeader3: %v", err)`,
   684  			`	return &GetOptionalOK{`,
   685  			`		XIsAnOptionalHeader0:          xIsAnOptionalHeader0Default,`,
   686  			`		XIsAnOptionalHeader0Primitive: xIsAnOptionalHeader0PrimitiveDefault,`,
   687  			`		XIsAnOptionalHeader0Stringer:  xIsAnOptionalHeader0StringerDefault,`,
   688  			`		XIsAnOptionalHeader1:          xIsAnOptionalHeader1Default,`,
   689  			`		XIsAnOptionalHeader2:          xIsAnOptionalHeader2Default,`,
   690  			`		XIsAnOptionalHeader2NoFormat:  xIsAnOptionalHeader2NoFormatDefault,`,
   691  			`		XIsAnOptionalHeader3:          xIsAnOptionalHeader3Default,`,
   692  			`func (o *GetOptionalOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {`,
   693  			`	hdrXIsAnOptionalHeader0 := response.GetHeader("x-isAnOptionalHeader0")`,
   694  			`	if hdrXIsAnOptionalHeader0 != "" {`,
   695  			`		valxIsAnOptionalHeader0, err := formats.Parse("date-time", hdrXIsAnOptionalHeader0)`,
   696  			`		if err != nil {`,
   697  			`			return errors.InvalidType("x-isAnOptionalHeader0", "header", "strfmt.DateTime", hdrXIsAnOptionalHeader0)`,
   698  			`		o.XIsAnOptionalHeader0 = *(valxIsAnOptionalHeader0.(*strfmt.DateTime))`,
   699  			`	hdrXIsAnOptionalHeader0DirtSimple := response.GetHeader("x-isAnOptionalHeader0DirtSimple")`,
   700  			`	if hdrXIsAnOptionalHeader0DirtSimple != "" {`,
   701  			`		o.XIsAnOptionalHeader0DirtSimple = hdrXIsAnOptionalHeader0DirtSimple`,
   702  			`	hdrXIsAnOptionalHeader0DirtSimpleArray := response.GetHeader("x-isAnOptionalHeader0DirtSimpleArray")`,
   703  			`	if hdrXIsAnOptionalHeader0DirtSimpleArray != "" {`,
   704  			`		valXIsAnOptionalHeader0DirtSimpleArray, err := o.bindHeaderXIsAnOptionalHeader0DirtSimpleArray(hdrXIsAnOptionalHeader0DirtSimpleArray, formats)`,
   705  			`		o.XIsAnOptionalHeader0DirtSimpleArray = valXIsAnOptionalHeader0DirtSimpleArray`,
   706  			`	hdrXIsAnOptionalHeader0DirtSimpleInteger := response.GetHeader("x-isAnOptionalHeader0DirtSimpleInteger")`,
   707  			`	if hdrXIsAnOptionalHeader0DirtSimpleInteger != "" {`,
   708  			`		valxIsAnOptionalHeader0DirtSimpleInteger, err := swag.ConvertInt64(hdrXIsAnOptionalHeader0DirtSimpleInteger)`,
   709  			`			return errors.InvalidType("x-isAnOptionalHeader0DirtSimpleInteger", "header", "int64", hdrXIsAnOptionalHeader0DirtSimpleInteger)`,
   710  			`		o.XIsAnOptionalHeader0DirtSimpleInteger = valxIsAnOptionalHeader0DirtSimpleInteger`,
   711  			`	hdrXIsAnOptionalHeader0Primitive := response.GetHeader("x-isAnOptionalHeader0Primitive")`,
   712  			`	if hdrXIsAnOptionalHeader0Primitive != "" {`,
   713  			`		valxIsAnOptionalHeader0Primitive, err := swag.ConvertFloat32(hdrXIsAnOptionalHeader0Primitive)`,
   714  			`			return errors.InvalidType("x-isAnOptionalHeader0Primitive", "header", "float32", hdrXIsAnOptionalHeader0Primitive)`,
   715  			`		o.XIsAnOptionalHeader0Primitive = valxIsAnOptionalHeader0Primitive`,
   716  			`	hdrXIsAnOptionalHeader0Stringer := response.GetHeader("x-isAnOptionalHeader0Stringer")`,
   717  			`	if hdrXIsAnOptionalHeader0Stringer != "" {`,
   718  			`		valxIsAnOptionalHeader0Stringer, err := formats.Parse("uuid", hdrXIsAnOptionalHeader0Stringer)`,
   719  			`			return errors.InvalidType("x-isAnOptionalHeader0Stringer", "header", "strfmt.UUID", hdrXIsAnOptionalHeader0Stringer)`,
   720  			`		o.XIsAnOptionalHeader0Stringer = *(valxIsAnOptionalHeader0Stringer.(*strfmt.UUID))`,
   721  			`	hdrXIsAnOptionalHeader1 := response.GetHeader("x-isAnOptionalHeader1")`,
   722  			`	if hdrXIsAnOptionalHeader1 != "" {`,
   723  			`		valXIsAnOptionalHeader1, err := o.bindHeaderXIsAnOptionalHeader1(hdrXIsAnOptionalHeader1, formats)`,
   724  			`		o.XIsAnOptionalHeader1 = valXIsAnOptionalHeader1`,
   725  			`	hdrXIsAnOptionalHeader2 := response.GetHeader("x-isAnOptionalHeader2")`,
   726  			`	if hdrXIsAnOptionalHeader2 != "" {`,
   727  			`		valXIsAnOptionalHeader2, err := o.bindHeaderXIsAnOptionalHeader2(hdrXIsAnOptionalHeader2, formats)`,
   728  			`		o.XIsAnOptionalHeader2 = valXIsAnOptionalHeader2`,
   729  			`	hdrXIsAnOptionalHeader2NoFormat := response.GetHeader("x-isAnOptionalHeader2NoFormat")`,
   730  			`	if hdrXIsAnOptionalHeader2NoFormat != "" {`,
   731  			`		valXIsAnOptionalHeader2NoFormat, err := o.bindHeaderXIsAnOptionalHeader2NoFormat(hdrXIsAnOptionalHeader2NoFormat, formats)`,
   732  			`		o.XIsAnOptionalHeader2NoFormat = valXIsAnOptionalHeader2NoFormat`,
   733  			`	hdrXIsAnOptionalHeader3 := response.GetHeader("x-isAnOptionalHeader3")`,
   734  			`	if hdrXIsAnOptionalHeader3 != "" {`,
   735  			`		valXIsAnOptionalHeader3, err := o.bindHeaderXIsAnOptionalHeader3(hdrXIsAnOptionalHeader3, formats)`,
   736  			`		o.XIsAnOptionalHeader3 = valXIsAnOptionalHeader3`,
   737  			`	if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {`,
   738  			`func (o *GetOptionalOK) bindHeaderXIsAnOptionalHeader0DirtSimpleArray(hdr string, formats strfmt.Registry) ([]int64, error) {`,
   739  			`	xIsAnOptionalHeader0DirtSimpleArrayIV := hdr`,
   740  			`	var (`,
   741  			`		xIsAnOptionalHeader0DirtSimpleArrayIC []int64`,
   742  			`	xIsAnOptionalHeader0DirtSimpleArrayIR := swag.SplitByFormat(xIsAnOptionalHeader0DirtSimpleArrayIV, "")`,
   743  			`	for i, xIsAnOptionalHeader0DirtSimpleArrayIIV := range xIsAnOptionalHeader0DirtSimpleArrayIR {`,
   744  			`		val, err := swag.ConvertInt64(xIsAnOptionalHeader0DirtSimpleArrayIIV)`,
   745  			`			return nil, errors.InvalidType(fmt.Sprintf("%s.%v", "header", i), "headeritems.", "int64", xIsAnOptionalHeader0DirtSimpleArrayIIV)`,
   746  			`		xIsAnOptionalHeader0DirtSimpleArrayIIC := val`,
   747  			`		xIsAnOptionalHeader0DirtSimpleArrayIC = append(xIsAnOptionalHeader0DirtSimpleArrayIC, xIsAnOptionalHeader0DirtSimpleArrayIIC) // roll-up int64 into []int64`,
   748  			`	return xIsAnOptionalHeader0DirtSimpleArrayIC, nil`,
   749  			`func (o *GetOptionalOK) bindHeaderXIsAnOptionalHeader1(hdr string, formats strfmt.Registry) ([]strfmt.DateTime, error) {`,
   750  			`	xIsAnOptionalHeader1IV := hdr`,
   751  			`		xIsAnOptionalHeader1IC []strfmt.DateTime`,
   752  			`	xIsAnOptionalHeader1IR := swag.SplitByFormat(xIsAnOptionalHeader1IV, "tsv")`,
   753  			`	for i, xIsAnOptionalHeader1IIV := range xIsAnOptionalHeader1IR {`,
   754  			`		val, err := formats.Parse("date-time", xIsAnOptionalHeader1IIV)`,
   755  			`			return nil, errors.InvalidType(fmt.Sprintf("%s.%v", "header", i), "headeritems.", "strfmt.DateTime", xIsAnOptionalHeader1IIV)`,
   756  			`		xIsAnOptionalHeader1IIC := val.(strfmt.DateTime)`,
   757  			`		xIsAnOptionalHeader1IC = append(xIsAnOptionalHeader1IC, xIsAnOptionalHeader1IIC) // roll-up strfmt.DateTime into []strfmt.DateTime`,
   758  			`	return xIsAnOptionalHeader1IC, nil`,
   759  			`func (o *GetOptionalOK) bindHeaderXIsAnOptionalHeader2(hdr string, formats strfmt.Registry) ([][]int32, error) {`,
   760  			`	xIsAnOptionalHeader2IV := hdr`,
   761  			`		xIsAnOptionalHeader2IC [][]int32`,
   762  			`	xIsAnOptionalHeader2IR := swag.SplitByFormat(xIsAnOptionalHeader2IV, "")`,
   763  			`	for _, xIsAnOptionalHeader2IIV := range xIsAnOptionalHeader2IR {`,
   764  			`			xIsAnOptionalHeader2IIC []int32`,
   765  			`		xIsAnOptionalHeader2IIR := swag.SplitByFormat(xIsAnOptionalHeader2IIV, "pipes")`,
   766  			`		for ii, xIsAnOptionalHeader2IIIV := range xIsAnOptionalHeader2IIR {`,
   767  			`			val, err := swag.ConvertInt32(xIsAnOptionalHeader2IIIV)`,
   768  			`				return nil, errors.InvalidType(fmt.Sprintf("%s.%v", "header", ii), "headeritems.items.", "int32", xIsAnOptionalHeader2IIIV)`,
   769  			`			xIsAnOptionalHeader2IIIC := val`,
   770  			`			xIsAnOptionalHeader2IIC = append(xIsAnOptionalHeader2IIC, xIsAnOptionalHeader2IIIC) // roll-up int32 into []int32`,
   771  			`		xIsAnOptionalHeader2IC = append(xIsAnOptionalHeader2IC, xIsAnOptionalHeader2IIC) // roll-up []int32 into [][]int32`,
   772  			`	return xIsAnOptionalHeader2IC, nil`,
   773  			`func (o *GetOptionalOK) bindHeaderXIsAnOptionalHeader2NoFormat(hdr string, formats strfmt.Registry) ([][]int64, error) {`,
   774  			`	xIsAnOptionalHeader2NoFormatIV := hdr`,
   775  			`		xIsAnOptionalHeader2NoFormatIC [][]int64`,
   776  			`	xIsAnOptionalHeader2NoFormatIR := swag.SplitByFormat(xIsAnOptionalHeader2NoFormatIV, "pipes")`,
   777  			`	for _, xIsAnOptionalHeader2NoFormatIIV := range xIsAnOptionalHeader2NoFormatIR {`,
   778  			`			xIsAnOptionalHeader2NoFormatIIC []int64`,
   779  			`		xIsAnOptionalHeader2NoFormatIIR := swag.SplitByFormat(xIsAnOptionalHeader2NoFormatIIV, "tsv")`,
   780  			`		for ii, xIsAnOptionalHeader2NoFormatIIIV := range xIsAnOptionalHeader2NoFormatIIR {`,
   781  			`			val, err := swag.ConvertInt64(xIsAnOptionalHeader2NoFormatIIIV)`,
   782  			`				return nil, errors.InvalidType(fmt.Sprintf("%s.%v", "header", ii), "headeritems.items.", "int64", xIsAnOptionalHeader2NoFormatIIIV)`,
   783  			`			xIsAnOptionalHeader2NoFormatIIIC := val`,
   784  			`			xIsAnOptionalHeader2NoFormatIIC = append(xIsAnOptionalHeader2NoFormatIIC, xIsAnOptionalHeader2NoFormatIIIC) // roll-up int64 into []int64`,
   785  			`		xIsAnOptionalHeader2NoFormatIC = append(xIsAnOptionalHeader2NoFormatIC, xIsAnOptionalHeader2NoFormatIIC) // roll-up []int64 into [][]int64`,
   786  			`	return xIsAnOptionalHeader2NoFormatIC, nil`,
   787  			`func (o *GetOptionalOK) bindHeaderXIsAnOptionalHeader3(hdr string, formats strfmt.Registry) ([][][]strfmt.UUID, error) {`,
   788  			`	xIsAnOptionalHeader3IV := hdr`,
   789  			`		xIsAnOptionalHeader3IC [][][]strfmt.UUID`,
   790  			`	xIsAnOptionalHeader3IR := swag.SplitByFormat(xIsAnOptionalHeader3IV, "")`,
   791  			`	for _, xIsAnOptionalHeader3IIV := range xIsAnOptionalHeader3IR {`,
   792  			`			xIsAnOptionalHeader3IIC [][]strfmt.UUID`,
   793  			`		xIsAnOptionalHeader3IIR := swag.SplitByFormat(xIsAnOptionalHeader3IIV, "pipes")`,
   794  			`		for _, xIsAnOptionalHeader3IIIV := range xIsAnOptionalHeader3IIR {`,
   795  			`				xIsAnOptionalHeader3IIIC []strfmt.UUID`,
   796  			`			xIsAnOptionalHeader3IIIR := swag.SplitByFormat(xIsAnOptionalHeader3IIIV, "")`,
   797  			`			for iii, xIsAnOptionalHeader3IIIIV := range xIsAnOptionalHeader3IIIR {`,
   798  			`				val, err := formats.Parse("uuid", xIsAnOptionalHeader3IIIIV)`,
   799  			`					return nil, errors.InvalidType(fmt.Sprintf("%s.%v", "header", iii), "headeritems.items.", "strfmt.UUID", xIsAnOptionalHeader3IIIIV)`,
   800  			`				xIsAnOptionalHeader3IIIIC := val.(strfmt.UUID)`,
   801  			`				xIsAnOptionalHeader3IIIC = append(xIsAnOptionalHeader3IIIC, xIsAnOptionalHeader3IIIIC) // roll-up strfmt.UUID into []strfmt.UUID`,
   802  			`			xIsAnOptionalHeader3IIC = append(xIsAnOptionalHeader3IIC, xIsAnOptionalHeader3IIIC) // roll-up []strfmt.UUID into [][]strfmt.UUID`,
   803  			`		xIsAnOptionalHeader3IC = append(xIsAnOptionalHeader3IC, xIsAnOptionalHeader3IIC) // roll-up [][]strfmt.UUID into [][][]strfmt.UUID`,
   804  			`	return xIsAnOptionalHeader3IC, nil`,
   805  		},
   806  	}
   807  
   808  	for fileToInspect, expectedCode := range fixtureConfig {
   809  		code, err := os.ReadFile(filepath.Join(opts.Target, filepath.FromSlash(fileToInspect)))
   810  		require.NoError(t, err)
   811  
   812  		for line, codeLine := range expectedCode {
   813  			if !assertInCode(t, strings.TrimSpace(codeLine), string(code)) {
   814  				t.Logf("Code expected did not match in codegenfile %s for expected line %d: %q", fileToInspect, line, expectedCode[line])
   815  			}
   816  		}
   817  	}
   818  }
   819  
   820  func TestGenClient_909_6(t *testing.T) {
   821  	t.Parallel()
   822  	defer discardOutput()()
   823  
   824  	opts := testClientGenOpts()
   825  	opts.Spec = filepath.Join("..", "fixtures", "bugs", "909", "fixture-909-6.yaml")
   826  
   827  	cwd, _ := os.Getwd()
   828  	tft, _ := os.MkdirTemp(cwd, "generated")
   829  	opts.Target = tft
   830  
   831  	defer func() {
   832  		_ = os.RemoveAll(tft)
   833  	}()
   834  
   835  	err := GenerateClient("client", []string{}, []string{}, opts)
   836  	require.NoError(t, err)
   837  
   838  	fixtureConfig := map[string][]string{
   839  		"client/operations/get_optional_responses.go": { // generated file
   840  			`func NewGetOptionalOK() *GetOptionalOK {`,
   841  			`	var (`,
   842  			`		xaBoolDefault = bool(true)`,
   843  			`		xaBsonObjectIDDefault = strfmt.ObjectId{}`,
   844  			`		xaByteDefault = strfmt.Base64([]byte(nil))`,
   845  			`		xaCreditCardDefault = strfmt.CreditCard("4111-1111-1111-1111")`,
   846  			`		xaDateDefault = strfmt.Date{}`,
   847  			`		xaDateTimeDefault = strfmt.DateTime{}`,
   848  			`		xaDoubleDefault = float64(99.99)`,
   849  			`		xaDurationDefault = strfmt.Duration(0)`,
   850  			`		xaFloatDefault = float32(99.99)`,
   851  			`		xaHexColorDefault = strfmt.HexColor("#FFFFFF")`,
   852  			`		xaHostnameDefault = strfmt.Hostname("www.example.com")`,
   853  			`		xaInt32Default = int32(-99)`,
   854  			`		xaInt64Default = int64(-99)`,
   855  			`		xaMacDefault = strfmt.MAC("01:02:03:04:05:06")`,
   856  			`		xaPasswordDefault = strfmt.Password("secret")`,
   857  			`		xaRGBColorDefault = strfmt.RGBColor("rgb(255,255,255)")`,
   858  			`		xaSsnDefault = strfmt.SSN("111-11-1111")`,
   859  			`		xaUUIDDefault = strfmt.UUID("a8098c1a-f86e-11da-bd1a-00112444be1e")`,
   860  			`		xaUUID3Default = strfmt.UUID3("bcd02e22-68f0-3046-a512-327cca9def8f")`,
   861  			`		xaUUID4Default = strfmt.UUID4("025b0d74-00a2-4048-bf57-227c5111bb34")`,
   862  			`		xaUUID5Default = strfmt.UUID5("886313e1-3b8a-5372-9b90-0c9aee199e5d")`,
   863  			`		xaUint32Default = uint32(99)`,
   864  			`		xaUint64Default = uint64(99)`,
   865  			`		xaURIDefault = strfmt.URI("http://foo.bar/?baz=qux#quux")`,
   866  			`		xAnEmailDefault = strfmt.Email("fredbi@github.com")`,
   867  			`		xAnISBNDefault = strfmt.ISBN("0321751043")`,
   868  			`		xAnISBN10Default = strfmt.ISBN10("0321751043")`,
   869  			`		xAnISBN13Default = strfmt.ISBN13("978 3401013190")`,
   870  			`		xAnIPV4Default = strfmt.IPv4("192.168.224.1")`,
   871  			`		xAnIPV6Default = strfmt.IPv6("::1")`,
   872  			`	if err := xaBsonObjectIDDefault.UnmarshalText([]byte("507f1f77bcf86cd799439011")); err != nil {`,
   873  			`		msg := fmt.Sprintf("invalid default value for xaBsonObjectID: %v", err)`,
   874  			`	if err := xaByteDefault.UnmarshalText([]byte("ZWxpemFiZXRocG9zZXk=")); err != nil {`,
   875  			`		msg := fmt.Sprintf("invalid default value for xaByte: %v", err)`,
   876  			`	if err := xaDateDefault.UnmarshalText([]byte("1970-01-01")); err != nil {`,
   877  			`		msg := fmt.Sprintf("invalid default value for xaDate: %v", err)`,
   878  			`	if err := xaDateTimeDefault.UnmarshalText([]byte("1970-01-01T11:01:05.283185Z")); err != nil {`,
   879  			`		msg := fmt.Sprintf("invalid default value for xaDateTime: %v", err)`,
   880  			`	if err := xaDurationDefault.UnmarshalText([]byte("1 ms")); err != nil {`,
   881  			`		msg := fmt.Sprintf("invalid default value for xaDuration: %v", err)`,
   882  			`	return &GetOptionalOK{`,
   883  			`		XaBool:         xaBoolDefault,`,
   884  			`		XaBsonObjectID: xaBsonObjectIDDefault,`,
   885  			`		XaByte:         xaByteDefault,`,
   886  			`		XaCreditCard:   xaCreditCardDefault,`,
   887  			`		XaDate:         xaDateDefault,`,
   888  			`		XaDateTime:     xaDateTimeDefault,`,
   889  			`		XaDouble:       xaDoubleDefault,`,
   890  			`		XaDuration:     xaDurationDefault,`,
   891  			`		XaFloat:        xaFloatDefault,`,
   892  			`		XaHexColor:     xaHexColorDefault,`,
   893  			`		XaHostname:     xaHostnameDefault,`,
   894  			`		XaInt32:        xaInt32Default,`,
   895  			`		XaInt64:        xaInt64Default,`,
   896  			`		XaMac:          xaMacDefault,`,
   897  			`		XaPassword:     xaPasswordDefault,`,
   898  			`		XaRGBColor:     xaRGBColorDefault,`,
   899  			`		XaSsn:          xaSsnDefault,`,
   900  			`		XaUUID:         xaUUIDDefault,`,
   901  			`		XaUUID3:        xaUUID3Default,`,
   902  			`		XaUUID4:        xaUUID4Default,`,
   903  			`		XaUUID5:        xaUUID5Default,`,
   904  			`		XaUint32:       xaUint32Default,`,
   905  			`		XaUint64:       xaUint64Default,`,
   906  			`		XaURI:          xaURIDefault,`,
   907  			`		XAnEmail:       xAnEmailDefault,`,
   908  			`		XAnISBN:        xAnISBNDefault,`,
   909  			`		XAnISBN10:      xAnISBN10Default,`,
   910  			`		XAnISBN13:      xAnISBN13Default,`,
   911  			`		XAnIPV4:        xAnIPV4Default,`,
   912  			`		XAnIPV6:        xAnIPV6Default,`,
   913  			`func (o *GetOptionalOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {`,
   914  			`	hdrXaBool := response.GetHeader("X-aBool")`,
   915  			`	if hdrXaBool != "" {`,
   916  			`		valxABool, err := swag.ConvertBool(hdrXaBool)`,
   917  			`		if err != nil {`,
   918  			`			return errors.InvalidType("X-aBool", "header", "bool", hdrXaBool)`,
   919  			`		o.XaBool = valxABool`,
   920  			`	hdrXaBsonObjectID := response.GetHeader("X-aBsonObjectId")`,
   921  			`	if hdrXaBsonObjectID != "" {`,
   922  			`		valxABsonObjectId, err := formats.Parse("bsonobjectid", hdrXaBsonObjectID)`,
   923  			`		if err != nil {`,
   924  			`			return errors.InvalidType("X-aBsonObjectId", "header", "strfmt.ObjectId", hdrXaBsonObjectID)`,
   925  			`		o.XaBsonObjectID = *(valxABsonObjectId.(*strfmt.ObjectId))`,
   926  			`	hdrXaByte := response.GetHeader("X-aByte")`,
   927  			`	if hdrXaByte != "" {`,
   928  			`		valxAByte, err := formats.Parse("byte", hdrXaByte)`,
   929  			`		if err != nil {`,
   930  			`			return errors.InvalidType("X-aByte", "header", "strfmt.Base64", hdrXaByte)`,
   931  			`		o.XaByte = *(valxAByte.(*strfmt.Base64))`,
   932  			`	hdrXaCreditCard := response.GetHeader("X-aCreditCard")`,
   933  			`	if hdrXaCreditCard != "" {`,
   934  			`		valxACreditCard, err := formats.Parse("creditcard", hdrXaCreditCard)`,
   935  			`		if err != nil {`,
   936  			`			return errors.InvalidType("X-aCreditCard", "header", "strfmt.CreditCard", hdrXaCreditCard)`,
   937  			`		o.XaCreditCard = *(valxACreditCard.(*strfmt.CreditCard))`,
   938  			`	hdrXaDate := response.GetHeader("X-aDate")`,
   939  			`	if hdrXaDate != "" {`,
   940  			`		valxADate, err := formats.Parse("date", hdrXaDate)`,
   941  			`		if err != nil {`,
   942  			`			return errors.InvalidType("X-aDate", "header", "strfmt.Date", hdrXaDate)`,
   943  			`		o.XaDate = *(valxADate.(*strfmt.Date))`,
   944  			`	hdrXaDateTime := response.GetHeader("X-aDateTime")`,
   945  			`	if hdrXaDateTime != "" {`,
   946  			`		valxADateTime, err := formats.Parse("date-time", hdrXaDateTime)`,
   947  			`		if err != nil {`,
   948  			`			return errors.InvalidType("X-aDateTime", "header", "strfmt.DateTime", hdrXaDateTime)`,
   949  			`		o.XaDateTime = *(valxADateTime.(*strfmt.DateTime))`,
   950  			`	hdrXaDouble := response.GetHeader("X-aDouble")`,
   951  			`	if hdrXaDouble != "" {`,
   952  			`		valxADouble, err := swag.ConvertFloat64(hdrXaDouble)`,
   953  			`		if err != nil {`,
   954  			`			return errors.InvalidType("X-aDouble", "header", "float64", hdrXaDouble)`,
   955  			`		o.XaDouble = valxADouble`,
   956  			`	hdrXaDuration := response.GetHeader("X-aDuration")`,
   957  			`	if hdrXaDuration != "" {`,
   958  			`		valxADuration, err := formats.Parse("duration", hdrXaDuration)`,
   959  			`		if err != nil {`,
   960  			`			return errors.InvalidType("X-aDuration", "header", "strfmt.Duration", hdrXaDuration)`,
   961  			`		o.XaDuration = *(valxADuration.(*strfmt.Duration))`,
   962  			`	hdrXaFloat := response.GetHeader("X-aFloat")`,
   963  			`	if hdrXaFloat != "" {`,
   964  			`		valxAFloat, err := swag.ConvertFloat32(hdrXaFloat)`,
   965  			`		if err != nil {`,
   966  			`			return errors.InvalidType("X-aFloat", "header", "float32", hdrXaFloat)`,
   967  			`		o.XaFloat = valxAFloat`,
   968  			`	hdrXaHexColor := response.GetHeader("X-aHexColor")`,
   969  			`	if hdrXaHexColor != "" {`,
   970  			`		valxAHexColor, err := formats.Parse("hexcolor", hdrXaHexColor)`,
   971  			`		if err != nil {`,
   972  			`			return errors.InvalidType("X-aHexColor", "header", "strfmt.HexColor", hdrXaHexColor)`,
   973  			`		o.XaHexColor = *(valxAHexColor.(*strfmt.HexColor))`,
   974  			`	hdrXaHostname := response.GetHeader("X-aHostname")`,
   975  			`	if hdrXaHostname != "" {`,
   976  			`		valxAHostname, err := formats.Parse("hostname", hdrXaHostname)`,
   977  			`		if err != nil {`,
   978  			`			return errors.InvalidType("X-aHostname", "header", "strfmt.Hostname", hdrXaHostname)`,
   979  			`		o.XaHostname = *(valxAHostname.(*strfmt.Hostname))`,
   980  			`	hdrXaInt32 := response.GetHeader("X-aInt32")`,
   981  			`	if hdrXaInt32 != "" {`,
   982  			`		valxAInt32, err := swag.ConvertInt32(hdrXaInt32)`,
   983  			`		if err != nil {`,
   984  			`			return errors.InvalidType("X-aInt32", "header", "int32", hdrXaInt32)`,
   985  			`		o.XaInt32 = valxAInt32`,
   986  			`	hdrXaInt64 := response.GetHeader("X-aInt64")`,
   987  			`	if hdrXaInt64 != "" {`,
   988  			`		valxAInt64, err := swag.ConvertInt64(hdrXaInt64)`,
   989  			`		if err != nil {`,
   990  			`			return errors.InvalidType("X-aInt64", "header", "int64", hdrXaInt64)`,
   991  			`		o.XaInt64 = valxAInt64`,
   992  			`	hdrXaMac := response.GetHeader("X-aMac")`,
   993  			`	if hdrXaMac != "" {`,
   994  			`		valxAMac, err := formats.Parse("mac", hdrXaMac)`,
   995  			`		if err != nil {`,
   996  			`			return errors.InvalidType("X-aMac", "header", "strfmt.MAC", hdrXaMac)`,
   997  			`		o.XaMac = *(valxAMac.(*strfmt.MAC))`,
   998  			`	hdrXaPassword := response.GetHeader("X-aPassword")`,
   999  			`	if hdrXaPassword != "" {`,
  1000  			`		valxAPassword, err := formats.Parse("password", hdrXaPassword)`,
  1001  			`		if err != nil {`,
  1002  			`			return errors.InvalidType("X-aPassword", "header", "strfmt.Password", hdrXaPassword)`,
  1003  			`		o.XaPassword = *(valxAPassword.(*strfmt.Password))`,
  1004  			`	hdrXaRGBColor := response.GetHeader("X-aRGBColor")`,
  1005  			`	if hdrXaRGBColor != "" {`,
  1006  			`		valxARGBColor, err := formats.Parse("rgbcolor", hdrXaRGBColor)`,
  1007  			`		if err != nil {`,
  1008  			`			return errors.InvalidType("X-aRGBColor", "header", "strfmt.RGBColor", hdrXaRGBColor)`,
  1009  			`		o.XaRGBColor = *(valxARGBColor.(*strfmt.RGBColor))`,
  1010  			`	hdrXaSsn := response.GetHeader("X-aSsn")`,
  1011  			`	if hdrXaSsn != "" {`,
  1012  			`		valxASsn, err := formats.Parse("ssn", hdrXaSsn)`,
  1013  			`		if err != nil {`,
  1014  			`			return errors.InvalidType("X-aSsn", "header", "strfmt.SSN", hdrXaSsn)`,
  1015  			`		o.XaSsn = *(valxASsn.(*strfmt.SSN))`,
  1016  			`	hdrXaUUID := response.GetHeader("X-aUUID")`,
  1017  			`	if hdrXaUUID != "" {`,
  1018  			`		valxAUuid, err := formats.Parse("uuid", hdrXaUUID)`,
  1019  			`		if err != nil {`,
  1020  			`			return errors.InvalidType("X-aUUID", "header", "strfmt.UUID", hdrXaUUID)`,
  1021  			`		o.XaUUID = *(valxAUuid.(*strfmt.UUID))`,
  1022  			`	hdrXaUUID3 := response.GetHeader("X-aUUID3")`,
  1023  			`	if hdrXaUUID3 != "" {`,
  1024  			`		valxAUuid3, err := formats.Parse("uuid3", hdrXaUUID3)`,
  1025  			`		if err != nil {`,
  1026  			`			return errors.InvalidType("X-aUUID3", "header", "strfmt.UUID3", hdrXaUUID3)`,
  1027  			`		o.XaUUID3 = *(valxAUuid3.(*strfmt.UUID3))`,
  1028  			`	hdrXaUUID4 := response.GetHeader("X-aUUID4")`,
  1029  			`	if hdrXaUUID4 != "" {`,
  1030  			`		valxAUuid4, err := formats.Parse("uuid4", hdrXaUUID4)`,
  1031  			`		if err != nil {`,
  1032  			`			return errors.InvalidType("X-aUUID4", "header", "strfmt.UUID4", hdrXaUUID4)`,
  1033  			`		o.XaUUID4 = *(valxAUuid4.(*strfmt.UUID4))`,
  1034  			`	hdrXaUUID5 := response.GetHeader("X-aUUID5")`,
  1035  			`	if hdrXaUUID5 != "" {`,
  1036  			`		valxAUuid5, err := formats.Parse("uuid5", hdrXaUUID5)`,
  1037  			`		if err != nil {`,
  1038  			`			return errors.InvalidType("X-aUUID5", "header", "strfmt.UUID5", hdrXaUUID5)`,
  1039  			`		o.XaUUID5 = *(valxAUuid5.(*strfmt.UUID5))`,
  1040  			`	hdrXaUint32 := response.GetHeader("X-aUint32")`,
  1041  			`	if hdrXaUint32 != "" {`,
  1042  			`		valxAUint32, err := swag.ConvertUint32(hdrXaUint32)`,
  1043  			`		if err != nil {`,
  1044  			`			return errors.InvalidType("X-aUint32", "header", "uint32", hdrXaUint32)`,
  1045  			`		o.XaUint32 = valxAUint32`,
  1046  			`	hdrXaUint64 := response.GetHeader("X-aUint64")`,
  1047  			`	if hdrXaUint64 != "" {`,
  1048  			`		valxAUint64, err := swag.ConvertUint64(hdrXaUint64)`,
  1049  			`		if err != nil {`,
  1050  			`			return errors.InvalidType("X-aUint64", "header", "uint64", hdrXaUint64)`,
  1051  			`		o.XaUint64 = valxAUint64`,
  1052  			`	hdrXaURI := response.GetHeader("X-aUri")`,
  1053  			`	if hdrXaURI != "" {`,
  1054  			`		valxAUri, err := formats.Parse("uri", hdrXaURI)`,
  1055  			`		if err != nil {`,
  1056  			`			return errors.InvalidType("X-aUri", "header", "strfmt.URI", hdrXaURI)`,
  1057  			`		o.XaURI = *(valxAUri.(*strfmt.URI))`,
  1058  			`	hdrXAnEmail := response.GetHeader("X-anEmail")`,
  1059  			`	if hdrXAnEmail != "" {`,
  1060  			`		valxAnEmail, err := formats.Parse("email", hdrXAnEmail)`,
  1061  			`		if err != nil {`,
  1062  			`			return errors.InvalidType("X-anEmail", "header", "strfmt.Email", hdrXAnEmail)`,
  1063  			`		o.XAnEmail = *(valxAnEmail.(*strfmt.Email))`,
  1064  			`	hdrXAnISBN := response.GetHeader("X-anISBN")`,
  1065  			`	if hdrXAnISBN != "" {`,
  1066  			`		valxAnISBN, err := formats.Parse("isbn", hdrXAnISBN)`,
  1067  			`		if err != nil {`,
  1068  			`			return errors.InvalidType("X-anISBN", "header", "strfmt.ISBN", hdrXAnISBN)`,
  1069  			`		o.XAnISBN = *(valxAnISBN.(*strfmt.ISBN))`,
  1070  			`	hdrXAnISBN10 := response.GetHeader("X-anISBN10")`,
  1071  			`	if hdrXAnISBN10 != "" {`,
  1072  			`		valxAnISBN10, err := formats.Parse("isbn10", hdrXAnISBN10)`,
  1073  			`		if err != nil {`,
  1074  			`			return errors.InvalidType("X-anISBN10", "header", "strfmt.ISBN10", hdrXAnISBN10)`,
  1075  			`		o.XAnISBN10 = *(valxAnISBN10.(*strfmt.ISBN10))`,
  1076  			`	hdrXAnISBN13 := response.GetHeader("X-anISBN13")`,
  1077  			`	if hdrXAnISBN13 != "" {`,
  1078  			`		valxAnISBN13, err := formats.Parse("isbn13", hdrXAnISBN13)`,
  1079  			`		if err != nil {`,
  1080  			`			return errors.InvalidType("X-anISBN13", "header", "strfmt.ISBN13", hdrXAnISBN13)`,
  1081  			`		o.XAnISBN13 = *(valxAnISBN13.(*strfmt.ISBN13))`,
  1082  			`	hdrXAnIPV4 := response.GetHeader("X-anIpv4")`,
  1083  			`	if hdrXAnIPV4 != "" {`,
  1084  			`		valxAnIpv4, err := formats.Parse("ipv4", hdrXAnIPV4)`,
  1085  			`		if err != nil {`,
  1086  			`			return errors.InvalidType("X-anIpv4", "header", "strfmt.IPv4", hdrXAnIPV4)`,
  1087  			`		o.XAnIPV4 = *(valxAnIpv4.(*strfmt.IPv4))`,
  1088  			`	hdrXAnIPV6 := response.GetHeader("X-anIpv6")`,
  1089  			`	if hdrXAnIPV6 != "" {`,
  1090  			`		valxAnIpv6, err := formats.Parse("ipv6", hdrXAnIPV6)`,
  1091  			`		if err != nil {`,
  1092  			`			return errors.InvalidType("X-anIpv6", "header", "strfmt.IPv6", hdrXAnIPV6)`,
  1093  			`		o.XAnIPV6 = *(valxAnIpv6.(*strfmt.IPv6))`,
  1094  		},
  1095  	}
  1096  
  1097  	for fileToInspect, expectedCode := range fixtureConfig {
  1098  		code, err := os.ReadFile(filepath.Join(opts.Target, filepath.FromSlash(fileToInspect)))
  1099  		require.NoError(t, err)
  1100  
  1101  		for line, codeLine := range expectedCode {
  1102  			if !assertInCode(t, strings.TrimSpace(codeLine), string(code)) {
  1103  				t.Logf("Code expected did not match in codegenfile %s for expected line %d: %q", fileToInspect, line, expectedCode[line])
  1104  			}
  1105  		}
  1106  	}
  1107  }