// initService sets up the service encoders, decoders and mux. func initService(service *goa.Service) { if inited { return } inited = true // Setup encoders and decoders service.Encoder(goa.NewJSONEncoder, "application/json") service.Decoder(goa.NewJSONDecoder, "application/json") service.Decoder(goa.NewGobDecoder, "application/gob", "application/x-gob") service.Decoder(goa.NewXMLDecoder, "application/xml") // Setup default encoder and decoder service.Encoder(goa.NewJSONEncoder, "*/*") service.Decoder(goa.NewJSONDecoder, "*/*") }
// StartAeOK runs the method Start of the given controller with the given parameters. // It returns the response writer so it's possible to inspect the response headers. // If ctx is nil then context.Background() is used. // If service is nil then a default service is created. func StartAeOK(t goatest.TInterface, ctx context.Context, service *goa.Service, ctrl app.AeController) http.ResponseWriter { // Setup service var ( logBuf bytes.Buffer resp interface{} respSetter goatest.ResponseSetterFunc = func(r interface{}) { resp = r } ) if service == nil { service = goatest.Service(&logBuf, respSetter) } else { logger := log.New(&logBuf, "", log.Ltime) service.WithLogger(goa.NewLogger(logger)) newEncoder := func(io.Writer) goa.Encoder { return respSetter } service.Encoder = goa.NewHTTPEncoder() // Make sure the code ends up using this decoder service.Encoder.Register(newEncoder, "*/*") } // Setup request context rw := httptest.NewRecorder() u := &url.URL{ Path: fmt.Sprintf("/_ah/start"), } req, err := http.NewRequest("GET", u.String(), nil) if err != nil { panic("invalid test " + err.Error()) // bug } prms := url.Values{} if ctx == nil { ctx = context.Background() } goaCtx := goa.NewContext(goa.WithAction(ctx, "AeTest"), rw, req, prms) startCtx, err := app.NewStartAeContext(goaCtx, service) if err != nil { panic("invalid test data " + err.Error()) // bug } // Perform action err = ctrl.Start(startCtx) // Validate response if err != nil { t.Fatalf("controller returned %s, logs:\n%s", err, logBuf.String()) } if rw.Code != 200 { t.Errorf("invalid response status code: got %+v, expected 200", rw.Code) } // Return results return rw }
// ShowBottleOK Show runs the method Show of the given controller with the given parameters. // It returns the response writer so it's possible to inspect the response headers and the media type struct written to the response. // If ctx is nil then context.Background() is used. // If service is nil then a default service is created. func ShowBottleOK(t *testing.T, ctx context.Context, service *goa.Service, ctrl app.BottleController, id int) (http.ResponseWriter, *app.Bottle) { // Setup service var ( logBuf bytes.Buffer resp interface{} respSetter goatest.ResponseSetterFunc = func(r interface{}) { resp = r } ) if service == nil { service = goatest.Service(&logBuf, respSetter) } else { logger := log.New(&logBuf, "", log.Ltime) service.WithLogger(goa.NewLogger(logger)) newEncoder := func(io.Writer) goa.Encoder { return respSetter } service.Encoder = goa.NewHTTPEncoder() // Make sure the code ends up using this decoder service.Encoder.Register(newEncoder, "*/*") } // Setup request context rw := httptest.NewRecorder() u := &url.URL{ Path: fmt.Sprintf("/bottles/%v", id), } req, err := http.NewRequest("GET", u.String(), nil) if err != nil { panic("invalid test " + err.Error()) // bug } prms := url.Values{} prms["id"] = []string{fmt.Sprintf("%v", id)} if ctx == nil { ctx = context.Background() } goaCtx := goa.NewContext(goa.WithAction(ctx, "BottleTest"), rw, req, prms) showCtx, err := app.NewShowBottleContext(goaCtx, service) if err != nil { panic("invalid test data " + err.Error()) // bug } // Perform action err = ctrl.Show(showCtx) // Validate response if err != nil { t.Fatalf("controller returned %s, logs:\n%s", err, logBuf.String()) } if rw.Code != 200 { t.Errorf("invalid response status code: got %+v, expected 200", rw.Code) } var mt *app.Bottle if resp != nil { var ok bool mt, ok = resp.(*app.Bottle) if !ok { t.Errorf("invalid response media: got %+v, expected instance of app.Bottle", resp) } err = mt.Validate() if err != nil { t.Errorf("invalid response media type: %s", err) } } // Return results return rw, mt }
// CreateBottleCreated Create runs the method Create of the given controller with the given parameters and payload. // It returns the response writer so it's possible to inspect the response headers. // If ctx is nil then context.Background() is used. // If service is nil then a default service is created. func CreateBottleCreated(t *testing.T, ctx context.Context, service *goa.Service, ctrl app.BottleController, payload *app.CreateBottlePayload) http.ResponseWriter { // Setup service var ( logBuf bytes.Buffer resp interface{} respSetter goatest.ResponseSetterFunc = func(r interface{}) { resp = r } ) if service == nil { service = goatest.Service(&logBuf, respSetter) } else { logger := log.New(&logBuf, "", log.Ltime) service.WithLogger(goa.NewLogger(logger)) newEncoder := func(io.Writer) goa.Encoder { return respSetter } service.Encoder = goa.NewHTTPEncoder() // Make sure the code ends up using this decoder service.Encoder.Register(newEncoder, "*/*") } // Validate payload err := payload.Validate() if err != nil { e, ok := err.(*goa.Error) if !ok { panic(err) // bug } if e.Status != 201 { t.Errorf("unexpected payload validation error: %+v", e) } return nil } // Setup request context rw := httptest.NewRecorder() u := &url.URL{ Path: fmt.Sprintf("/bottles"), } req, err := http.NewRequest("POST", u.String(), nil) if err != nil { panic("invalid test " + err.Error()) // bug } prms := url.Values{} if ctx == nil { ctx = context.Background() } goaCtx := goa.NewContext(goa.WithAction(ctx, "BottleTest"), rw, req, prms) createCtx, err := app.NewCreateBottleContext(goaCtx, service) if err != nil { panic("invalid test data " + err.Error()) // bug } createCtx.Payload = payload // Perform action err = ctrl.Create(createCtx) // Validate response 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 201", rw.Code) } // Return results return rw }
"golang.org/x/net/context" "github.com/goadesign/goa" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) var _ = Describe("Service", func() { const appName = "foo" var s *goa.Service BeforeEach(func() { s = goa.New(appName) s.Decoder(goa.NewJSONDecoder, "*/*") s.Encoder(goa.NewJSONEncoder, "*/*") }) Describe("New", func() { It("creates a service", func() { Ω(s).ShouldNot(BeNil()) }) It("initializes the service fields", func() { Ω(s.Name).Should(Equal(appName)) Ω(s.Mux).ShouldNot(BeNil()) }) }) Describe("NotFound", func() { var rw *TestResponseWriter
var ctx context.Context var rw http.ResponseWriter var req *http.Request var params url.Values var service *goa.Service BeforeEach(func() { service = newService(nil) var err error req, err = http.NewRequest("GET", "/goo", nil) Ω(err).ShouldNot(HaveOccurred()) req.Header.Set("X-Request-Id", reqID) rw = new(testResponseWriter) params = url.Values{"query": []string{"value"}} service.Encoder(goa.NewJSONEncoder, "*/*") ctx = newContext(service, rw, req, params) }) It("sets the request ID in the context", func() { var newCtx context.Context h := func(ctx context.Context, rw http.ResponseWriter, req *http.Request) error { newCtx = ctx return service.Send(ctx, 200, "ok") } rg := middleware.RequestID()(h) Ω(rg(ctx, rw, req)).ShouldNot(HaveOccurred()) Ω(middleware.ContextRequestID(newCtx)).Should(Equal(reqID)) }) })