Files
atomctl/pkg/swag/formatter_test.go
2024-12-23 15:58:17 +08:00

282 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)
})
}
}