281 lines
7.3 KiB
Go
281 lines
7.3 KiB
Go
package swag
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
const (
|
|
SearchDir = "./testdata/format_test"
|
|
Excludes = "./testdata/format_test/web"
|
|
MainFile = "main.go"
|
|
)
|
|
|
|
func testFormat(t *testing.T, filename, contents, want string) {
|
|
got, err := NewFormatter().Format(filename, []byte(contents))
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, want, string(got))
|
|
}
|
|
|
|
func Test_FormatMain(t *testing.T) {
|
|
contents := `package main
|
|
// @title Swagger Example API
|
|
// @version 1.0
|
|
// @description This is a sample server Petstore server.
|
|
// @termsOfService http://swagger.io/terms/
|
|
|
|
// @contact.name API Support
|
|
// @contact.url http://www.swagger.io/support
|
|
// @contact.email support@swagger.io
|
|
|
|
// @license.name Apache 2.0
|
|
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
|
|
|
|
// @host petstore.swagger.io
|
|
// @BasePath /v2
|
|
|
|
// @securityDefinitions.basic BasicAuth
|
|
|
|
// @securityDefinitions.apikey ApiKeyAuth
|
|
// @in header
|
|
// @name Authorization
|
|
|
|
// @securitydefinitions.oauth2.application OAuth2Application
|
|
// @tokenUrl https://example.com/oauth/token
|
|
// @scope.write Grants write access
|
|
// @scope.admin Grants read and write access to administrative information
|
|
|
|
// @securitydefinitions.oauth2.implicit OAuth2Implicit
|
|
// @authorizationurl https://example.com/oauth/authorize
|
|
// @scope.write Grants write access
|
|
// @scope.admin Grants read and write access to administrative information
|
|
|
|
// @securitydefinitions.oauth2.password OAuth2Password
|
|
// @tokenUrl https://example.com/oauth/token
|
|
// @scope.read Grants read access
|
|
// @scope.write Grants write access
|
|
// @scope.admin Grants read and write access to administrative information
|
|
|
|
// @securitydefinitions.oauth2.accessCode OAuth2AccessCode
|
|
// @tokenUrl https://example.com/oauth/token
|
|
// @authorizationurl https://example.com/oauth/authorize
|
|
// @scope.admin Grants read and write access to administrative information
|
|
func main() {}`
|
|
|
|
want := `package main
|
|
|
|
// @title Swagger Example API
|
|
// @version 1.0
|
|
// @description This is a sample server Petstore server.
|
|
// @termsOfService http://swagger.io/terms/
|
|
|
|
// @contact.name API Support
|
|
// @contact.url http://www.swagger.io/support
|
|
// @contact.email support@swagger.io
|
|
|
|
// @license.name Apache 2.0
|
|
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
|
|
|
|
// @host petstore.swagger.io
|
|
// @BasePath /v2
|
|
|
|
// @securityDefinitions.basic BasicAuth
|
|
|
|
// @securityDefinitions.apikey ApiKeyAuth
|
|
// @in header
|
|
// @name Authorization
|
|
|
|
// @securitydefinitions.oauth2.application OAuth2Application
|
|
// @tokenUrl https://example.com/oauth/token
|
|
// @scope.write Grants write access
|
|
// @scope.admin Grants read and write access to administrative information
|
|
|
|
// @securitydefinitions.oauth2.implicit OAuth2Implicit
|
|
// @authorizationurl https://example.com/oauth/authorize
|
|
// @scope.write Grants write access
|
|
// @scope.admin Grants read and write access to administrative information
|
|
|
|
// @securitydefinitions.oauth2.password OAuth2Password
|
|
// @tokenUrl https://example.com/oauth/token
|
|
// @scope.read Grants read access
|
|
// @scope.write Grants write access
|
|
// @scope.admin Grants read and write access to administrative information
|
|
|
|
// @securitydefinitions.oauth2.accessCode OAuth2AccessCode
|
|
// @tokenUrl https://example.com/oauth/token
|
|
// @authorizationurl https://example.com/oauth/authorize
|
|
// @scope.admin Grants read and write access to administrative information
|
|
func main() {}
|
|
`
|
|
testFormat(t, "main.go", contents, want)
|
|
}
|
|
|
|
func Test_FormatMultipleFunctions(t *testing.T) {
|
|
contents := `package main
|
|
|
|
// @Produce json
|
|
// @Success 200 {object} string
|
|
// @Failure 400 {object} string
|
|
func A() {}
|
|
|
|
// @Description Description of B.
|
|
// @Produce json
|
|
// @Success 200 {array} string
|
|
// @Failure 400 {object} string
|
|
func B() {}`
|
|
|
|
want := `package main
|
|
|
|
// @Produce json
|
|
// @Success 200 {object} string
|
|
// @Failure 400 {object} string
|
|
func A() {}
|
|
|
|
// @Description Description of B.
|
|
// @Produce json
|
|
// @Success 200 {array} string
|
|
// @Failure 400 {object} string
|
|
func B() {}
|
|
`
|
|
|
|
testFormat(t, "main.go", contents, want)
|
|
}
|
|
|
|
func Test_FormatApi(t *testing.T) {
|
|
contents := `package api
|
|
|
|
import "net/http"
|
|
|
|
// @Summary Add a new pet to the store
|
|
// @Description get string by ID
|
|
// @ID get-string-by-int
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param some_id path int true "Some ID" Format(int64)
|
|
// @Param some_id body web.Pet true "Some ID"
|
|
// @Success 200 {string} string "ok"
|
|
// @Failure 400 {object} web.APIError "We need ID!!"
|
|
// @Failure 404 {object} web.APIError "Can not find ID"
|
|
// @Router /testapi/get-string-by-int/{some_id} [get]
|
|
func GetStringByInt(w http.ResponseWriter, r *http.Request) {}`
|
|
|
|
want := `package api
|
|
|
|
import "net/http"
|
|
|
|
// @Summary Add a new pet to the store
|
|
// @Description get string by ID
|
|
// @ID get-string-by-int
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param some_id path int true "Some ID" Format(int64)
|
|
// @Param some_id body web.Pet true "Some ID"
|
|
// @Success 200 {string} string "ok"
|
|
// @Failure 400 {object} web.APIError "We need ID!!"
|
|
// @Failure 404 {object} web.APIError "Can not find ID"
|
|
// @Router /testapi/get-string-by-int/{some_id} [get]
|
|
func GetStringByInt(w http.ResponseWriter, r *http.Request) {}
|
|
`
|
|
|
|
testFormat(t, "api.go", contents, want)
|
|
}
|
|
|
|
func Test_NonSwagComment(t *testing.T) {
|
|
contents := `package api
|
|
|
|
// @Summary Add a new pet to the store
|
|
// @Description get string by ID
|
|
// @ID get-string-by-int
|
|
// @ Accept json
|
|
// This is not a @swag comment`
|
|
want := `package api
|
|
|
|
// @Summary Add a new pet to the store
|
|
// @Description get string by ID
|
|
// @ID get-string-by-int
|
|
// @ Accept json
|
|
// This is not a @swag comment
|
|
`
|
|
|
|
testFormat(t, "non_swag.go", contents, want)
|
|
}
|
|
|
|
func Test_EmptyComment(t *testing.T) {
|
|
contents := `package empty
|
|
|
|
// @Summary Add a new pet to the store
|
|
// @Description `
|
|
want := `package empty
|
|
|
|
// @Summary Add a new pet to the store
|
|
// @Description
|
|
`
|
|
|
|
testFormat(t, "empty.go", contents, want)
|
|
}
|
|
|
|
func Test_AlignAttribute(t *testing.T) {
|
|
contents := `package align
|
|
|
|
// @Summary Add a new pet to the store
|
|
// @Description Description`
|
|
want := `package align
|
|
|
|
// @Summary Add a new pet to the store
|
|
// @Description Description
|
|
`
|
|
|
|
testFormat(t, "align.go", contents, want)
|
|
}
|
|
|
|
func Test_SyntaxError(t *testing.T) {
|
|
contents := []byte(`package invalid
|
|
func invalid() {`)
|
|
|
|
_, err := NewFormatter().Format("invalid.go", contents)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func Test_splitComment2(t *testing.T) {
|
|
type args struct {
|
|
attr string
|
|
body string
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want string
|
|
}{
|
|
{
|
|
"test_splitComment2_1",
|
|
args{
|
|
attr: "@param",
|
|
body: " data body web.GenericBodyMulti[[]types.Post, [][]types.Post]",
|
|
},
|
|
"\tdata\tbody\tweb.GenericBodyMulti[[]types.Post, [][]types.Post]",
|
|
},
|
|
{
|
|
"test_splitComment2_2",
|
|
args{
|
|
attr: "@param",
|
|
body: ` some_id path int true "Some ID" Format(int64)`,
|
|
},
|
|
"\tsome_id\tpath\tint\ttrue\t\"Some ID\"\tFormat(int64)",
|
|
},
|
|
{
|
|
"test_splitComment2_3",
|
|
args{
|
|
attr: "@param",
|
|
body: ` @Param some_id body web.Pet true "Some ID"`,
|
|
},
|
|
"\t@Param\tsome_id\tbody\tweb.Pet\ttrue\t\"Some ID\"",
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
assert.Equalf(t, tt.want, splitComment2(tt.args.attr, tt.args.body), "splitComment2(%v, %v)", tt.args.attr, tt.args.body)
|
|
})
|
|
}
|
|
}
|