Best Syzkaller code snippet using ast.parseComment
operation_test.go
Source:operation_test.go  
1package swag2import (3	"encoding/json"4	"go/ast"5	goparser "go/parser"6	"go/token"7	"testing"8	"github.com/go-openapi/spec"9	"github.com/stretchr/testify/assert"10)11func TestParseEmptyComment(t *testing.T) {12	operation := NewOperation()13	err := operation.ParseComment("//", nil)14	assert.NoError(t, err)15}16func TestParseTagsComment(t *testing.T) {17	expected := `{18    "tags": [19        "pet",20        "store",21        "user"22    ]23}`24	comment := `/@Tags pet, store,user`25	operation := NewOperation()26	err := operation.ParseComment(comment, nil)27	assert.NoError(t, err)28	b, _ := json.MarshalIndent(operation, "", "    ")29	assert.Equal(t, expected, string(b))30}31func TestParseAcceptComment(t *testing.T) {32	expected := `{33    "consumes": [34        "application/json",35        "text/xml",36        "text/plain",37        "text/html",38        "multipart/form-data",39        "application/x-www-form-urlencoded",40        "application/vnd.api+json",41        "application/x-json-stream",42		"application/octet-stream",43		"image/png",44		"image/jpeg",45		"image/gif",46		"application/xhtml+xml",47		"application/health+json"48    ]49}`50	comment := `/@Accept json,xml,plain,html,mpfd,x-www-form-urlencoded,json-api,json-stream,octet-stream,png,jpeg,gif,application/xhtml+xml,application/health+json`51	operation := NewOperation()52	err := operation.ParseComment(comment, nil)53	assert.NoError(t, err)54	b, _ := json.MarshalIndent(operation, "", "    ")55	assert.JSONEq(t, expected, string(b))56}57func TestParseAcceptCommentErr(t *testing.T) {58	comment := `/@Accept unknown`59	operation := NewOperation()60	err := operation.ParseComment(comment, nil)61	assert.Error(t, err)62}63func TestParseProduceComment(t *testing.T) {64	expected := `{65    "produces": [66        "application/json",67        "text/xml",68        "text/plain",69        "text/html",70        "multipart/form-data",71        "application/x-www-form-urlencoded",72        "application/vnd.api+json",73        "application/x-json-stream",74		"application/octet-stream",75		"image/png",76		"image/jpeg",77		"image/gif",78		"application/health+json"79    ]80}`81	comment := `/@Produce json,xml,plain,html,mpfd,x-www-form-urlencoded,json-api,json-stream,octet-stream,png,jpeg,gif,application/health+json`82	operation := new(Operation)83	err := operation.ParseComment(comment, nil)84	assert.NoError(t, err, "ParseComment should not fail")85	b, _ := json.MarshalIndent(operation, "", "    ")86	assert.JSONEq(t, expected, string(b))87}88func TestParseProduceCommentErr(t *testing.T) {89	comment := `/@Produce foo`90	operation := new(Operation)91	err := operation.ParseComment(comment, nil)92	assert.Error(t, err)93}94func TestParseRouterComment(t *testing.T) {95	comment := `/@Router /customer/get-wishlist/{wishlist_id} [get]`96	operation := NewOperation()97	err := operation.ParseComment(comment, nil)98	assert.NoError(t, err)99	assert.Equal(t, "/customer/get-wishlist/{wishlist_id}", operation.Path)100	assert.Equal(t, "GET", operation.HTTPMethod)101}102func TestParseRouterOnlySlash(t *testing.T) {103	comment := `// @Router / [get]`104	operation := NewOperation()105	err := operation.ParseComment(comment, nil)106	assert.NoError(t, err)107	assert.Equal(t, "/", operation.Path)108	assert.Equal(t, "GET", operation.HTTPMethod)109}110func TestParseRouterCommentWithPlusSign(t *testing.T) {111	comment := `/@Router /customer/get-wishlist/{proxy+} [post]`112	operation := NewOperation()113	err := operation.ParseComment(comment, nil)114	assert.NoError(t, err)115	assert.Equal(t, "/customer/get-wishlist/{proxy+}", operation.Path)116	assert.Equal(t, "POST", operation.HTTPMethod)117}118func TestParseRouterCommentWithColonSign(t *testing.T) {119	comment := `/@Router /customer/get-wishlist/{wishlist_id}:move [post]`120	operation := NewOperation()121	err := operation.ParseComment(comment, nil)122	assert.NoError(t, err)123	assert.Equal(t, "/customer/get-wishlist/{wishlist_id}:move", operation.Path)124	assert.Equal(t, "POST", operation.HTTPMethod)125}126func TestParseRouterCommentNoColonSignAtPathStartErr(t *testing.T) {127	comment := `/@Router :customer/get-wishlist/{wishlist_id}:move [post]`128	operation := NewOperation()129	err := operation.ParseComment(comment, nil)130	assert.Error(t, err)131}132func TestParseRouterCommentMethodSeparationErr(t *testing.T) {133	comment := `/@Router /api/{id}|,*[get`134	operation := NewOperation()135	err := operation.ParseComment(comment, nil)136	assert.Error(t, err)137}138func TestParseRouterCommentMethodMissingErr(t *testing.T) {139	comment := `/@Router /customer/get-wishlist/{wishlist_id}`140	operation := NewOperation()141	err := operation.ParseComment(comment, nil)142	assert.Error(t, err)143}144func TestParseResponseCommentWithObjectType(t *testing.T) {145	comment := `@Success 200 {object} model.OrderRow "Error message, if code != 200`146	operation := NewOperation()147	operation.parser = New()148	operation.parser.TypeDefinitions["model"] = make(map[string]*ast.TypeSpec)149	operation.parser.TypeDefinitions["model"]["OrderRow"] = &ast.TypeSpec{}150	err := operation.ParseComment(comment, nil)151	assert.NoError(t, err)152	response := operation.Responses.StatusCodeResponses[200]153	assert.Equal(t, `Error message, if code != 200`, response.Description)154	b, _ := json.MarshalIndent(operation, "", "    ")155	expected := `{156    "responses": {157        "200": {158            "description": "Error message, if code != 200",159            "schema": {160                "$ref": "#/definitions/model.OrderRow"161            }162        }163    }164}`165	assert.Equal(t, expected, string(b))166}167func TestParseResponseCommentWithNestedPrimitiveType(t *testing.T) {168	comment := `@Success 200 {object} model.CommonHeader{data=string,data2=int} "Error message, if code != 200`169	operation := NewOperation()170	operation.parser = New()171	operation.parser.TypeDefinitions["model"] = make(map[string]*ast.TypeSpec)172	operation.parser.TypeDefinitions["model"]["CommonHeader"] = &ast.TypeSpec{}173	err := operation.ParseComment(comment, nil)174	assert.NoError(t, err)175	response := operation.Responses.StatusCodeResponses[200]176	assert.Equal(t, `Error message, if code != 200`, response.Description)177	b, _ := json.MarshalIndent(operation, "", "    ")178	expected := `{179    "responses": {180        "200": {181            "description": "Error message, if code != 200",182            "schema": {183                "allOf": [184                    {185                        "$ref": "#/definitions/model.CommonHeader"186                    },187                    {188                        "type": "object",189                        "properties": {190                            "data": {191                                "type": "string"192                            },193                            "data2": {194                                "type": "integer"195                            }196                        }197                    }198                ]199            }200        }201    }202}`203	assert.Equal(t, expected, string(b))204}205func TestParseResponseCommentWithNestedPrimitiveArrayType(t *testing.T) {206	comment := `@Success 200 {object} model.CommonHeader{data=[]string,data2=[]int} "Error message, if code != 200`207	operation := NewOperation()208	operation.parser = New()209	operation.parser.TypeDefinitions["model"] = make(map[string]*ast.TypeSpec)210	operation.parser.TypeDefinitions["model"]["CommonHeader"] = &ast.TypeSpec{}211	err := operation.ParseComment(comment, nil)212	assert.NoError(t, err)213	response := operation.Responses.StatusCodeResponses[200]214	assert.Equal(t, `Error message, if code != 200`, response.Description)215	b, _ := json.MarshalIndent(operation, "", "    ")216	expected := `{217    "responses": {218        "200": {219            "description": "Error message, if code != 200",220            "schema": {221                "allOf": [222                    {223                        "$ref": "#/definitions/model.CommonHeader"224                    },225                    {226                        "type": "object",227                        "properties": {228                            "data": {229                                "type": "array",230                                "items": {231                                    "type": "string"232                                }233                            },234                            "data2": {235                                "type": "array",236                                "items": {237                                    "type": "integer"238                                }239                            }240                        }241                    }242                ]243            }244        }245    }246}`247	assert.Equal(t, expected, string(b))248}249func TestParseResponseCommentWithNestedObjectType(t *testing.T) {250	comment := `@Success 200 {object} model.CommonHeader{data=model.Payload,data2=model.Payload2} "Error message, if code != 200`251	operation := NewOperation()252	operation.parser = New()253	operation.parser.TypeDefinitions["model"] = make(map[string]*ast.TypeSpec)254	operation.parser.TypeDefinitions["model"]["CommonHeader"] = &ast.TypeSpec{}255	operation.parser.TypeDefinitions["model"]["Payload"] = &ast.TypeSpec{}256	operation.parser.TypeDefinitions["model"]["Payload2"] = &ast.TypeSpec{}257	err := operation.ParseComment(comment, nil)258	assert.NoError(t, err)259	response := operation.Responses.StatusCodeResponses[200]260	assert.Equal(t, `Error message, if code != 200`, response.Description)261	b, _ := json.MarshalIndent(operation, "", "    ")262	expected := `{263    "responses": {264        "200": {265            "description": "Error message, if code != 200",266            "schema": {267                "allOf": [268                    {269                        "$ref": "#/definitions/model.CommonHeader"270                    },271                    {272                        "type": "object",273                        "properties": {274                            "data": {275                                "$ref": "#/definitions/model.Payload"276                            },277                            "data2": {278                                "$ref": "#/definitions/model.Payload2"279                            }280                        }281                    }282                ]283            }284        }285    }286}`287	assert.Equal(t, expected, string(b))288}289func TestParseResponseCommentWithNestedArrayObjectType(t *testing.T) {290	comment := `@Success 200 {object} model.CommonHeader{data=[]model.Payload,data2=[]model.Payload2} "Error message, if code != 200`291	operation := NewOperation()292	operation.parser = New()293	operation.parser.TypeDefinitions["model"] = make(map[string]*ast.TypeSpec)294	operation.parser.TypeDefinitions["model"]["CommonHeader"] = &ast.TypeSpec{}295	operation.parser.TypeDefinitions["model"]["Payload"] = &ast.TypeSpec{}296	operation.parser.TypeDefinitions["model"]["Payload2"] = &ast.TypeSpec{}297	err := operation.ParseComment(comment, nil)298	assert.NoError(t, err)299	response := operation.Responses.StatusCodeResponses[200]300	assert.Equal(t, `Error message, if code != 200`, response.Description)301	b, _ := json.MarshalIndent(operation, "", "    ")302	expected := `{303    "responses": {304        "200": {305            "description": "Error message, if code != 200",306            "schema": {307                "allOf": [308                    {309                        "$ref": "#/definitions/model.CommonHeader"310                    },311                    {312                        "type": "object",313                        "properties": {314                            "data": {315                                "type": "array",316                                "items": {317                                    "$ref": "#/definitions/model.Payload"318                                }319                            },320                            "data2": {321                                "type": "array",322                                "items": {323                                    "$ref": "#/definitions/model.Payload2"324                                }325                            }326                        }327                    }328                ]329            }330        }331    }332}`333	assert.Equal(t, expected, string(b))334}335func TestParseResponseCommentWithNestedFields(t *testing.T) {336	comment := `@Success 200 {object} model.CommonHeader{data1=int,data2=[]int,data3=model.Payload,data4=[]model.Payload} "Error message, if code != 200`337	operation := NewOperation()338	operation.parser = New()339	operation.parser.TypeDefinitions["model"] = make(map[string]*ast.TypeSpec)340	operation.parser.TypeDefinitions["model"]["CommonHeader"] = &ast.TypeSpec{}341	operation.parser.TypeDefinitions["model"]["Payload"] = &ast.TypeSpec{}342	err := operation.ParseComment(comment, nil)343	assert.NoError(t, err)344	response := operation.Responses.StatusCodeResponses[200]345	assert.Equal(t, `Error message, if code != 200`, response.Description)346	b, _ := json.MarshalIndent(operation, "", "    ")347	expected := `{348    "responses": {349        "200": {350            "description": "Error message, if code != 200",351            "schema": {352                "allOf": [353                    {354                        "$ref": "#/definitions/model.CommonHeader"355                    },356                    {357                        "type": "object",358                        "properties": {359                            "data1": {360                                "type": "integer"361                            },362                            "data2": {363                                "type": "array",364                                "items": {365                                    "type": "integer"366                                }367                            },368                            "data3": {369                                "$ref": "#/definitions/model.Payload"370                            },371                            "data4": {372                                "type": "array",373                                "items": {374                                    "$ref": "#/definitions/model.Payload"375                                }376                            }377                        }378                    }379                ]380            }381        }382    }383}`384	assert.Equal(t, expected, string(b))385}386func TestParseResponseCommentWithDeepNestedFields(t *testing.T) {387	comment := `@Success 200 {object} model.CommonHeader{data1=int,data2=[]int,data3=model.Payload{data1=int,data2=model.DeepPayload},data4=[]model.Payload{data1=[]int,data2=[]model.DeepPayload}} "Error message, if code != 200`388	operation := NewOperation()389	operation.parser = New()390	operation.parser.TypeDefinitions["model"] = make(map[string]*ast.TypeSpec)391	operation.parser.TypeDefinitions["model"]["CommonHeader"] = &ast.TypeSpec{}392	operation.parser.TypeDefinitions["model"]["Payload"] = &ast.TypeSpec{}393	operation.parser.TypeDefinitions["model"]["DeepPayload"] = &ast.TypeSpec{}394	err := operation.ParseComment(comment, nil)395	assert.NoError(t, err)396	response := operation.Responses.StatusCodeResponses[200]397	assert.Equal(t, `Error message, if code != 200`, response.Description)398	b, _ := json.MarshalIndent(operation, "", "    ")399	expected := `{400    "responses": {401        "200": {402            "description": "Error message, if code != 200",403            "schema": {404                "allOf": [405                    {406                        "$ref": "#/definitions/model.CommonHeader"407                    },408                    {409                        "type": "object",410                        "properties": {411                            "data1": {412                                "type": "integer"413                            },414                            "data2": {415                                "type": "array",416                                "items": {417                                    "type": "integer"418                                }419                            },420                            "data3": {421                                "allOf": [422                                    {423                                        "$ref": "#/definitions/model.Payload"424                                    },425                                    {426                                        "type": "object",427                                        "properties": {428                                            "data1": {429                                                "type": "integer"430                                            },431                                            "data2": {432                                                "$ref": "#/definitions/model.DeepPayload"433                                            }434                                        }435                                    }436                                ]437                            },438                            "data4": {439                                "type": "array",440                                "items": {441                                    "allOf": [442                                        {443                                            "$ref": "#/definitions/model.Payload"444                                        },445                                        {446                                            "type": "object",447                                            "properties": {448                                                "data1": {449                                                    "type": "array",450                                                    "items": {451                                                        "type": "integer"452                                                    }453                                                },454                                                "data2": {455                                                    "type": "array",456                                                    "items": {457                                                        "$ref": "#/definitions/model.DeepPayload"458                                                    }459                                                }460                                            }461                                        }462                                    ]463                                }464                            }465                        }466                    }467                ]468            }469        }470    }471}`472	assert.Equal(t, expected, string(b))473}474func TestParseResponseCommentWithNestedArrayMapFields(t *testing.T) {475	comment := `@Success 200 {object} []map[string]model.CommonHeader{data1=[]map[string]model.Payload,data2=map[string][]int} "Error message, if code != 200`476	operation := NewOperation()477	operation.parser = New()478	operation.parser.TypeDefinitions["model"] = make(map[string]*ast.TypeSpec)479	operation.parser.TypeDefinitions["model"]["CommonHeader"] = &ast.TypeSpec{}480	operation.parser.TypeDefinitions["model"]["Payload"] = &ast.TypeSpec{}481	err := operation.ParseComment(comment, nil)482	assert.NoError(t, err)483	response := operation.Responses.StatusCodeResponses[200]484	assert.Equal(t, `Error message, if code != 200`, response.Description)485	b, _ := json.MarshalIndent(operation, "", "    ")486	expected := `{487    "responses": {488        "200": {489            "description": "Error message, if code != 200",490            "schema": {491                "type": "array",492                "items": {493                    "type": "object",494                    "additionalProperties": {495                        "allOf": [496                            {497                                "$ref": "#/definitions/model.CommonHeader"498                            },499                            {500                                "type": "object",501                                "properties": {502                                    "data1": {503                                        "type": "array",504                                        "items": {505                                            "type": "object",506                                            "additionalProperties": {507                                                "$ref": "#/definitions/model.Payload"508                                            }509                                        }510                                    },511                                    "data2": {512                                        "type": "object",513                                        "additionalProperties": {514                                            "type": "array",515                                            "items": {516                                                "type": "integer"517                                            }518                                        }519                                    }520                                }521                            }522                        ]523                    }524                }525            }526        }527    }528}`529	assert.Equal(t, expected, string(b))530}531func TestParseResponseCommentWithObjectTypeInSameFile(t *testing.T) {532	comment := `@Success 200 {object} testOwner "Error message, if code != 200"`533	operation := NewOperation()534	operation.parser = New()535	operation.parser.TypeDefinitions["swag"] = make(map[string]*ast.TypeSpec)536	operation.parser.TypeDefinitions["swag"]["testOwner"] = &ast.TypeSpec{}537	fset := token.NewFileSet()538	astFile, err := goparser.ParseFile(fset, "operation_test.go", `package swag539	type testOwner struct {540		541	}542	`, goparser.ParseComments)543	assert.NoError(t, err)544	err = operation.ParseComment(comment, astFile)545	assert.NoError(t, err)546	response := operation.Responses.StatusCodeResponses[200]547	assert.Equal(t, `Error message, if code != 200`, response.Description)548	b, _ := json.MarshalIndent(operation, "", "    ")549	expected := `{550    "responses": {551        "200": {552            "description": "Error message, if code != 200",553            "schema": {554                "$ref": "#/definitions/swag.testOwner"555            }556        }557    }558}`559	assert.Equal(t, expected, string(b))560}561func TestParseResponseCommentWithObjectTypeAnonymousField(t *testing.T) {562	//TODO: test Anonymous563}564func TestParseResponseCommentWithObjectTypeErr(t *testing.T) {565	comment := `@Success 200 {object} model.OrderRow "Error message, if code != 200"`566	operation := NewOperation()567	operation.parser = New()568	operation.parser.TypeDefinitions["model"] = make(map[string]*ast.TypeSpec)569	operation.parser.TypeDefinitions["model"]["notexist"] = &ast.TypeSpec{}570	err := operation.ParseComment(comment, nil)571	assert.Error(t, err)572}573func TestParseResponseCommentWithArrayType(t *testing.T) {574	comment := `@Success 200 {array} model.OrderRow "Error message, if code != 200`575	operation := NewOperation()576	err := operation.ParseComment(comment, nil)577	assert.NoError(t, err)578	response := operation.Responses.StatusCodeResponses[200]579	assert.Equal(t, `Error message, if code != 200`, response.Description)580	assert.Equal(t, spec.StringOrArray{"array"}, response.Schema.Type)581	b, _ := json.MarshalIndent(operation, "", "    ")582	expected := `{583    "responses": {584        "200": {585            "description": "Error message, if code != 200",586            "schema": {587                "type": "array",588                "items": {589                    "$ref": "#/definitions/model.OrderRow"590                }591            }592        }593    }594}`595	assert.Equal(t, expected, string(b))596}597func TestParseResponseCommentWithBasicType(t *testing.T) {598	comment := `@Success 200 {string} string "it's ok'"`599	operation := NewOperation()600	err := operation.ParseComment(comment, nil)601	assert.NoError(t, err, "ParseComment should not fail")602	b, _ := json.MarshalIndent(operation, "", "    ")603	expected := `{604    "responses": {605        "200": {606            "description": "it's ok'",607            "schema": {608                "type": "string"609            }610        }611    }612}`613	assert.Equal(t, expected, string(b))614}615func TestParseEmptyResponseComment(t *testing.T) {616	comment := `@Success 200 "it's ok"`617	operation := NewOperation()618	err := operation.ParseComment(comment, nil)619	assert.NoError(t, err, "ParseComment should not fail")620	b, _ := json.MarshalIndent(operation, "", "    ")621	expected := `{622    "responses": {623        "200": {624            "description": "it's ok"625        }626    }627}`628	assert.Equal(t, expected, string(b))629}630func TestParseResponseCommentWithHeader(t *testing.T) {631	comment := `@Success 200 "it's ok"`632	operation := NewOperation()633	err := operation.ParseComment(comment, nil)634	assert.NoError(t, err, "ParseComment should not fail")635	comment = `@Header 200 {string} Token "qwerty"`636	err = operation.ParseComment(comment, nil)637	assert.NoError(t, err, "ParseComment should not fail")638	b, err := json.MarshalIndent(operation, "", "    ")639	assert.NoError(t, err)640	expected := `{641    "responses": {642        "200": {643            "description": "it's ok",644            "headers": {645                "Token": {646                    "type": "string",647                    "description": "qwerty"648                }649            }650        }651    }652}`653	assert.Equal(t, expected, string(b))654	comment = `@Header 200 "Mallformed"`655	err = operation.ParseComment(comment, nil)656	assert.Error(t, err, "ParseComment should not fail")657}658func TestParseEmptyResponseOnlyCode(t *testing.T) {659	comment := `@Success 200`660	operation := NewOperation()661	err := operation.ParseComment(comment, nil)662	assert.NoError(t, err, "ParseComment should not fail")663	b, _ := json.MarshalIndent(operation, "", "    ")664	expected := `{665    "responses": {666        "200": {}667    }668}`669	assert.Equal(t, expected, string(b))670}671func TestParseResponseCommentParamMissing(t *testing.T) {672	operation := NewOperation()673	paramLenErrComment := `@Success notIntCode {string}`674	paramLenErr := operation.ParseComment(paramLenErrComment, nil)675	assert.EqualError(t, paramLenErr, `can not parse response comment "notIntCode {string}"`)676}677// Test ParseParamComment678func TestParseParamCommentByPathType(t *testing.T) {679	comment := `@Param some_id path int true "Some ID"`680	operation := NewOperation()681	err := operation.ParseComment(comment, nil)682	assert.NoError(t, err)683	b, _ := json.MarshalIndent(operation, "", "    ")684	expected := `{685    "parameters": [686        {687            "type": "integer",688            "description": "Some ID",689            "name": "some_id",690            "in": "path",691            "required": true692        }693    ]694}`695	assert.Equal(t, expected, string(b))696}697// Test ParseParamComment Query Params698func TestParseParamCommentBodyArray(t *testing.T) {699	comment := `@Param names body []string true "Users List"`700	operation := NewOperation()701	err := operation.ParseComment(comment, nil)702	assert.NoError(t, err)703	b, _ := json.MarshalIndent(operation, "", "    ")704	expected := `{705    "parameters": [706        {707            "description": "Users List",708            "name": "names",709            "in": "body",710            "required": true,711            "schema": {712                "type": "array",713                "items": {714                    "type": "string"715                }716            }717        }718    ]719}`720	assert.Equal(t, expected, string(b))721}722// Test ParseParamComment Query Params723func TestParseParamCommentQueryArray(t *testing.T) {724	comment := `@Param names query []string true "Users List"`725	operation := NewOperation()726	err := operation.ParseComment(comment, nil)727	assert.NoError(t, err)728	b, _ := json.MarshalIndent(operation, "", "    ")729	expected := `{730    "parameters": [731        {732            "type": "array",733            "items": {734                "type": "string"735            },736            "description": "Users List",737            "name": "names",738            "in": "query",739            "required": true740        }741    ]742}`743	assert.Equal(t, expected, string(b))744}745// Test ParseParamComment Query Params746func TestParseParamCommentQueryArrayFormat(t *testing.T) {747	comment := `@Param names query []string true "Users List" collectionFormat(multi)`748	operation := NewOperation()749	err := operation.ParseComment(comment, nil)750	assert.NoError(t, err)751	b, _ := json.MarshalIndent(operation, "", "    ")752	expected := `{753    "parameters": [754        {755            "type": "array",756            "items": {757                "type": "string"758            },759            "collectionFormat": "multi",760            "description": "Users List",761            "name": "names",762            "in": "query",763            "required": true764        }765    ]766}`767	assert.Equal(t, expected, string(b))768}769func TestParseParamCommentByID(t *testing.T) {770	comment := `@Param unsafe_id[lte] query int true "Unsafe query param"`771	operation := NewOperation()772	err := operation.ParseComment(comment, nil)773	assert.NoError(t, err)774	b, _ := json.MarshalIndent(operation, "", "    ")775	expected := `{776    "parameters": [777        {778            "type": "integer",779            "description": "Unsafe query param",780            "name": "unsafe_id[lte]",781            "in": "query",782            "required": true783        }784    ]785}`786	assert.Equal(t, expected, string(b))787}788func TestParseParamCommentByQueryType(t *testing.T) {789	comment := `@Param some_id query int true "Some ID"`790	operation := NewOperation()791	err := operation.ParseComment(comment, nil)792	assert.NoError(t, err)793	b, _ := json.MarshalIndent(operation, "", "    ")794	expected := `{795    "parameters": [796        {797            "type": "integer",798            "description": "Some ID",799            "name": "some_id",800            "in": "query",801            "required": true802        }803    ]804}`805	assert.Equal(t, expected, string(b))806}807func TestParseParamCommentByBodyType(t *testing.T) {808	comment := `@Param some_id body model.OrderRow true "Some ID"`809	operation := NewOperation()810	operation.parser = New()811	operation.parser.TypeDefinitions["model"] = make(map[string]*ast.TypeSpec)812	operation.parser.TypeDefinitions["model"]["OrderRow"] = &ast.TypeSpec{}813	err := operation.ParseComment(comment, nil)814	assert.NoError(t, err)815	b, _ := json.MarshalIndent(operation, "", "    ")816	expected := `{817    "parameters": [818        {819            "description": "Some ID",820            "name": "some_id",821            "in": "body",822            "required": true,823            "schema": {824                "$ref": "#/definitions/model.OrderRow"825            }826        }827    ]828}`829	assert.Equal(t, expected, string(b))830}831func TestParseParamCommentByBodyTypeWithDeepNestedFields(t *testing.T) {832	comment := `@Param body body model.CommonHeader{data=string,data2=int} true "test deep"`833	operation := NewOperation()834	operation.parser = New()835	operation.parser.TypeDefinitions["model"] = make(map[string]*ast.TypeSpec)836	operation.parser.TypeDefinitions["model"]["CommonHeader"] = &ast.TypeSpec{}837	err := operation.ParseComment(comment, nil)838	assert.NoError(t, err)839	assert.Len(t, operation.Parameters, 1)840	assert.Equal(t, "test deep", operation.Parameters[0].Description)841	assert.True(t, operation.Parameters[0].Required)842	b, err := json.MarshalIndent(operation, "", "    ")843	assert.NoError(t, err)844	expected := `{845    "parameters": [846        {847            "description": "test deep",848            "name": "body",849            "in": "body",850            "required": true,851            "schema": {852                "allOf": [853                    {854                        "$ref": "#/definitions/model.CommonHeader"855                    },856                    {857                        "type": "object",858                        "properties": {859                            "data": {860                                "type": "string"861                            },862                            "data2": {863                                "type": "integer"864                            }865                        }866                    }867                ]868            }869        }870    ]871}`872	assert.Equal(t, expected, string(b))873}874func TestParseParamCommentByBodyTypeArrayOfPrimitiveGo(t *testing.T) {875	comment := `@Param some_id body []int true "Some ID"`876	operation := NewOperation()877	operation.parser = New()878	err := operation.ParseComment(comment, nil)879	assert.NoError(t, err)880	b, _ := json.MarshalIndent(operation, "", "    ")881	expected := `{882    "parameters": [883        {884            "description": "Some ID",885            "name": "some_id",886            "in": "body",887            "required": true,888            "schema": {889                "type": "array",890                "items": {891                    "type": "integer"892                }893            }894        }895    ]896}`897	assert.Equal(t, expected, string(b))898}899func TestParseParamCommentByBodyTypeArrayOfPrimitiveGoWithDeepNestedFields(t *testing.T) {900	comment := `@Param body body []model.CommonHeader{data=string,data2=int} true "test deep"`901	operation := NewOperation()902	operation.parser = New()903	operation.parser.TypeDefinitions["model"] = make(map[string]*ast.TypeSpec)904	operation.parser.TypeDefinitions["model"]["CommonHeader"] = &ast.TypeSpec{}905	err := operation.ParseComment(comment, nil)906	assert.NoError(t, err)907	assert.Len(t, operation.Parameters, 1)908	assert.Equal(t, "test deep", operation.Parameters[0].Description)909	assert.True(t, operation.Parameters[0].Required)910	b, err := json.MarshalIndent(operation, "", "    ")911	assert.NoError(t, err)912	expected := `{913    "parameters": [914        {915            "description": "test deep",916            "name": "body",917            "in": "body",918            "required": true,919            "schema": {920                "type": "array",921                "items": {922                    "allOf": [923                        {924                            "$ref": "#/definitions/model.CommonHeader"925                        },926                        {927                            "type": "object",928                            "properties": {929                                "data": {930                                    "type": "string"931                                },932                                "data2": {933                                    "type": "integer"934                                }935                            }936                        }937                    ]938                }939            }940        }941    ]942}`943	assert.Equal(t, expected, string(b))944}945func TestParseParamCommentByBodyTypeErr(t *testing.T) {946	comment := `@Param some_id body model.OrderRow true "Some ID"`947	operation := NewOperation()948	operation.parser = New()949	operation.parser.TypeDefinitions["model"] = make(map[string]*ast.TypeSpec)950	operation.parser.TypeDefinitions["model"]["notexist"] = &ast.TypeSpec{}951	err := operation.ParseComment(comment, nil)952	assert.Error(t, err)953}954func TestParseParamCommentByFormDataType(t *testing.T) {955	comment := `@Param file formData file true "this is a test file"`956	operation := NewOperation()957	operation.parser = New()958	err := operation.ParseComment(comment, nil)959	assert.NoError(t, err)960	b, _ := json.MarshalIndent(operation, "", "    ")961	expected := `{962    "parameters": [963        {964            "type": "file",965            "description": "this is a test file",966            "name": "file",967            "in": "formData",968            "required": true969        }970    ]971}`972	assert.Equal(t, expected, string(b))973}974func TestParseParamCommentByFormDataTypeUint64(t *testing.T) {975	comment := `@Param file formData uint64 true "this is a test file"`976	operation := NewOperation()977	operation.parser = New()978	err := operation.ParseComment(comment, nil)979	assert.NoError(t, err)980	b, _ := json.MarshalIndent(operation, "", "    ")981	expected := `{982    "parameters": [983        {984            "type": "integer",985            "description": "this is a test file",986            "name": "file",987            "in": "formData",988            "required": true989        }990    ]991}`992	assert.Equal(t, expected, string(b))993}994func TestParseParamCommentByNotSupportedType(t *testing.T) {995	comment := `@Param some_id not_supported int true "Some ID"`996	operation := NewOperation()997	err := operation.ParseComment(comment, nil)998	assert.Error(t, err)999}1000func TestParseParamCommentNotMatch(t *testing.T) {1001	comment := `@Param some_id body mock true`1002	operation := NewOperation()1003	err := operation.ParseComment(comment, nil)1004	assert.Error(t, err)1005}1006func TestParseParamCommentByEnums(t *testing.T) {1007	comment := `@Param some_id query string true "Some ID" Enums(A, B, C)`1008	operation := NewOperation()1009	err := operation.ParseComment(comment, nil)1010	assert.NoError(t, err)1011	b, _ := json.MarshalIndent(operation, "", "    ")1012	expected := `{1013    "parameters": [1014        {1015            "enum": [1016                "A",1017                "B",1018                "C"1019            ],1020            "type": "string",1021            "description": "Some ID",1022            "name": "some_id",1023            "in": "query",1024            "required": true1025        }1026    ]1027}`1028	assert.Equal(t, expected, string(b))1029	comment = `@Param some_id query int true "Some ID" Enums(1, 2, 3)`1030	operation = NewOperation()1031	err = operation.ParseComment(comment, nil)1032	assert.NoError(t, err)1033	b, _ = json.MarshalIndent(operation, "", "    ")1034	expected = `{1035    "parameters": [1036        {1037            "enum": [1038                1,1039                2,1040                31041            ],1042            "type": "integer",1043            "description": "Some ID",1044            "name": "some_id",1045            "in": "query",1046            "required": true1047        }1048    ]1049}`1050	assert.Equal(t, expected, string(b))1051	comment = `@Param some_id query number true "Some ID" Enums(1.1, 2.2, 3.3)`1052	operation = NewOperation()1053	err = operation.ParseComment(comment, nil)1054	assert.NoError(t, err)1055	b, _ = json.MarshalIndent(operation, "", "    ")1056	expected = `{1057    "parameters": [1058        {1059            "enum": [1060                1.1,1061                2.2,1062                3.31063            ],1064            "type": "number",1065            "description": "Some ID",1066            "name": "some_id",1067            "in": "query",1068            "required": true1069        }1070    ]1071}`1072	assert.Equal(t, expected, string(b))1073	comment = `@Param some_id query bool true "Some ID" Enums(true, false)`1074	operation = NewOperation()1075	err = operation.ParseComment(comment, nil)1076	assert.NoError(t, err)1077	b, _ = json.MarshalIndent(operation, "", "    ")1078	expected = `{1079    "parameters": [1080        {1081            "enum": [1082                true,1083                false1084            ],1085            "type": "boolean",1086            "description": "Some ID",1087            "name": "some_id",1088            "in": "query",1089            "required": true1090        }1091    ]1092}`1093	assert.Equal(t, expected, string(b))1094	operation = NewOperation()1095	comment = `@Param some_id query int true "Some ID" Enums(A, B, C)`1096	assert.Error(t, operation.ParseComment(comment, nil))1097	comment = `@Param some_id query number true "Some ID" Enums(A, B, C)`1098	assert.Error(t, operation.ParseComment(comment, nil))1099	comment = `@Param some_id query boolean true "Some ID" Enums(A, B, C)`1100	assert.Error(t, operation.ParseComment(comment, nil))1101	comment = `@Param some_id query Document true "Some ID" Enums(A, B, C)`1102	assert.Error(t, operation.ParseComment(comment, nil))1103}1104func TestParseParamCommentByMaxLength(t *testing.T) {1105	comment := `@Param some_id query string true "Some ID" MaxLength(10)`1106	operation := NewOperation()1107	err := operation.ParseComment(comment, nil)1108	assert.NoError(t, err)1109	b, _ := json.MarshalIndent(operation, "", "    ")1110	expected := `{1111    "parameters": [1112        {1113            "maxLength": 10,1114            "type": "string",1115            "description": "Some ID",1116            "name": "some_id",1117            "in": "query",1118            "required": true1119        }1120    ]1121}`1122	assert.Equal(t, expected, string(b))1123	comment = `@Param some_id query int true "Some ID" MaxLength(10)`1124	assert.Error(t, operation.ParseComment(comment, nil))1125	comment = `@Param some_id query string true "Some ID" MaxLength(Goopher)`1126	assert.Error(t, operation.ParseComment(comment, nil))1127}1128func TestParseParamCommentByMinLength(t *testing.T) {1129	comment := `@Param some_id query string true "Some ID" MinLength(10)`1130	operation := NewOperation()1131	err := operation.ParseComment(comment, nil)1132	assert.NoError(t, err)1133	b, _ := json.MarshalIndent(operation, "", "    ")1134	expected := `{1135    "parameters": [1136        {1137            "minLength": 10,1138            "type": "string",1139            "description": "Some ID",1140            "name": "some_id",1141            "in": "query",1142            "required": true1143        }1144    ]1145}`1146	assert.Equal(t, expected, string(b))1147	comment = `@Param some_id query int true "Some ID" MinLength(10)`1148	assert.Error(t, operation.ParseComment(comment, nil))1149	comment = `@Param some_id query string true "Some ID" MinLength(Goopher)`1150	assert.Error(t, operation.ParseComment(comment, nil))1151}1152func TestParseParamCommentByMininum(t *testing.T) {1153	comment := `@Param some_id query int true "Some ID" Mininum(10)`1154	operation := NewOperation()1155	err := operation.ParseComment(comment, nil)1156	assert.NoError(t, err)1157	b, _ := json.MarshalIndent(operation, "", "    ")1158	expected := `{1159    "parameters": [1160        {1161            "minimum": 10,1162            "type": "integer",1163            "description": "Some ID",1164            "name": "some_id",1165            "in": "query",1166            "required": true1167        }1168    ]1169}`1170	assert.Equal(t, expected, string(b))1171	comment = `@Param some_id query string true "Some ID" Mininum(10)`1172	assert.Error(t, operation.ParseComment(comment, nil))1173	comment = `@Param some_id query integer true "Some ID" Mininum(Goopher)`1174	assert.Error(t, operation.ParseComment(comment, nil))1175}1176func TestParseParamCommentByMaxinum(t *testing.T) {1177	comment := `@Param some_id query int true "Some ID" Maxinum(10)`1178	operation := NewOperation()1179	err := operation.ParseComment(comment, nil)1180	assert.NoError(t, err)1181	b, _ := json.MarshalIndent(operation, "", "    ")1182	expected := `{1183    "parameters": [1184        {1185            "maximum": 10,1186            "type": "integer",1187            "description": "Some ID",1188            "name": "some_id",1189            "in": "query",1190            "required": true1191        }1192    ]1193}`1194	assert.Equal(t, expected, string(b))1195	comment = `@Param some_id query string true "Some ID" Maxinum(10)`1196	assert.Error(t, operation.ParseComment(comment, nil))1197	comment = `@Param some_id query integer true "Some ID" Maxinum(Goopher)`1198	assert.Error(t, operation.ParseComment(comment, nil))1199}1200func TestParseParamCommentByDefault(t *testing.T) {1201	comment := `@Param some_id query int true "Some ID" Default(10)`1202	operation := NewOperation()1203	err := operation.ParseComment(comment, nil)1204	assert.NoError(t, err)1205	b, _ := json.MarshalIndent(operation, "", "    ")1206	expected := `{1207    "parameters": [1208        {1209            "type": "integer",1210            "default": 10,1211            "description": "Some ID",1212            "name": "some_id",1213            "in": "query",1214            "required": true1215        }1216    ]1217}`1218	assert.Equal(t, expected, string(b))1219}1220func TestParseIdComment(t *testing.T) {1221	comment := `@Id myOperationId`1222	operation := NewOperation()1223	err := operation.ParseComment(comment, nil)1224	assert.NoError(t, err)1225	assert.Equal(t, "myOperationId", operation.ID)1226}1227func TestFindTypeDefCoreLib(t *testing.T) {1228	spec, err := findTypeDef("net/http", "Request")1229	assert.NoError(t, err)1230	assert.NotNil(t, spec)1231}1232func TestFindTypeDefExternalPkg(t *testing.T) {1233	spec, err := findTypeDef("github.com/KyleBanks/depth", "Tree")1234	assert.NoError(t, err)1235	assert.NotNil(t, spec)1236}1237func TestFindTypeDefInvalidPkg(t *testing.T) {1238	spec, err := findTypeDef("does-not-exist", "foo")1239	assert.Error(t, err)1240	assert.Nil(t, spec)1241}1242func TestParseSecurityComment(t *testing.T) {1243	comment := `@Security OAuth2Implicit[read, write]`1244	operation := NewOperation()1245	operation.parser = New()1246	err := operation.ParseComment(comment, nil)1247	assert.NoError(t, err)1248	b, _ := json.MarshalIndent(operation, "", "    ")1249	expected := `{1250    "security": [1251        {1252            "OAuth2Implicit": [1253                "read",1254                "write"1255            ]1256        }1257    ]1258}`1259	assert.Equal(t, expected, string(b))1260}1261func TestParseMultiDescription(t *testing.T) {1262	comment := `@Description line one`1263	operation := NewOperation()1264	operation.parser = New()1265	err := operation.ParseComment(comment, nil)1266	assert.NoError(t, err)1267	comment = `@Tags multi`1268	err = operation.ParseComment(comment, nil)1269	assert.NoError(t, err)1270	comment = `@Description line two x`1271	err = operation.ParseComment(comment, nil)1272	assert.NoError(t, err)1273	b, _ := json.MarshalIndent(operation, "", "    ")1274	expected := `"description": "line one\nline two x"`1275	assert.Contains(t, string(b), expected)1276}1277func TestParseSummary(t *testing.T) {1278	comment := `@summary line one`1279	operation := NewOperation()1280	operation.parser = New()1281	err := operation.ParseComment(comment, nil)1282	assert.NoError(t, err)1283	comment = `@Summary line one`1284	err = operation.ParseComment(comment, nil)1285	assert.NoError(t, err)1286}1287func TestParseDeprecationDescription(t *testing.T) {1288	comment := `@Deprecated`1289	operation := NewOperation()1290	operation.parser = New()1291	err := operation.ParseComment(comment, nil)1292	assert.NoError(t, err)1293	if !operation.Deprecated {1294		t.Error("Failed to parse @deprecated comment")1295	}1296}1297func TestRegisterSchemaType(t *testing.T) {1298	operation := NewOperation()1299	fset := token.NewFileSet()1300	astFile, err := goparser.ParseFile(fset, "main.go", `package main1301	import "timer"1302`, goparser.ParseComments)1303	assert.NoError(t, err)1304	operation.parser = New()1305	_, _, err = operation.registerSchemaType("timer.Location", astFile)1306	assert.Error(t, err)1307}1308func TestParseExtentions(t *testing.T) {1309	// Fail if there are no args for attributes.1310	{1311		comment := `@x-amazon-apigateway-integration`1312		operation := NewOperation()1313		operation.parser = New()1314		err := operation.ParseComment(comment, nil)1315		assert.EqualError(t, err, "annotation @x-amazon-apigateway-integration need a value")1316	}1317	// Fail if args of attributes are broken.1318	{1319		comment := `@x-amazon-apigateway-integration ["broken"}]`1320		operation := NewOperation()1321		operation.parser = New()1322		err := operation.ParseComment(comment, nil)1323		assert.EqualError(t, err, "annotation @x-amazon-apigateway-integration need a valid json value")1324	}1325	// OK1326	{1327		comment := `@x-amazon-apigateway-integration {"uri": "${some_arn}", "passthroughBehavior": "when_no_match", "httpMethod": "POST", "type": "aws_proxy"}`1328		operation := NewOperation()1329		operation.parser = New()1330		err := operation.ParseComment(comment, nil)1331		assert.NoError(t, err)1332		expected := `{1333    "x-amazon-apigateway-integration": {1334        "httpMethod": "POST",1335        "passthroughBehavior": "when_no_match",1336        "type": "aws_proxy",1337        "uri": "${some_arn}"1338    }1339}`1340		b, _ := json.MarshalIndent(operation, "", "    ")1341		assert.Equal(t, expected, string(b))1342	}1343}...parseComment
Using AI Code Generation
1import (2func main() {3	f, err := parser.ParseFile(fset, "1.go", nil, parser.ParseComments)4	if err != nil {5		log.Fatal(err)6	}7	ast.Inspect(f, func(n ast.Node) bool {8		switch x := n.(type) {9			for _, spec := range x.Specs {10				if t, ok := spec.(*ast.TypeSpec); ok {11					if s, ok := t.Type.(*ast.StructType); ok {12						for _, field := range s.Fields.List {13							if field.Comment != nil {14								fmt.Println(field.Comment.Text())15							}16						}17					}18				}19			}20		}21	})22}23import (24func main() {25	f, err := parser.ParseFile(fset, "1.go", nil, parser.ParseComments)26	if err != nil {27		log.Fatal(err)28	}29	ast.Inspect(f, func(n ast.Node) bool {30		switch x := n.(type) {31			for _, spec := range x.Specs {32				if t, ok := spec.(*ast.TypeSpec); ok {33					if s, ok := t.Type.(*ast.StructType); ok {34						for _, field := range s.Fields.List {35							if field.Doc != nil {36								fmt.Println(field.Doc.Text())37							}38						}39					}40				}41			}42		}43	})44}45import (46func main() {47	f, err := parser.ParseFile(fset, "1.go", nil, parser.ParseComments)48	if err != nil {49		log.Fatal(err)50	}parseComment
Using AI Code Generation
1import (2func main() {3	fset := token.NewFileSet()4	f, err := parser.ParseFile(fset, "1.go", nil, parser.ParseComments)5	if err != nil {6		panic(err)7	}8	for _, cg := range f.Comments {9		fmt.Println("comment:", cg.Text())10	}11}parseComment
Using AI Code Generation
1import (2func main() {3	fs := token.NewFileSet()4	f, err := parser.ParseFile(fs, "1.go", nil, parser.ParseComments)5	if err != nil {6		panic(err)7	}8	for _, d := range f.Decls {9		if gd, ok := d.(*ast.GenDecl); ok {10			for _, s := range gd.Specs {11				if ts, ok := s.(*ast.TypeSpec); ok {12					if st, ok := ts.Type.(*ast.StructType); ok {13						for _, field := range st.Fields.List {14							if field.Tag != nil {15								fmt.Println(field.Tag.Value)16							}17						}18					}19				}20			}21		}22	}23}parseComment
Using AI Code Generation
1import (2func main() {3	src, err := ioutil.ReadFile(os.Args[1])4	if err != nil {5		log.Fatal(err)6	}7	f, err := parser.ParseFile(fset, "", src, parser.ParseComments)8	if err != nil {9		log.Fatal(err)10	}11	for _, cg := range f.Decls[0].(*ast.FuncDecl).Type.Results.List[0].Names[0].Comments {12		for _, c := range cg.List {13			fmt.Println(c.Text)14		}15	}16}Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
