github.com/AngusLu/go-swagger@v0.28.0/generator/urlbuilder_test.go (about)

     1  package generator
     2  
     3  import (
     4  	"bytes"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func TestURLBuilder_SimplePathParams(t *testing.T) {
    12  	gen, err := opBuilder("simplePathParams", "../fixtures/codegen/todolist.url.simple.yml")
    13  	require.NoError(t, err)
    14  
    15  	op, err := gen.MakeOperation()
    16  	require.NoError(t, err)
    17  
    18  	buf := bytes.NewBuffer(nil)
    19  	opts := opts()
    20  	err = templates.MustGet("serverUrlbuilder").Execute(buf, op)
    21  	require.NoError(t, err)
    22  
    23  	ff, err := opts.LanguageOpts.FormatContent("simple_path_params.go", buf.Bytes())
    24  	require.NoErrorf(t, err, buf.String())
    25  
    26  	res := string(ff)
    27  	assertInCode(t, "var _path = \"/singleValuePath/{siString}/{siInt}/{siInt32}/{siInt64}/{siFloat}/{siFloat32}/{siFloat64}/{siBool}\"", res)
    28  	assertInCode(t, "siBool := swag.FormatBool(o.SiBool)", res)
    29  	assertInCode(t, `if siBool != ""`, res)
    30  	assertInCode(t, `_path = strings.Replace(_path, "{siBool}", siBool, -1)`, res)
    31  	assertInCode(t, `return nil, errors.New("siBool is required on SimplePathParamsURL")`, res)
    32  	assertInCode(t, `siFloat := swag.FormatFloat64(o.SiFloat)`, res)
    33  	assertInCode(t, `if siFloat != ""`, res)
    34  	assertInCode(t, `_path = strings.Replace(_path, "{siFloat}", siFloat, -1)`, res)
    35  	assertInCode(t, `siFloat32 := swag.FormatFloat32(o.SiFloat32)`, res)
    36  	assertInCode(t, `if siFloat32 != "" `, res)
    37  	assertInCode(t, `_path = strings.Replace(_path, "{siFloat32}", siFloat32, -1)`, res)
    38  	assertInCode(t, `return nil, errors.New("siFloat32 is required on SimplePathParamsURL")`, res)
    39  	assertInCode(t, `siFloat64 := swag.FormatFloat64(o.SiFloat64)`, res)
    40  	assertInCode(t, `if siFloat64 != ""`, res)
    41  	assertInCode(t, `_path = strings.Replace(_path, "{siFloat64}", siFloat64, -1)`, res)
    42  	assertInCode(t, `return nil, errors.New("siFloat64 is required on SimplePathParamsURL")`, res)
    43  	assertInCode(t, `siInt := swag.FormatInt64(o.SiInt)`, res)
    44  	assertInCode(t, `if siInt != ""`, res)
    45  	assertInCode(t, `_path = strings.Replace(_path, "{siInt}", siInt, -1)`, res)
    46  	assertInCode(t, `return nil, errors.New("siInt is required on SimplePathParamsURL")`, res)
    47  	assertInCode(t, `siInt32 := swag.FormatInt32(o.SiInt32)`, res)
    48  	assertInCode(t, `if siInt32 != ""`, res)
    49  	assertInCode(t, `_path = strings.Replace(_path, "{siInt32}", siInt32, -1)`, res)
    50  	assertInCode(t, `return nil, errors.New("siInt32 is required on SimplePathParamsURL")`, res)
    51  	assertInCode(t, `siInt64 := swag.FormatInt64(o.SiInt64)`, res)
    52  	assertInCode(t, `if siInt64 != ""`, res)
    53  	assertInCode(t, `_path = strings.Replace(_path, "{siInt64}", siInt64, -1)`, res)
    54  	assertInCode(t, `return nil, errors.New("siInt64 is required on SimplePathParamsURL")`, res)
    55  	assertInCode(t, `siString := o.SiString`, res)
    56  	assertInCode(t, `if siString != ""`, res)
    57  	assertInCode(t, `_path = strings.Replace(_path, "{siString}", siString, -1)`, res)
    58  	assertInCode(t, `return nil, errors.New("siString is required on SimplePathParamsURL")`, res)
    59  	assertInCode(t, `result.Path = golangswaggerpaths.Join(_basePath, _path)`, res)
    60  	assertNotInCode(t, `result.RawQuery = qs.Encode()`, res)
    61  }
    62  
    63  func TestURLBuilder_SimpleQueryParams(t *testing.T) {
    64  	gen, err := opBuilder("simpleQueryParams", "../fixtures/codegen/todolist.url.simple.yml")
    65  	require.NoError(t, err)
    66  
    67  	op, err := gen.MakeOperation()
    68  	require.NoError(t, err)
    69  
    70  	buf := bytes.NewBuffer(nil)
    71  	opts := opts()
    72  	err = templates.MustGet("serverUrlbuilder").Execute(buf, op)
    73  	require.NoError(t, err)
    74  
    75  	ff, err := opts.LanguageOpts.FormatContent("simple_query_params.go", buf.Bytes())
    76  	require.NoErrorf(t, err, buf.String())
    77  
    78  	res := string(ff)
    79  	assertInCode(t, "var _path = \"/singleValueQuery/{id}\"", res)
    80  	assertInCode(t, `id := swag.FormatInt32(o.ID)`, res)
    81  	assertInCode(t, `if id != ""`, res)
    82  	assertInCode(t, `_path = strings.Replace(_path, "{id}", id, -1)`, res)
    83  	assertInCode(t, `return nil, errors.New("id is required on SimpleQueryParamsURL")`, res)
    84  	assertInCode(t, `result.Path = golangswaggerpaths.Join(_basePath, _path)`, res)
    85  	assertInCode(t, `qs := make(url.Values)`, res)
    86  	assertInCode(t, `siBoolQ := swag.FormatBool(o.SiBool)`, res)
    87  	assertInCode(t, `if siBoolQ != ""`, res)
    88  	assertInCode(t, `qs.Set("siBool", siBoolQ)`, res)
    89  	assertInCode(t, `var siFloatQ string`, res)
    90  	assertInCode(t, `if o.SiFloat != nil`, res)
    91  	assertInCode(t, `siFloatQ = swag.FormatFloat64(*o.SiFloat)`, res)
    92  	assertInCode(t, `if siFloatQ != ""`, res)
    93  	assertInCode(t, `qs.Set("siFloat", siFloatQ)`, res)
    94  	assertInCode(t, `var siFloat32Q string`, res)
    95  	assertInCode(t, `if o.SiFloat32 != nil {`, res)
    96  	assertInCode(t, `siFloat32Q = swag.FormatFloat32(*o.SiFloat32)`, res)
    97  	assertInCode(t, `if siFloat32Q != ""`, res)
    98  	assertInCode(t, `qs.Set("siFloat32", siFloat32Q)`, res)
    99  	assertInCode(t, `siFloat64Q := swag.FormatFloat64(o.SiFloat64)`, res)
   100  	assertInCode(t, `if siFloat64Q != ""`, res)
   101  	assertInCode(t, `qs.Set("siFloat64", siFloat64Q)`, res)
   102  	assertInCode(t, `var siIntQ string`, res)
   103  	assertInCode(t, `if o.SiInt != nil`, res)
   104  	assertInCode(t, `siIntQ = swag.FormatInt64(*o.SiInt)`, res)
   105  	assertInCode(t, `if siIntQ != ""`, res)
   106  	assertInCode(t, `qs.Set("siInt", siIntQ)`, res)
   107  	assertInCode(t, `var siInt32Q string`, res)
   108  	assertInCode(t, `if o.SiInt32 != nil`, res)
   109  	assertInCode(t, `siInt32Q = swag.FormatInt32(*o.SiInt32)`, res)
   110  	assertInCode(t, `if siInt32Q != ""`, res)
   111  	assertInCode(t, `qs.Set("siInt32", siInt32Q)`, res)
   112  	assertInCode(t, `siInt64Q := swag.FormatInt64(o.SiInt64)`, res)
   113  	assertInCode(t, `if siInt64Q != ""`, res)
   114  	assertInCode(t, `qs.Set("siInt64", siInt64Q)`, res)
   115  	assertInCode(t, `siStringQ := o.SiString`, res)
   116  	assertInCode(t, `if siStringQ != ""`, res)
   117  	assertInCode(t, `qs.Set("siString", siStringQ)`, res)
   118  	assertInCode(t, `result.RawQuery = qs.Encode()`, res)
   119  }
   120  
   121  func TestURLBuilder_ArrayQueryParams(t *testing.T) {
   122  	testArrayQueryParams(t, "../fixtures/codegen/todolist.url.simple.yml", "")
   123  }
   124  
   125  func TestURLBuilder_ArrayQueryParams_BasePath(t *testing.T) {
   126  	testArrayQueryParams(t, "../fixtures/codegen/todolist.url.basepath.yml", "/v1/api")
   127  }
   128  
   129  func testArrayQueryParams(t testing.TB, filePath, basePath string) {
   130  	gen, err := opBuilder("arrayQueryParams", filePath)
   131  	require.NoError(t, err)
   132  
   133  	op, err := gen.MakeOperation()
   134  	require.NoError(t, err)
   135  
   136  	buf := bytes.NewBuffer(nil)
   137  	opts := opts()
   138  	err = templates.MustGet("serverUrlbuilder").Execute(buf, op)
   139  	require.NoError(t, err)
   140  
   141  	ff, err := opts.LanguageOpts.FormatContent("array_query_params.go", buf.Bytes())
   142  	require.NoErrorf(t, err, buf.String())
   143  
   144  	res := string(ff)
   145  
   146  	assertInCode(t, "var _path = \"/arrayValueQuery/{id}\"", res)
   147  	assertInCode(t, `id := swag.FormatInt32(o.ID)`, res)
   148  	assertInCode(t, `if id != ""`, res)
   149  	assertInCode(t, `_path = strings.Replace(_path, "{id}", id, -1)`, res)
   150  	assertInCode(t, `return nil, errors.New("id is required on ArrayQueryParamsURL")`, res)
   151  	assertInCode(t, "_basePath := o._basePath", res)
   152  
   153  	if basePath != "" {
   154  		assertInCode(t, `if _basePath == ""`, res)
   155  		assertInCode(t, `_basePath = "`+basePath+`"`, res)
   156  	} else {
   157  		assertNotInCode(t, `_basePath = "`+basePath+`"`, res)
   158  	}
   159  
   160  	assertInCode(t, `result.Path = golangswaggerpaths.Join(_basePath, _path)`, res)
   161  	assertInCode(t, `qs := make(url.Values)`, res)
   162  
   163  	assertInCode(t, `var siBoolIR []string`, res)
   164  	assertInCode(t, `for _, siBoolI := range o.SiBool {`, res)
   165  	assertInCode(t, `siBoolIS := swag.FormatBool(siBoolI)`, res)
   166  	assertInCode(t, `if siBoolIS != ""`, res)
   167  	assertInCode(t, `siBoolIR = append(siBoolIR, siBoolIS)`, res)
   168  	assertInCode(t, `siBool := swag.JoinByFormat(siBoolIR, "ssv")`, res)
   169  	assertInCode(t, `if len(siBool) > 0`, res)
   170  	assertInCode(t, `qsv := siBool[0]`, res)
   171  	assertInCode(t, `qs.Set("siBool", qsv)`, res)
   172  
   173  	assertInCode(t, `var siFloatIR []string`, res)
   174  	assertInCode(t, `for _, siFloatI := range o.SiFloat {`, res)
   175  	assertInCode(t, `siFloatIS := swag.FormatFloat64(siFloatI)`, res)
   176  	assertInCode(t, `if siFloatIS != ""`, res)
   177  	assertInCode(t, `siFloatIR = append(siFloatIR, siFloatIS)`, res)
   178  	assertInCode(t, `siFloat := swag.JoinByFormat(siFloatIR, "multi")`, res)
   179  	assertInCode(t, `for _, qsv := range siFloat`, res)
   180  	assertInCode(t, `qs.Add("siFloat", qsv)`, res)
   181  
   182  	assertInCode(t, `var siFloat32IR []string`, res)
   183  	assertInCode(t, `for _, siFloat32I := range o.SiFloat32 {`, res)
   184  	assertInCode(t, `siFloat32IS := swag.FormatFloat32(siFloat32I)`, res)
   185  	assertInCode(t, `if siFloat32IS != ""`, res)
   186  	assertInCode(t, `siFloat32IR = append(siFloat32IR, siFloat32IS)`, res)
   187  	assertInCode(t, `siFloat32 := swag.JoinByFormat(siFloat32IR, "")`, res)
   188  	assertInCode(t, `if len(siFloat32) > 0`, res)
   189  	assertInCode(t, `qsv := siFloat32[0]`, res)
   190  	assertInCode(t, `qs.Set("siFloat32", qsv)`, res)
   191  
   192  	assertInCode(t, `var siFloat64IR []string`, res)
   193  	assertInCode(t, `for _, siFloat64I := range o.SiFloat64 {`, res)
   194  	assertInCode(t, `siFloat64IS := swag.FormatFloat64(siFloat64I)`, res)
   195  	assertInCode(t, `if siFloat64IS != ""`, res)
   196  	assertInCode(t, `siFloat64IR = append(siFloat64IR, siFloat64IS)`, res)
   197  	assertInCode(t, `siFloat64 := swag.JoinByFormat(siFloat64IR, "pipes")`, res)
   198  	assertInCode(t, `if len(siFloat64) > 0`, res)
   199  	assertInCode(t, `qsv := siFloat64[0]`, res)
   200  	assertInCode(t, `qs.Set("siFloat64", qsv)`, res)
   201  
   202  	assertInCode(t, `var siIntIR []string`, res)
   203  	assertInCode(t, `for _, siIntI := range o.SiInt {`, res)
   204  	assertInCode(t, `siIntIS := swag.FormatInt64(siIntI)`, res)
   205  	assertInCode(t, `if siIntIS != ""`, res)
   206  	assertInCode(t, `siIntIR = append(siIntIR, siIntIS)`, res)
   207  	assertInCode(t, `siInt := swag.JoinByFormat(siIntIR, "pipes")`, res)
   208  	assertInCode(t, `if len(siInt) > 0`, res)
   209  	assertInCode(t, `qsv := siInt[0]`, res)
   210  	assertInCode(t, `qs.Set("siInt", qsv)`, res)
   211  
   212  	assertInCode(t, `var siInt32IR []string`, res)
   213  	assertInCode(t, `for _, siInt32I := range o.SiInt32 {`, res)
   214  	assertInCode(t, `siInt32IS := swag.FormatInt32(siInt32I)`, res)
   215  	assertInCode(t, `if siInt32IS != ""`, res)
   216  	assertInCode(t, `siInt32IR = append(siInt32IR, siInt32IS)`, res)
   217  	assertInCode(t, `siInt32 := swag.JoinByFormat(siInt32IR, "tsv")`, res)
   218  	assertInCode(t, `if len(siInt32) > 0`, res)
   219  	assertInCode(t, `qsv := siInt32[0]`, res)
   220  	assertInCode(t, `qs.Set("siInt32", qsv)`, res)
   221  
   222  	assertInCode(t, `var siInt64IR []string`, res)
   223  	assertInCode(t, `for _, siInt64I := range o.SiInt64 {`, res)
   224  	assertInCode(t, `siInt64IS := swag.FormatInt64(siInt64I)`, res)
   225  	assertInCode(t, `if siInt64IS != ""`, res)
   226  	assertInCode(t, `siInt64IR = append(siInt64IR, siInt64IS)`, res)
   227  	assertInCode(t, `siInt64 := swag.JoinByFormat(siInt64IR, "ssv")`, res)
   228  	assertInCode(t, `if len(siInt64) > 0`, res)
   229  	assertInCode(t, `qsv := siInt64[0]`, res)
   230  	assertInCode(t, `qs.Set("siInt64", qsv)`, res)
   231  
   232  	assertInCode(t, `var siStringIR []string`, res)
   233  	assertInCode(t, `for _, siStringI := range o.SiString {`, res)
   234  	assertInCode(t, `siStringIS := siStringI`, res)
   235  	assertInCode(t, `if siStringIS != ""`, res)
   236  	assertInCode(t, `siStringIR = append(siStringIR, siStringIS)`, res)
   237  	assertInCode(t, `siString := swag.JoinByFormat(siStringIR, "csv")`, res)
   238  	assertInCode(t, `if len(siString) > 0`, res)
   239  	assertInCode(t, `qsv := siString[0]`, res)
   240  	assertInCode(t, `qs.Set("siString", qsv)`, res)
   241  
   242  	assertInCode(t, `var siNestedIR []string`, res)
   243  	assertInCode(t, `for _, siNestedI := range o.SiNested`, res)
   244  	assertInCode(t, `var siNestedIIR []string`, res)
   245  	assertInCode(t, `for _, siNestedII := range siNestedI`, res)
   246  	assertInCode(t, `var siNestedIIIR []string`, res)
   247  	assertInCode(t, `for _, siNestedIII := range siNestedII`, res)
   248  	assertInCode(t, `siNestedIIIS := siNestedIII`, res)
   249  	assertInCode(t, `if siNestedIIIS != ""`, res)
   250  	assertInCode(t, `siNestedIIIR = append(siNestedIIIR, siNestedIIIS)`, res)
   251  	assertInCode(t, `siNestedIIS := swag.JoinByFormat(siNestedIIIR, "csv")`, res)
   252  	assertInCode(t, `if len(siNestedIIS) > 0`, res)
   253  	assertInCode(t, `siNestedIISs := siNestedIIS[0]`, res)
   254  	assertInCode(t, `if siNestedIISs != ""`, res)
   255  	assertInCode(t, `siNestedIIR = append(siNestedIIR, siNestedIISs)`, res)
   256  	assertInCode(t, `siNestedIS := swag.JoinByFormat(siNestedIIR, "pipes")`, res)
   257  	assertInCode(t, `if len(siNestedIS) > 0`, res)
   258  	assertInCode(t, `siNestedISs := siNestedIS[0]`, res)
   259  	assertInCode(t, `if siNestedISs != ""`, res)
   260  	assertInCode(t, `siNestedIR = append(siNestedIR, siNestedISs)`, res)
   261  	assertInCode(t, `siNested := swag.JoinByFormat(siNestedIR, "multi")`, res)
   262  	assertInCode(t, `for _, qsv := range siNested`, res)
   263  	assertInCode(t, `qs.Add("siNested", qsv)`, res)
   264  
   265  	assertInCode(t, `result.RawQuery = qs.Encode()`, res)
   266  }
   267  
   268  func TestURLBuilder_Issue2167(t *testing.T) {
   269  	gen, err := opBuilder("xGoNameInParams", "../fixtures/enhancements/2167/swagger.yml")
   270  	require.NoError(t, err)
   271  
   272  	op, err := gen.MakeOperation()
   273  	require.NoError(t, err)
   274  
   275  	buf := bytes.NewBuffer(nil)
   276  	opts := opts()
   277  	err = templates.MustGet("serverUrlbuilder").Execute(buf, op)
   278  	require.NoError(t, err)
   279  
   280  	ff, err := opts.LanguageOpts.FormatContent("get_test_test_name_urlbuilder.go", buf.Bytes())
   281  	require.NoErrorf(t, err, buf.String())
   282  
   283  	res := string(ff)
   284  	assertRegexpInCode(t, `(?m)^\tMyPathName\s+string$`, res)
   285  	assertRegexpInCode(t, `(?m)^\tTestRegion\s+string$`, res)
   286  	assertRegexpInCode(t, `(?m)^\tMyQueryCount\s+\*int64$`, res)
   287  	assertRegexpInCode(t, `(?m)^\tTestLimit\s+\*int64$`, res)
   288  }
   289  
   290  func TestURLBuilder_Issue2167_Error(t *testing.T) {
   291  	gen, err := opBuilder("xGoNameInParams", "../fixtures/enhancements/2167/swagger-error.yml")
   292  	require.NoError(t, err)
   293  
   294  	_, err = gen.MakeOperation()
   295  	require.Error(t, err)
   296  	assert.Contains(t, `GET /test/{test_name}, parameter "test_name": "x-go-name" field must be a string, not a []interface {}`, err.Error())
   297  }