diff --git a/doc/action.go b/doc/action.go index d9e9b96..87995f2 100644 --- a/doc/action.go +++ b/doc/action.go @@ -1,6 +1,7 @@ package doc import ( + "net/http" "strings" "text/template" @@ -10,9 +11,9 @@ import ( var ( actionTmpl *template.Template actionFmt = `### {{.Title}} [{{.Method}}] -{{.Description}}{{range $req, $resp := .Requests}} -{{with $req}}{{.Render}}{{end}} -{{with $resp}}{{.Render}}{{end}}{{end}}` +{{.Description}}{{range $req := .Requests}} +{{with $req}}{{.Render}} +{{.Response.Render}}{{end}}{{end}}` ) func init() { @@ -23,10 +24,28 @@ type Action struct { Title string Description string Method HTTPMethod - Requests map[*Request]*Response + Requests []*Request } func (a *Action) Render() string { + reqsMap := map[int][]*Request{} + for i, req := range a.Requests { + if reqsMap[req.Response.StatusCode] == nil { + reqsMap[req.Response.StatusCode] = []*Request{} + } + + reqsMap[req.Response.StatusCode] = append(reqsMap[req.Response.StatusCode], a.Requests[i]) + } + + sortedReqs := reqsMap[http.StatusOK] + delete(reqsMap, http.StatusOK) + + for _, reqs := range reqsMap { + sortedReqs = append(sortedReqs, reqs...) + } + + a.Requests = sortedReqs + return render(actionTmpl, a) } @@ -42,11 +61,12 @@ func NewAction(method, handlerName string) (*Action, error) { Title: title, Description: desc, Method: HTTPMethod(method), - Requests: map[*Request]*Response{}, + Requests: []*Request{}, }, nil } func (a *Action) AddRequest(req *Request, resp *Response) { - a.Requests[req] = resp + req.Response = resp + a.Requests = append(a.Requests, req) } diff --git a/doc/request.go b/doc/request.go index 70c65db..a668237 100644 --- a/doc/request.go +++ b/doc/request.go @@ -19,9 +19,10 @@ func init() { } type Request struct { - Header *Header - Body *Body - Method string + Header *Header + Body *Body + Method string + Response *Response // TODO: // Attributes diff --git a/example/widgets/widgets.apib b/example/widgets/widgets.apib index 19529a9..26276c0 100644 --- a/example/widgets/widgets.apib +++ b/example/widgets/widgets.apib @@ -24,6 +24,19 @@ retrieves a single Widget ++ Response 400 (text/plain; charset=utf-8) + + + Headers + + X-Content-Type-Options: nosniff + + + Body + + strconv.ParseInt: parsing "hello": invalid syntax + + + + ## /widgets ### Get Widgets [GET] diff --git a/example/widgets/widgets_test.go b/example/widgets/widgets_test.go index 760d810..3d734ae 100644 --- a/example/widgets/widgets_test.go +++ b/example/widgets/widgets_test.go @@ -33,6 +33,18 @@ func (t *mainSuite) TestGetWidgets() { t.Equal(ws[1].Role, widgets.AllWidgets[1].Role) } +func (t *mainSuite) TestGetWidgetBadRequest() { + idStr := "hello" + + urlPath, err := router.Get("GetWidget").URL("id", idStr) + t.Must(t.Nil(err)) + + resp, err := http.Get(server.URL + urlPath.String()) + t.Must(t.Nil(err)) + + t.Must(t.Equal(resp.StatusCode, http.StatusBadRequest)) +} + func (t *mainSuite) TestGetWidget() { var id int64 = 2 idStr := fmt.Sprintf("%d", id)