285 lines
7.1 KiB
Go
285 lines
7.1 KiB
Go
|
package swagger
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/emicklei/go-restful"
|
||
|
"github.com/emicklei/go-restful/swagger/test_package"
|
||
|
)
|
||
|
|
||
|
func TestInfoStruct_Issue231(t *testing.T) {
|
||
|
config := Config{
|
||
|
Info: Info{
|
||
|
Title: "Title",
|
||
|
Description: "Description",
|
||
|
TermsOfServiceUrl: "http://example.com",
|
||
|
Contact: "example@example.com",
|
||
|
License: "License",
|
||
|
LicenseUrl: "http://example.com/license.txt",
|
||
|
},
|
||
|
}
|
||
|
sws := newSwaggerService(config)
|
||
|
str, err := json.MarshalIndent(sws.produceListing(), "", " ")
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
compareJson(t, string(str), `
|
||
|
{
|
||
|
"apiVersion": "",
|
||
|
"swaggerVersion": "1.2",
|
||
|
"apis": null,
|
||
|
"info": {
|
||
|
"title": "Title",
|
||
|
"description": "Description",
|
||
|
"termsOfServiceUrl": "http://example.com",
|
||
|
"contact": "example@example.com",
|
||
|
"license": "License",
|
||
|
"licenseUrl": "http://example.com/license.txt"
|
||
|
}
|
||
|
}
|
||
|
`)
|
||
|
}
|
||
|
|
||
|
// go test -v -test.run TestThatMultiplePathsOnRootAreHandled ...swagger
|
||
|
func TestThatMultiplePathsOnRootAreHandled(t *testing.T) {
|
||
|
ws1 := new(restful.WebService)
|
||
|
ws1.Route(ws1.GET("/_ping").To(dummy))
|
||
|
ws1.Route(ws1.GET("/version").To(dummy))
|
||
|
|
||
|
cfg := Config{
|
||
|
WebServicesUrl: "http://here.com",
|
||
|
ApiPath: "/apipath",
|
||
|
WebServices: []*restful.WebService{ws1},
|
||
|
}
|
||
|
sws := newSwaggerService(cfg)
|
||
|
decl := sws.composeDeclaration(ws1, "/")
|
||
|
if got, want := len(decl.Apis), 2; got != want {
|
||
|
t.Errorf("got %v want %v", got, want)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestWriteSamples(t *testing.T) {
|
||
|
ws1 := new(restful.WebService)
|
||
|
ws1.Route(ws1.GET("/object").To(dummy).Writes(test_package.TestStruct{}))
|
||
|
ws1.Route(ws1.GET("/array").To(dummy).Writes([]test_package.TestStruct{}))
|
||
|
ws1.Route(ws1.GET("/object_and_array").To(dummy).Writes(struct{ Abc test_package.TestStruct }{}))
|
||
|
|
||
|
cfg := Config{
|
||
|
WebServicesUrl: "http://here.com",
|
||
|
ApiPath: "/apipath",
|
||
|
WebServices: []*restful.WebService{ws1},
|
||
|
}
|
||
|
sws := newSwaggerService(cfg)
|
||
|
|
||
|
decl := sws.composeDeclaration(ws1, "/")
|
||
|
|
||
|
str, err := json.MarshalIndent(decl.Apis, "", " ")
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
compareJson(t, string(str), `
|
||
|
[
|
||
|
{
|
||
|
"path": "/object",
|
||
|
"description": "",
|
||
|
"operations": [
|
||
|
{
|
||
|
"type": "test_package.TestStruct",
|
||
|
"method": "GET",
|
||
|
"nickname": "dummy",
|
||
|
"parameters": []
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"path": "/array",
|
||
|
"description": "",
|
||
|
"operations": [
|
||
|
{
|
||
|
"type": "array",
|
||
|
"items": {
|
||
|
"$ref": "test_package.TestStruct"
|
||
|
},
|
||
|
"method": "GET",
|
||
|
"nickname": "dummy",
|
||
|
"parameters": []
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"path": "/object_and_array",
|
||
|
"description": "",
|
||
|
"operations": [
|
||
|
{
|
||
|
"type": "struct { Abc test_package.TestStruct }",
|
||
|
"method": "GET",
|
||
|
"nickname": "dummy",
|
||
|
"parameters": []
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
]`)
|
||
|
|
||
|
str, err = json.MarshalIndent(decl.Models, "", " ")
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
compareJson(t, string(str), `
|
||
|
{
|
||
|
"test_package.TestStruct": {
|
||
|
"id": "test_package.TestStruct",
|
||
|
"required": [
|
||
|
"TestField"
|
||
|
],
|
||
|
"properties": {
|
||
|
"TestField": {
|
||
|
"type": "string"
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
"||test_package.TestStruct": {
|
||
|
"id": "||test_package.TestStruct",
|
||
|
"properties": {}
|
||
|
},
|
||
|
"struct { Abc test_package.TestStruct }": {
|
||
|
"id": "struct { Abc test_package.TestStruct }",
|
||
|
"required": [
|
||
|
"Abc"
|
||
|
],
|
||
|
"properties": {
|
||
|
"Abc": {
|
||
|
"$ref": "test_package.TestStruct"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}`)
|
||
|
}
|
||
|
|
||
|
// go test -v -test.run TestServiceToApi ...swagger
|
||
|
func TestServiceToApi(t *testing.T) {
|
||
|
ws := new(restful.WebService)
|
||
|
ws.Path("/tests")
|
||
|
ws.Consumes(restful.MIME_JSON)
|
||
|
ws.Produces(restful.MIME_XML)
|
||
|
ws.Route(ws.GET("/a").To(dummy).Writes(sample{}))
|
||
|
ws.Route(ws.PUT("/b").To(dummy).Writes(sample{}))
|
||
|
ws.Route(ws.POST("/c").To(dummy).Writes(sample{}))
|
||
|
ws.Route(ws.DELETE("/d").To(dummy).Writes(sample{}))
|
||
|
|
||
|
ws.Route(ws.GET("/d").To(dummy).Writes(sample{}))
|
||
|
ws.Route(ws.PUT("/c").To(dummy).Writes(sample{}))
|
||
|
ws.Route(ws.POST("/b").To(dummy).Writes(sample{}))
|
||
|
ws.Route(ws.DELETE("/a").To(dummy).Writes(sample{}))
|
||
|
ws.ApiVersion("1.2.3")
|
||
|
cfg := Config{
|
||
|
WebServicesUrl: "http://here.com",
|
||
|
ApiPath: "/apipath",
|
||
|
WebServices: []*restful.WebService{ws},
|
||
|
PostBuildHandler: func(in *ApiDeclarationList) {},
|
||
|
}
|
||
|
sws := newSwaggerService(cfg)
|
||
|
decl := sws.composeDeclaration(ws, "/tests")
|
||
|
// checks
|
||
|
if decl.ApiVersion != "1.2.3" {
|
||
|
t.Errorf("got %v want %v", decl.ApiVersion, "1.2.3")
|
||
|
}
|
||
|
if decl.BasePath != "http://here.com" {
|
||
|
t.Errorf("got %v want %v", decl.BasePath, "http://here.com")
|
||
|
}
|
||
|
if len(decl.Apis) != 4 {
|
||
|
t.Errorf("got %v want %v", len(decl.Apis), 4)
|
||
|
}
|
||
|
pathOrder := ""
|
||
|
for _, each := range decl.Apis {
|
||
|
pathOrder += each.Path
|
||
|
for _, other := range each.Operations {
|
||
|
pathOrder += other.Method
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if pathOrder != "/tests/aGETDELETE/tests/bPUTPOST/tests/cPOSTPUT/tests/dDELETEGET" {
|
||
|
t.Errorf("got %v want %v", pathOrder, "see test source")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func dummy(i *restful.Request, o *restful.Response) {}
|
||
|
|
||
|
// go test -v -test.run TestIssue78 ...swagger
|
||
|
type Response struct {
|
||
|
Code int
|
||
|
Users *[]User
|
||
|
Items *[]TestItem
|
||
|
}
|
||
|
type User struct {
|
||
|
Id, Name string
|
||
|
}
|
||
|
type TestItem struct {
|
||
|
Id, Name string
|
||
|
}
|
||
|
|
||
|
// clear && go test -v -test.run TestComposeResponseMessages ...swagger
|
||
|
func TestComposeResponseMessages(t *testing.T) {
|
||
|
responseErrors := map[int]restful.ResponseError{}
|
||
|
responseErrors[400] = restful.ResponseError{Code: 400, Message: "Bad Request", Model: TestItem{}}
|
||
|
route := restful.Route{ResponseErrors: responseErrors}
|
||
|
decl := new(ApiDeclaration)
|
||
|
decl.Models = ModelList{}
|
||
|
msgs := composeResponseMessages(route, decl, &Config{})
|
||
|
if msgs[0].ResponseModel != "swagger.TestItem" {
|
||
|
t.Errorf("got %s want swagger.TestItem", msgs[0].ResponseModel)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// clear && go test -v -test.run TestComposeResponseMessageArray ...swagger
|
||
|
func TestComposeResponseMessageArray(t *testing.T) {
|
||
|
responseErrors := map[int]restful.ResponseError{}
|
||
|
responseErrors[400] = restful.ResponseError{Code: 400, Message: "Bad Request", Model: []TestItem{}}
|
||
|
route := restful.Route{ResponseErrors: responseErrors}
|
||
|
decl := new(ApiDeclaration)
|
||
|
decl.Models = ModelList{}
|
||
|
msgs := composeResponseMessages(route, decl, &Config{})
|
||
|
if msgs[0].ResponseModel != "array[swagger.TestItem]" {
|
||
|
t.Errorf("got %s want swagger.TestItem", msgs[0].ResponseModel)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestIssue78(t *testing.T) {
|
||
|
sws := newSwaggerService(Config{})
|
||
|
models := new(ModelList)
|
||
|
sws.addModelFromSampleTo(&Operation{}, true, Response{Items: &[]TestItem{}}, models)
|
||
|
model, ok := models.At("swagger.Response")
|
||
|
if !ok {
|
||
|
t.Fatal("missing response model")
|
||
|
}
|
||
|
if "swagger.Response" != model.Id {
|
||
|
t.Fatal("wrong model id:" + model.Id)
|
||
|
}
|
||
|
code, ok := model.Properties.At("Code")
|
||
|
if !ok {
|
||
|
t.Fatal("missing code")
|
||
|
}
|
||
|
if "integer" != *code.Type {
|
||
|
t.Fatal("wrong code type:" + *code.Type)
|
||
|
}
|
||
|
items, ok := model.Properties.At("Items")
|
||
|
if !ok {
|
||
|
t.Fatal("missing items")
|
||
|
}
|
||
|
if "array" != *items.Type {
|
||
|
t.Fatal("wrong items type:" + *items.Type)
|
||
|
}
|
||
|
items_items := items.Items
|
||
|
if items_items == nil {
|
||
|
t.Fatal("missing items->items")
|
||
|
}
|
||
|
ref := items_items.Ref
|
||
|
if ref == nil {
|
||
|
t.Fatal("missing $ref")
|
||
|
}
|
||
|
if *ref != "swagger.TestItem" {
|
||
|
t.Fatal("wrong $ref:" + *ref)
|
||
|
}
|
||
|
}
|