[Go] Fix deepObject serialization that are anyOf (#19090)

* [Go] Fix deepObject serialization that are anyOf

Updates the go client generator to have the generated struct for anyOf types conform to `MappedNullable` interface.
Fixes query params serialization for deepObjects that are of `anyOf` type.

Implements the suggestion in https://github.com/OpenAPITools/openapi-generator/issues/19085

* check parameter style for deepObject serialization

* generate samples for go-echo-external-refs-test

* move test back to http port

* restrict to anyof models with discriminator

* update test

* add some tests

added some tests to `modules/openapi-generator/src/test/resources/3_0/go/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml` and regenerated the samples
This commit is contained in:
Tanmay Mohapatra
2024-08-04 15:13:09 +05:30
committed by GitHub
parent e0f12e9bf4
commit 4c163fe4b0
45 changed files with 1500 additions and 233 deletions

View File

@@ -104,13 +104,13 @@ func (a *FormAPIService) TestFormIntegerBooleanStringExecute(r ApiTestFormIntege
localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
}
if r.integerForm != nil {
parameterAddToHeaderOrQuery(localVarFormParams, "integer_form", r.integerForm, "")
parameterAddToHeaderOrQuery(localVarFormParams, "integer_form", r.integerForm, "", "")
}
if r.booleanForm != nil {
parameterAddToHeaderOrQuery(localVarFormParams, "boolean_form", r.booleanForm, "")
parameterAddToHeaderOrQuery(localVarFormParams, "boolean_form", r.booleanForm, "", "")
}
if r.stringForm != nil {
parameterAddToHeaderOrQuery(localVarFormParams, "string_form", r.stringForm, "")
parameterAddToHeaderOrQuery(localVarFormParams, "string_form", r.stringForm, "", "")
}
req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles)
if err != nil {
@@ -220,7 +220,7 @@ func (a *FormAPIService) TestFormObjectMultipartExecute(r ApiTestFormObjectMulti
if localVarHTTPHeaderAccept != "" {
localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
}
parameterAddToHeaderOrQuery(localVarFormParams, "marker", r.marker, "")
parameterAddToHeaderOrQuery(localVarFormParams, "marker", r.marker, "", "")
req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles)
if err != nil {
return localVarReturnValue, nil, err
@@ -357,22 +357,22 @@ func (a *FormAPIService) TestFormOneofExecute(r ApiTestFormOneofRequest) (string
localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
}
if r.form1 != nil {
parameterAddToHeaderOrQuery(localVarFormParams, "form1", r.form1, "")
parameterAddToHeaderOrQuery(localVarFormParams, "form1", r.form1, "", "")
}
if r.form2 != nil {
parameterAddToHeaderOrQuery(localVarFormParams, "form2", r.form2, "")
parameterAddToHeaderOrQuery(localVarFormParams, "form2", r.form2, "", "")
}
if r.form3 != nil {
parameterAddToHeaderOrQuery(localVarFormParams, "form3", r.form3, "")
parameterAddToHeaderOrQuery(localVarFormParams, "form3", r.form3, "", "")
}
if r.form4 != nil {
parameterAddToHeaderOrQuery(localVarFormParams, "form4", r.form4, "")
parameterAddToHeaderOrQuery(localVarFormParams, "form4", r.form4, "", "")
}
if r.id != nil {
parameterAddToHeaderOrQuery(localVarFormParams, "id", r.id, "")
parameterAddToHeaderOrQuery(localVarFormParams, "id", r.id, "", "")
}
if r.name != nil {
parameterAddToHeaderOrQuery(localVarFormParams, "name", r.name, "")
parameterAddToHeaderOrQuery(localVarFormParams, "name", r.name, "", "")
}
req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles)
if err != nil {

View File

@@ -116,19 +116,19 @@ func (a *HeaderAPIService) TestHeaderIntegerBooleanStringEnumsExecute(r ApiTestH
localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
}
if r.integerHeader != nil {
parameterAddToHeaderOrQuery(localVarHeaderParams, "integer_header", r.integerHeader, "")
parameterAddToHeaderOrQuery(localVarHeaderParams, "integer_header", r.integerHeader, "form", "")
}
if r.booleanHeader != nil {
parameterAddToHeaderOrQuery(localVarHeaderParams, "boolean_header", r.booleanHeader, "")
parameterAddToHeaderOrQuery(localVarHeaderParams, "boolean_header", r.booleanHeader, "form", "")
}
if r.stringHeader != nil {
parameterAddToHeaderOrQuery(localVarHeaderParams, "string_header", r.stringHeader, "")
parameterAddToHeaderOrQuery(localVarHeaderParams, "string_header", r.stringHeader, "form", "")
}
if r.enumNonrefStringHeader != nil {
parameterAddToHeaderOrQuery(localVarHeaderParams, "enum_nonref_string_header", r.enumNonrefStringHeader, "")
parameterAddToHeaderOrQuery(localVarHeaderParams, "enum_nonref_string_header", r.enumNonrefStringHeader, "form", "")
}
if r.enumRefStringHeader != nil {
parameterAddToHeaderOrQuery(localVarHeaderParams, "enum_ref_string_header", r.enumRefStringHeader, "")
parameterAddToHeaderOrQuery(localVarHeaderParams, "enum_ref_string_header", r.enumRefStringHeader, "form", "")
}
req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles)
if err != nil {

View File

@@ -82,10 +82,10 @@ func (a *QueryAPIService) TestEnumRefStringExecute(r ApiTestEnumRefStringRequest
localVarFormParams := url.Values{}
if r.enumNonrefStringQuery != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "enum_nonref_string_query", r.enumNonrefStringQuery, "")
parameterAddToHeaderOrQuery(localVarQueryParams, "enum_nonref_string_query", r.enumNonrefStringQuery, "form", "")
}
if r.enumRefStringQuery != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "enum_ref_string_query", r.enumRefStringQuery, "")
parameterAddToHeaderOrQuery(localVarQueryParams, "enum_ref_string_query", r.enumRefStringQuery, "form", "")
}
// to determine the Content-Type header
localVarHTTPContentTypes := []string{}
@@ -205,13 +205,13 @@ func (a *QueryAPIService) TestQueryDatetimeDateStringExecute(r ApiTestQueryDatet
localVarFormParams := url.Values{}
if r.datetimeQuery != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "datetime_query", r.datetimeQuery, "")
parameterAddToHeaderOrQuery(localVarQueryParams, "datetime_query", r.datetimeQuery, "form", "")
}
if r.dateQuery != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "date_query", r.dateQuery, "")
parameterAddToHeaderOrQuery(localVarQueryParams, "date_query", r.dateQuery, "form", "")
}
if r.stringQuery != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "string_query", r.stringQuery, "")
parameterAddToHeaderOrQuery(localVarQueryParams, "string_query", r.stringQuery, "form", "")
}
// to determine the Content-Type header
localVarHTTPContentTypes := []string{}
@@ -331,13 +331,13 @@ func (a *QueryAPIService) TestQueryIntegerBooleanStringExecute(r ApiTestQueryInt
localVarFormParams := url.Values{}
if r.integerQuery != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "integer_query", r.integerQuery, "")
parameterAddToHeaderOrQuery(localVarQueryParams, "integer_query", r.integerQuery, "form", "")
}
if r.booleanQuery != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "boolean_query", r.booleanQuery, "")
parameterAddToHeaderOrQuery(localVarQueryParams, "boolean_query", r.booleanQuery, "form", "")
}
if r.stringQuery != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "string_query", r.stringQuery, "")
parameterAddToHeaderOrQuery(localVarQueryParams, "string_query", r.stringQuery, "form", "")
}
// to determine the Content-Type header
localVarHTTPContentTypes := []string{}
@@ -445,7 +445,7 @@ func (a *QueryAPIService) TestQueryStyleDeepObjectExplodeTrueObjectExecute(r Api
localVarFormParams := url.Values{}
if r.queryObject != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "")
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "deepObject", "")
}
// to determine the Content-Type header
localVarHTTPContentTypes := []string{}
@@ -553,7 +553,7 @@ func (a *QueryAPIService) TestQueryStyleDeepObjectExplodeTrueObjectAllOfExecute(
localVarFormParams := url.Values{}
if r.queryObject != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "")
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "deepObject", "")
}
// to determine the Content-Type header
localVarHTTPContentTypes := []string{}
@@ -661,7 +661,7 @@ func (a *QueryAPIService) TestQueryStyleFormExplodeFalseArrayIntegerExecute(r Ap
localVarFormParams := url.Values{}
if r.queryObject != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "csv")
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "form", "csv")
}
// to determine the Content-Type header
localVarHTTPContentTypes := []string{}
@@ -769,7 +769,7 @@ func (a *QueryAPIService) TestQueryStyleFormExplodeFalseArrayStringExecute(r Api
localVarFormParams := url.Values{}
if r.queryObject != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "csv")
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "form", "csv")
}
// to determine the Content-Type header
localVarHTTPContentTypes := []string{}
@@ -877,7 +877,7 @@ func (a *QueryAPIService) TestQueryStyleFormExplodeTrueArrayStringExecute(r ApiT
localVarFormParams := url.Values{}
if r.queryObject != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "")
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "form", "")
}
// to determine the Content-Type header
localVarHTTPContentTypes := []string{}
@@ -985,7 +985,7 @@ func (a *QueryAPIService) TestQueryStyleFormExplodeTrueObjectExecute(r ApiTestQu
localVarFormParams := url.Values{}
if r.queryObject != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "")
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "form", "")
}
// to determine the Content-Type header
localVarHTTPContentTypes := []string{}
@@ -1093,7 +1093,7 @@ func (a *QueryAPIService) TestQueryStyleFormExplodeTrueObjectAllOfExecute(r ApiT
localVarFormParams := url.Values{}
if r.queryObject != nil {
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "")
parameterAddToHeaderOrQuery(localVarQueryParams, "query_object", r.queryObject, "form", "")
}
// to determine the Content-Type header
localVarHTTPContentTypes := []string{}

View File

@@ -158,7 +158,7 @@ func parameterValueToString( obj interface{}, key string ) string {
// parameterAddToHeaderOrQuery adds the provided object to the request header or url query
// supporting deep object syntax
func parameterAddToHeaderOrQuery(headerOrQueryParams interface{}, keyPrefix string, obj interface{}, collectionType string) {
func parameterAddToHeaderOrQuery(headerOrQueryParams interface{}, keyPrefix string, obj interface{}, style string, collectionType string) {
var v = reflect.ValueOf(obj)
var value = ""
if v == reflect.ValueOf(nil) {
@@ -174,11 +174,11 @@ func parameterAddToHeaderOrQuery(headerOrQueryParams interface{}, keyPrefix stri
if err != nil {
return
}
parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefix, dataMap, collectionType)
parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefix, dataMap, style, collectionType)
return
}
if t, ok := obj.(time.Time); ok {
parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefix, t.Format(time.RFC3339Nano), collectionType)
parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefix, t.Format(time.RFC3339Nano), style, collectionType)
return
}
value = v.Type().String() + " value"
@@ -190,7 +190,11 @@ func parameterAddToHeaderOrQuery(headerOrQueryParams interface{}, keyPrefix stri
var lenIndValue = indValue.Len()
for i:=0;i<lenIndValue;i++ {
var arrayValue = indValue.Index(i)
parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefix, arrayValue.Interface(), collectionType)
var keyPrefixForCollectionType = keyPrefix
if style == "deepObject" {
keyPrefixForCollectionType = keyPrefix + "[" + strconv.Itoa(i) + "]"
}
parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefixForCollectionType, arrayValue.Interface(), style, collectionType)
}
return
@@ -202,14 +206,14 @@ func parameterAddToHeaderOrQuery(headerOrQueryParams interface{}, keyPrefix stri
iter := indValue.MapRange()
for iter.Next() {
k,v := iter.Key(), iter.Value()
parameterAddToHeaderOrQuery(headerOrQueryParams, fmt.Sprintf("%s[%s]", keyPrefix, k.String()), v.Interface(), collectionType)
parameterAddToHeaderOrQuery(headerOrQueryParams, fmt.Sprintf("%s[%s]", keyPrefix, k.String()), v.Interface(), style, collectionType)
}
return
case reflect.Interface:
fallthrough
case reflect.Ptr:
parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefix, v.Elem().Interface(), collectionType)
parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefix, v.Elem().Interface(), style, collectionType)
return
case reflect.Int, reflect.Int8, reflect.Int16,