mirror of
https://github.com/davidebianchi/gswagger.git
synced 2026-01-08 07:08:36 -05:00
Compare commits
1 Commits
main
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
11adeed5bb |
4
.github/workflows/test-builds.yml
vendored
4
.github/workflows/test-builds.yml
vendored
@@ -9,10 +9,10 @@ jobs:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
go_version: ['1.24', '1.25']
|
||||
go_version: ['1.20', '1.21']
|
||||
os: [ubuntu-latest]
|
||||
include:
|
||||
- go_version: '1.25'
|
||||
- go_version: '1.21'
|
||||
os: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
@@ -7,12 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## Unreleased
|
||||
|
||||
## 0.10.1 - 06-10-2025
|
||||
|
||||
### Refactor
|
||||
|
||||
- renamed swagger to openapi in error messages
|
||||
|
||||
## 0.10.0 - 28-02-2024
|
||||
|
||||
### BREAKING CHANGES
|
||||
|
||||
7
go.mod
7
go.mod
@@ -1,9 +1,9 @@
|
||||
module github.com/davidebianchi/gswagger
|
||||
|
||||
go 1.24
|
||||
go 1.20
|
||||
|
||||
require (
|
||||
github.com/getkin/kin-openapi v0.131.0
|
||||
github.com/getkin/kin-openapi v0.127.0
|
||||
github.com/ghodss/yaml v1.0.0
|
||||
github.com/gofiber/fiber/v2 v2.52.5
|
||||
github.com/gorilla/mux v1.8.1
|
||||
@@ -20,6 +20,7 @@ require (
|
||||
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
||||
github.com/go-openapi/swag v0.23.0 // indirect
|
||||
github.com/google/uuid v1.5.0 // indirect
|
||||
github.com/invopop/yaml v0.3.1 // indirect
|
||||
github.com/josharian/intern v1.0.0 // indirect
|
||||
github.com/klauspost/compress v1.17.0 // indirect
|
||||
github.com/labstack/gommon v0.4.2 // indirect
|
||||
@@ -28,8 +29,6 @@ require (
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.15 // indirect
|
||||
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
|
||||
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect
|
||||
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect
|
||||
github.com/perimeterx/marshmallow v1.1.5 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/rivo/uniseg v0.2.0 // indirect
|
||||
|
||||
16
go.sum
16
go.sum
@@ -6,8 +6,8 @@ github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMU
|
||||
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/getkin/kin-openapi v0.131.0 h1:NO2UeHnFKRYhZ8wg6Nyh5Cq7dHk4suQQr72a4pMrDxE=
|
||||
github.com/getkin/kin-openapi v0.131.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58=
|
||||
github.com/getkin/kin-openapi v0.127.0 h1:Mghqi3Dhryf3F8vR370nN67pAERW+3a95vomb3MAREY=
|
||||
github.com/getkin/kin-openapi v0.127.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM=
|
||||
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
|
||||
@@ -15,7 +15,6 @@ github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kO
|
||||
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
|
||||
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
|
||||
github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
|
||||
github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
|
||||
github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo=
|
||||
github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=
|
||||
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
|
||||
@@ -24,14 +23,14 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
|
||||
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
|
||||
github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI=
|
||||
github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
|
||||
github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso=
|
||||
github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA=
|
||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
||||
github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM=
|
||||
github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/labstack/echo/v4 v4.12.0 h1:IKpw49IMryVB2p1a4dzwlhP1O2Tf2E0Ir/450lH+kI0=
|
||||
github.com/labstack/echo/v4 v4.12.0/go.mod h1:UP9Cr2DJXbOK3Kr9ONYzNowSh7HP0aG0ShAyycHSJvM=
|
||||
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
|
||||
@@ -47,10 +46,6 @@ github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZ
|
||||
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
|
||||
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
|
||||
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY=
|
||||
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw=
|
||||
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c=
|
||||
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o=
|
||||
github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s=
|
||||
github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
@@ -58,11 +53,9 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
|
||||
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
|
||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
|
||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
|
||||
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
|
||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||
github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA=
|
||||
@@ -85,7 +78,6 @@ golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
|
||||
61
main.go
61
main.go
@@ -13,26 +13,21 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
// ErrGenerateOAS throws when fails the marshalling of the swagger struct.
|
||||
ErrGenerateOAS = errors.New("fail to generate openapi")
|
||||
// ErrValidatingOAS throws when given openapi params are not correct.
|
||||
ErrValidatingOAS = errors.New("fails to validate openapi")
|
||||
|
||||
// Deprecated: ErrGenerateSwagger has been deprecated, use ErrGenerateOAS instead.
|
||||
ErrGenerateSwagger = ErrGenerateOAS
|
||||
// Deprecated: ErrValidatingSwagger has been deprecated, use ErrValidatingOAS instead.
|
||||
ErrValidatingSwagger = ErrValidatingOAS
|
||||
// ErrGenerateSwagger throws when fails the marshalling of the swagger struct.
|
||||
ErrGenerateSwagger = errors.New("fail to generate swagger")
|
||||
// ErrValidatingSwagger throws when given swagger params are not correct.
|
||||
ErrValidatingSwagger = errors.New("fails to validate swagger")
|
||||
)
|
||||
|
||||
const (
|
||||
// DefaultJSONDocumentationPath is the path of the openapi documentation in json format.
|
||||
// DefaultJSONDocumentationPath is the path of the swagger documentation in json format.
|
||||
DefaultJSONDocumentationPath = "/documentation/json"
|
||||
// DefaultYAMLDocumentationPath is the path of the openapi documentation in yaml format.
|
||||
// DefaultYAMLDocumentationPath is the path of the swagger documentation in yaml format.
|
||||
DefaultYAMLDocumentationPath = "/documentation/yaml"
|
||||
defaultOpenapiVersion = "3.0.0"
|
||||
)
|
||||
|
||||
// Router handle the api router and the openapi schema.
|
||||
// Router handle the api router and the swagger schema.
|
||||
// api router supported out of the box are:
|
||||
// - gorilla mux
|
||||
type Router[HandlerFunc, Route any] struct {
|
||||
@@ -56,11 +51,11 @@ type Options struct {
|
||||
PathPrefix string
|
||||
}
|
||||
|
||||
// NewRouter generate new router with openapi. Default to OpenAPI 3.0.0
|
||||
// NewRouter generate new router with swagger. Default to OpenAPI 3.0.0
|
||||
func NewRouter[HandlerFunc, Route any](router apirouter.Router[HandlerFunc, Route], options Options) (*Router[HandlerFunc, Route], error) {
|
||||
openapi, err := generateNewValidOpenapi(options.Openapi)
|
||||
swagger, err := generateNewValidOpenapi(options.Openapi)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: %s", ErrValidatingOAS, err)
|
||||
return nil, fmt.Errorf("%w: %s", ErrValidatingSwagger, err)
|
||||
}
|
||||
|
||||
var ctx = options.Context
|
||||
@@ -86,7 +81,7 @@ func NewRouter[HandlerFunc, Route any](router apirouter.Router[HandlerFunc, Rout
|
||||
|
||||
return &Router[HandlerFunc, Route]{
|
||||
router: router,
|
||||
swaggerSchema: openapi,
|
||||
swaggerSchema: swagger,
|
||||
context: ctx,
|
||||
yamlDocumentationPath: yamlDocumentationPath,
|
||||
jsonDocumentationPath: jsonDocumentationPath,
|
||||
@@ -109,46 +104,46 @@ func (r Router[HandlerFunc, Route]) SubRouter(router apirouter.Router[HandlerFun
|
||||
}, nil
|
||||
}
|
||||
|
||||
func generateNewValidOpenapi(openapi *openapi3.T) (*openapi3.T, error) {
|
||||
if openapi == nil {
|
||||
return nil, fmt.Errorf("openapi is required")
|
||||
func generateNewValidOpenapi(swagger *openapi3.T) (*openapi3.T, error) {
|
||||
if swagger == nil {
|
||||
return nil, fmt.Errorf("swagger is required")
|
||||
}
|
||||
if openapi.OpenAPI == "" {
|
||||
openapi.OpenAPI = defaultOpenapiVersion
|
||||
if swagger.OpenAPI == "" {
|
||||
swagger.OpenAPI = defaultOpenapiVersion
|
||||
}
|
||||
if openapi.Paths == nil {
|
||||
openapi.Paths = &openapi3.Paths{}
|
||||
if swagger.Paths == nil {
|
||||
swagger.Paths = &openapi3.Paths{}
|
||||
}
|
||||
|
||||
if openapi.Info == nil {
|
||||
return nil, fmt.Errorf("openapi info is required")
|
||||
if swagger.Info == nil {
|
||||
return nil, fmt.Errorf("swagger info is required")
|
||||
}
|
||||
if openapi.Info.Title == "" {
|
||||
return nil, fmt.Errorf("openapi info title is required")
|
||||
if swagger.Info.Title == "" {
|
||||
return nil, fmt.Errorf("swagger info title is required")
|
||||
}
|
||||
if openapi.Info.Version == "" {
|
||||
return nil, fmt.Errorf("openapi info version is required")
|
||||
if swagger.Info.Version == "" {
|
||||
return nil, fmt.Errorf("swagger info version is required")
|
||||
}
|
||||
|
||||
return openapi, nil
|
||||
return swagger, nil
|
||||
}
|
||||
|
||||
// GenerateAndExposeOpenapi creates a /documentation/json route on router and
|
||||
// expose the generated swagger
|
||||
func (r Router[_, _]) GenerateAndExposeOpenapi() error {
|
||||
if err := r.swaggerSchema.Validate(r.context); err != nil {
|
||||
return fmt.Errorf("%w: %s", ErrValidatingOAS, err)
|
||||
return fmt.Errorf("%w: %s", ErrValidatingSwagger, err)
|
||||
}
|
||||
|
||||
jsonSwagger, err := r.swaggerSchema.MarshalJSON()
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w json marshal: %s", ErrGenerateOAS, err)
|
||||
return fmt.Errorf("%w json marshal: %s", ErrGenerateSwagger, err)
|
||||
}
|
||||
r.router.AddRoute(http.MethodGet, r.jsonDocumentationPath, r.router.SwaggerHandler("application/json", jsonSwagger))
|
||||
|
||||
yamlSwagger, err := yaml.JSONToYAML(jsonSwagger)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w yaml marshal: %s", ErrGenerateOAS, err)
|
||||
return fmt.Errorf("%w yaml marshal: %s", ErrGenerateSwagger, err)
|
||||
}
|
||||
r.router.AddRoute(http.MethodGet, r.yamlDocumentationPath, r.router.SwaggerHandler("text/plain", yamlSwagger))
|
||||
|
||||
|
||||
88
main_test.go
88
main_test.go
@@ -33,7 +33,7 @@ func TestNewRouter(t *testing.T) {
|
||||
r, err := NewRouter(mAPIRouter, Options{})
|
||||
|
||||
require.Nil(t, r)
|
||||
require.EqualError(t, err, fmt.Sprintf("%s: openapi is required", ErrValidatingOAS))
|
||||
require.EqualError(t, err, fmt.Sprintf("%s: swagger is required", ErrValidatingSwagger))
|
||||
})
|
||||
|
||||
t.Run("ok - with default context", func(t *testing.T) {
|
||||
@@ -119,50 +119,50 @@ func TestNewRouter(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGenerateValidSwagger(t *testing.T) {
|
||||
t.Run("not ok - empty openapi info", func(t *testing.T) {
|
||||
openapi := &openapi3.T{}
|
||||
t.Run("not ok - empty swagger info", func(t *testing.T) {
|
||||
swagger := &openapi3.T{}
|
||||
|
||||
openapi, err := generateNewValidOpenapi(openapi)
|
||||
require.Nil(t, openapi)
|
||||
require.EqualError(t, err, "openapi info is required")
|
||||
swagger, err := generateNewValidOpenapi(swagger)
|
||||
require.Nil(t, swagger)
|
||||
require.EqualError(t, err, "swagger info is required")
|
||||
})
|
||||
|
||||
t.Run("not ok - empty info title", func(t *testing.T) {
|
||||
openapi := &openapi3.T{
|
||||
swagger := &openapi3.T{
|
||||
Info: &openapi3.Info{},
|
||||
}
|
||||
|
||||
openapi, err := generateNewValidOpenapi(openapi)
|
||||
require.Nil(t, openapi)
|
||||
require.EqualError(t, err, "openapi info title is required")
|
||||
swagger, err := generateNewValidOpenapi(swagger)
|
||||
require.Nil(t, swagger)
|
||||
require.EqualError(t, err, "swagger info title is required")
|
||||
})
|
||||
|
||||
t.Run("not ok - empty info version", func(t *testing.T) {
|
||||
openapi := &openapi3.T{
|
||||
swagger := &openapi3.T{
|
||||
Info: &openapi3.Info{
|
||||
Title: "title",
|
||||
},
|
||||
}
|
||||
|
||||
openapi, err := generateNewValidOpenapi(openapi)
|
||||
require.Nil(t, openapi)
|
||||
require.EqualError(t, err, "openapi info version is required")
|
||||
swagger, err := generateNewValidOpenapi(swagger)
|
||||
require.Nil(t, swagger)
|
||||
require.EqualError(t, err, "swagger info version is required")
|
||||
})
|
||||
|
||||
t.Run("ok - custom openapi", func(t *testing.T) {
|
||||
openapi := &openapi3.T{
|
||||
t.Run("ok - custom swagger", func(t *testing.T) {
|
||||
swagger := &openapi3.T{
|
||||
Info: &openapi3.Info{},
|
||||
}
|
||||
|
||||
openapi, err := generateNewValidOpenapi(openapi)
|
||||
require.Nil(t, openapi)
|
||||
require.EqualError(t, err, "openapi info title is required")
|
||||
swagger, err := generateNewValidOpenapi(swagger)
|
||||
require.Nil(t, swagger)
|
||||
require.EqualError(t, err, "swagger info title is required")
|
||||
})
|
||||
|
||||
t.Run("not ok - openapi is required", func(t *testing.T) {
|
||||
openapi, err := generateNewValidOpenapi(nil)
|
||||
require.Nil(t, openapi)
|
||||
require.EqualError(t, err, "openapi is required")
|
||||
t.Run("not ok - swagger is required", func(t *testing.T) {
|
||||
swagger, err := generateNewValidOpenapi(nil)
|
||||
require.Nil(t, swagger)
|
||||
require.EqualError(t, err, "swagger is required")
|
||||
})
|
||||
|
||||
t.Run("ok", func(t *testing.T) {
|
||||
@@ -170,22 +170,22 @@ func TestGenerateValidSwagger(t *testing.T) {
|
||||
Title: "my title",
|
||||
Version: "my version",
|
||||
}
|
||||
openapi := &openapi3.T{
|
||||
swagger := &openapi3.T{
|
||||
Info: info,
|
||||
}
|
||||
|
||||
openapi, err := generateNewValidOpenapi(openapi)
|
||||
swagger, err := generateNewValidOpenapi(swagger)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, &openapi3.T{
|
||||
OpenAPI: defaultOpenapiVersion,
|
||||
Info: info,
|
||||
Paths: &openapi3.Paths{},
|
||||
}, openapi)
|
||||
}, swagger)
|
||||
})
|
||||
}
|
||||
|
||||
func TestGenerateAndExposeSwagger(t *testing.T) {
|
||||
t.Run("fails openapi validation", func(t *testing.T) {
|
||||
t.Run("fails swagger validation", func(t *testing.T) {
|
||||
mRouter := mux.NewRouter()
|
||||
router, err := NewRouter(gorilla.NewRouter(mRouter), Options{
|
||||
Openapi: &openapi3.T{
|
||||
@@ -204,17 +204,17 @@ func TestGenerateAndExposeSwagger(t *testing.T) {
|
||||
|
||||
err = router.GenerateAndExposeOpenapi()
|
||||
require.Error(t, err)
|
||||
require.True(t, strings.HasPrefix(err.Error(), fmt.Sprintf("%s:", ErrValidatingOAS)))
|
||||
require.True(t, strings.HasPrefix(err.Error(), fmt.Sprintf("%s:", ErrValidatingSwagger)))
|
||||
})
|
||||
|
||||
t.Run("correctly expose json documentation from loaded openapi file", func(t *testing.T) {
|
||||
t.Run("correctly expose json documentation from loaded swagger file", func(t *testing.T) {
|
||||
mRouter := mux.NewRouter()
|
||||
|
||||
openapi, err := openapi3.NewLoader().LoadFromFile("testdata/users_employees.json")
|
||||
swagger, err := openapi3.NewLoader().LoadFromFile("testdata/users_employees.json")
|
||||
require.NoError(t, err)
|
||||
|
||||
router, err := NewRouter(gorilla.NewRouter(mRouter), Options{
|
||||
Openapi: openapi,
|
||||
Openapi: swagger,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -234,14 +234,14 @@ func TestGenerateAndExposeSwagger(t *testing.T) {
|
||||
require.JSONEq(t, string(actual), body)
|
||||
})
|
||||
|
||||
t.Run("correctly expose json documentation from loaded openapi file - custom path", func(t *testing.T) {
|
||||
t.Run("correctly expose json documentation from loaded swagger file - custom path", func(t *testing.T) {
|
||||
mRouter := mux.NewRouter()
|
||||
|
||||
openapi, err := openapi3.NewLoader().LoadFromFile("testdata/users_employees.json")
|
||||
swagger, err := openapi3.NewLoader().LoadFromFile("testdata/users_employees.json")
|
||||
require.NoError(t, err)
|
||||
|
||||
router, err := NewRouter(gorilla.NewRouter(mRouter), Options{
|
||||
Openapi: openapi,
|
||||
Openapi: swagger,
|
||||
JSONDocumentationPath: "/custom/path",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@@ -262,14 +262,14 @@ func TestGenerateAndExposeSwagger(t *testing.T) {
|
||||
require.JSONEq(t, string(actual), body)
|
||||
})
|
||||
|
||||
t.Run("correctly expose yaml documentation from loaded openapi file", func(t *testing.T) {
|
||||
t.Run("correctly expose yaml documentation from loaded swagger file", func(t *testing.T) {
|
||||
mRouter := mux.NewRouter()
|
||||
|
||||
openapi, err := openapi3.NewLoader().LoadFromFile("testdata/users_employees.json")
|
||||
swagger, err := openapi3.NewLoader().LoadFromFile("testdata/users_employees.json")
|
||||
require.NoError(t, err)
|
||||
|
||||
router, err := NewRouter(gorilla.NewRouter(mRouter), Options{
|
||||
Openapi: openapi,
|
||||
Openapi: swagger,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -289,14 +289,14 @@ func TestGenerateAndExposeSwagger(t *testing.T) {
|
||||
require.YAMLEq(t, string(expected), body, string(body))
|
||||
})
|
||||
|
||||
t.Run("correctly expose yaml documentation from loaded openapi file - custom path", func(t *testing.T) {
|
||||
t.Run("correctly expose yaml documentation from loaded swagger file - custom path", func(t *testing.T) {
|
||||
mRouter := mux.NewRouter()
|
||||
|
||||
openapi, err := openapi3.NewLoader().LoadFromFile("testdata/users_employees.json")
|
||||
swagger, err := openapi3.NewLoader().LoadFromFile("testdata/users_employees.json")
|
||||
require.NoError(t, err)
|
||||
|
||||
router, err := NewRouter(gorilla.NewRouter(mRouter), Options{
|
||||
Openapi: openapi,
|
||||
Openapi: swagger,
|
||||
YAMLDocumentationPath: "/custom/path",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@@ -323,8 +323,8 @@ func TestGenerateAndExposeSwagger(t *testing.T) {
|
||||
router, err := NewRouter(gorilla.NewRouter(mRouter), Options{
|
||||
Openapi: &openapi3.T{
|
||||
Info: &openapi3.Info{
|
||||
Title: "test openapi title",
|
||||
Version: "test openapi version",
|
||||
Title: "test swagger title",
|
||||
Version: "test swagger version",
|
||||
},
|
||||
},
|
||||
JSONDocumentationPath: "/custom/path",
|
||||
@@ -402,8 +402,8 @@ func TestGenerateAndExposeSwagger(t *testing.T) {
|
||||
router, err := NewRouter(gorilla.NewRouter(mRouter), Options{
|
||||
Openapi: &openapi3.T{
|
||||
Info: &openapi3.Info{
|
||||
Title: "test openapi title",
|
||||
Version: "test openapi version",
|
||||
Title: "test swagger title",
|
||||
Version: "test swagger version",
|
||||
},
|
||||
},
|
||||
JSONDocumentationPath: "/custom/path",
|
||||
|
||||
@@ -27,7 +27,7 @@ func TestNewOperation(t *testing.T) {
|
||||
operation.Responses = openapi3.NewResponses()
|
||||
return operation
|
||||
},
|
||||
expectedJSON: `{"info":{"title":"test openapi title","version":"test openapi version"},"openapi":"3.0.0","paths":{"/":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"bar":{"maximum":15,"minimum":5,"type":"integer"},"foo":{"type":"string"}},"type":"object"}}}},"responses":{"default":{"description":""}}}}}}`,
|
||||
expectedJSON: `{"info":{"title":"test swagger title","version":"test swagger version"},"openapi":"3.0.0","paths":{"/":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"bar":{"maximum":15,"minimum":5,"type":"integer"},"foo":{"type":"string"}},"type":"object"}}}},"responses":{"default":{"description":""}}}}}}`,
|
||||
},
|
||||
{
|
||||
name: "add response",
|
||||
@@ -36,19 +36,19 @@ func TestNewOperation(t *testing.T) {
|
||||
operation.AddResponse(200, response)
|
||||
return operation
|
||||
},
|
||||
expectedJSON: `{"info":{"title":"test openapi title","version":"test openapi version"},"openapi":"3.0.0","paths":{"/":{"post":{"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"bar":{"maximum":15,"minimum":5,"type":"integer"},"foo":{"type":"string"}},"type":"object"}}},"description":""}}}}}}`,
|
||||
expectedJSON: `{"info":{"title":"test swagger title","version":"test swagger version"},"openapi":"3.0.0","paths":{"/":{"post":{"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"bar":{"maximum":15,"minimum":5,"type":"integer"},"foo":{"type":"string"}},"type":"object"}}},"description":""}}}}}}`,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
openapi := getBaseSwagger(t)
|
||||
openapi.OpenAPI = "3.0.0"
|
||||
swagger := getBaseSwagger(t)
|
||||
swagger.OpenAPI = "3.0.0"
|
||||
operation := test.getOperation(t, NewOperation())
|
||||
|
||||
openapi.AddOperation("/", http.MethodPost, operation.Operation)
|
||||
swagger.AddOperation("/", http.MethodPost, operation.Operation)
|
||||
|
||||
data, _ := openapi.MarshalJSON()
|
||||
data, _ := swagger.MarshalJSON()
|
||||
jsonData := string(data)
|
||||
require.JSONEq(t, test.expectedJSON, jsonData, "actual json data: %s", jsonData)
|
||||
})
|
||||
|
||||
2
route.go
2
route.go
@@ -24,7 +24,7 @@ var (
|
||||
)
|
||||
|
||||
// AddRawRoute add route to router with specific method, path and handler. Add the
|
||||
// router also to the openapi schema, after validating it
|
||||
// router also to the swagger schema, after validating it
|
||||
func (r Router[HandlerFunc, Route]) AddRawRoute(method string, routePath string, handler HandlerFunc, operation Operation) (Route, error) {
|
||||
op := operation.Operation
|
||||
if op != nil {
|
||||
|
||||
@@ -533,7 +533,7 @@ func TestAddRoutes(t *testing.T) {
|
||||
require.Equal(t, "OK", body)
|
||||
}
|
||||
|
||||
t.Run("and generate openapi documentation in json", func(t *testing.T) {
|
||||
t.Run("and generate swagger documentation in json", func(t *testing.T) {
|
||||
w := httptest.NewRecorder()
|
||||
req := httptest.NewRequest(http.MethodGet, DefaultJSONDocumentationPath, nil)
|
||||
|
||||
@@ -1116,8 +1116,8 @@ func getBaseSwagger(t *testing.T) *openapi3.T {
|
||||
|
||||
return &openapi3.T{
|
||||
Info: &openapi3.Info{
|
||||
Title: "test openapi title",
|
||||
Version: "test openapi version",
|
||||
Title: "test swagger title",
|
||||
Version: "test swagger version",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,8 +17,8 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
swaggerOpenapiTitle = "test openapi title"
|
||||
swaggerOpenapiVersion = "test openapi version"
|
||||
swaggerOpenapiTitle = "test swagger title"
|
||||
swaggerOpenapiVersion = "test swagger version"
|
||||
)
|
||||
|
||||
type echoSwaggerRouter = swagger.Router[echo.HandlerFunc, *echo.Route]
|
||||
|
||||
@@ -19,8 +19,8 @@ import (
|
||||
type SwaggerRouter = swagger.Router[oasFiber.HandlerFunc, oasFiber.Route]
|
||||
|
||||
const (
|
||||
swaggerOpenapiTitle = "test openapi title"
|
||||
swaggerOpenapiVersion = "test openapi version"
|
||||
swaggerOpenapiTitle = "test swagger title"
|
||||
swaggerOpenapiVersion = "test swagger version"
|
||||
)
|
||||
|
||||
func TestFiberIntegration(t *testing.T) {
|
||||
|
||||
@@ -16,8 +16,8 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
swaggerOpenapiTitle = "test openapi title"
|
||||
swaggerOpenapiVersion = "test openapi version"
|
||||
swaggerOpenapiTitle = "test swagger title"
|
||||
swaggerOpenapiVersion = "test swagger version"
|
||||
)
|
||||
|
||||
type SwaggerRouter = swagger.Router[gorilla.HandlerFunc, gorilla.Route]
|
||||
|
||||
4
support/testdata/integration.json
vendored
4
support/testdata/integration.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
support/testdata/intergation-subrouter.json
vendored
4
support/testdata/intergation-subrouter.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/allof.json
vendored
4
testdata/allof.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/anyof.json
vendored
4
testdata/anyof.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/cookies.json
vendored
4
testdata/cookies.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/empty-route-schema.json
vendored
4
testdata/empty-route-schema.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/empty.json
vendored
4
testdata/empty.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {}
|
||||
|
||||
4
testdata/extension.json
vendored
4
testdata/extension.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/headers.json
vendored
4
testdata/headers.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/multipart-requestbody.json
vendored
4
testdata/multipart-requestbody.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/oneOf.json
vendored
4
testdata/oneOf.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/params-autofill.json
vendored
4
testdata/params-autofill.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/params.json
vendored
4
testdata/params.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/query.json
vendored
4
testdata/query.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/router_with_prefix.json
vendored
4
testdata/router_with_prefix.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/schema-no-content.json
vendored
4
testdata/schema-no-content.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/security.json
vendored
4
testdata/security.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/subrouter.json
vendored
4
testdata/subrouter.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/tags.json
vendored
4
testdata/tags.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/users_employees.json
vendored
4
testdata/users_employees.json
vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"info": {
|
||||
"title": "test openapi title",
|
||||
"version": "test openapi version"
|
||||
"title": "test swagger title",
|
||||
"version": "test swagger version"
|
||||
},
|
||||
"openapi": "3.0.0",
|
||||
"paths": {
|
||||
|
||||
4
testdata/users_employees.yaml
vendored
4
testdata/users_employees.yaml
vendored
@@ -1,6 +1,6 @@
|
||||
info:
|
||||
title: test openapi title
|
||||
version: test openapi version
|
||||
title: test swagger title
|
||||
version: test swagger version
|
||||
openapi: 3.0.0
|
||||
paths:
|
||||
/employees:
|
||||
|
||||
Reference in New Issue
Block a user