Skip to content

Instantly share code, notes, and snippets.

@raphael
Last active April 16, 2016 00:02
Show Gist options
  • Save raphael/8091f113568e0a10c567bb5b533c076e to your computer and use it in GitHub Desktop.
Save raphael/8091f113568e0a10c567bb5b533c076e to your computer and use it in GitHub Desktop.
Lives in package "test", one such function generated per action per possible response
package test
import (
"bytes"
"fmt"
"io"
"log"
"net/http"
"net/http/httptest"
"regexp"
"testing"
"golang.org/x/net/context"
"github.com/goadesign/goa"
"github.com/goadesign/goa-cellar/app"
"github.com/goadesign/goa/middleware"
)
type ResponseSetterFunc func(resp interface{})
func (r ResponseSetterFunc) Encode(v interface{}) error {
r(v)
return nil
}
func TestService(logBuf *bytes.Buffer, respSetter ResponseSetterFunc) *goa.Service {
s := goa.New("test")
logger := log.New(logBuf, "", log.Ltime)
s.WithLogger(goa.NewStdLogger(logger))
s.Use(middleware.LogRequest(true))
s.Use(middleware.LogResponse())
newEncoder := func(io.Writer) goa.Encoder {
return respSetter
}
s.Decoder(goa.NewJSONDecoder, "*/*")
s.Encoder(newEncoder, "*/*")
return s
}
func ShowAccountOK(t *testing.T, ctrl app.AccountController, accountID int) *app.Account {
var logBuf bytes.Buffer
var resp interface{}
respSetter := func(r interface{}) { resp = r }
service := TestService(&logBuf, respSetter)
rw := httptest.NewRecorder()
req, err := http.NewRequest("GET", fmt.Sprintf("http://localhost/cellar/accounts/%v", accountID), nil)
if err != nil {
panic("invalid test " + err.Error()) // bug
}
ctx := goa.NewContext(goa.WithAction(context.Background(), "ShowTest"), rw, req, nil)
showCtx, err := app.NewShowAccountContext(ctx, service)
if err != nil {
panic("invalid test data " + err.Error()) // bug
}
err = ctrl.Show(showCtx)
if err != nil {
t.Fatalf("controller returned %s, logs:\n%s", err, logBuf.String())
}
a, ok := resp.(*app.Account)
if !ok {
t.Errorf("invalid response media: got %+v, expected instance of app.Account", resp)
}
if rw.Code != 200 {
t.Errorf("invalid response status code: got %+v, expected 200", rw.Code)
}
return a
}
func CreateAccountCreated(t *testing.T, ctrl app.AccountController, payload *app.CreateAccountPayload) {
var logBuf bytes.Buffer
var resp interface{}
respSetter := func(r interface{}) { resp = r }
service := TestService(&logBuf, respSetter)
rw := httptest.NewRecorder()
req, err := http.NewRequest("POST", "http://localhost/cellar/accounts", nil)
if err != nil {
panic("invalid test " + err.Error()) // bug
}
ctx := goa.NewContext(goa.WithAction(context.Background(), "CreateTest"), rw, req, nil)
createCtx, err := app.NewCreateAccountContext(ctx, service)
if err != nil {
panic("invalid test data " + err.Error()) // bug
}
createCtx.Payload = payload
err = ctrl.Create(createCtx)
if err != nil {
t.Fatalf("controller returned %s, logs:\n%s", err, logBuf.String())
}
if rw.Code != 201 {
t.Errorf("invalid response status code: got %+v, expected 200", rw.Code)
}
if loc, ok := rw.HeaderMap["Location"]; !ok {
t.Errorf("missing 'Location' header in response")
} else {
ok, err = regexp.MatchString(loc[0], "/accounts/[0-9]+")
if err != nil {
panic("invalid header spec " + err.Error())
}
if !ok {
t.Errorf("invalid 'Location' header %#v", loc[0])
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment