It("should log and respond with status 400", func() { resp := httptest.NewRecorder() handler.ServeHTTP(resp, request) Expect(resp.Code).To(Equal(http.StatusBadRequest)) Expect(logger).To(gbytes.Say("cni-add.*body-read-failed")) }) }) Context("when unmarshalling payload fails", func() { BeforeEach(func() { request.Body = ioutil.NopCloser(bytes.NewBuffer([]byte(`{}`))) }) It("logs an error and responds with code 400", func() { unmarshaler.UnmarshalReturns(errors.New("some-unmarshal-error")) resp := httptest.NewRecorder() handler.ServeHTTP(resp, request) Expect(resp.Code).To(Equal(http.StatusBadRequest)) Expect(logger).To(gbytes.Say("cni-add.unmarshal-failed.*some-unmarshal-error")) Expect(controller.AddCallCount()).To(BeZero()) }) }) DescribeTable("missing payload fields", func(paramToRemove, jsonName string) { field := reflect.ValueOf(&payload).Elem().FieldByName(paramToRemove) if !field.IsValid() { Fail("invalid test: payload does not have a field named " + paramToRemove)
Context("reading the response body read fails", func() { BeforeEach(func() { mockHttpClient := &fakes.HTTPClient{} mockHttpClient.DoReturns(&http.Response{ StatusCode: 201, Body: &testsupport.BadReader{}, }, nil) jsonClient.HttpClient = mockHttpClient }) It("should return an error", func() { err := jsonClient.BuildAndDo(config) Expect(err).To(MatchError("failed to read response body: banana")) }) }) Context("the response JSON cannot be unmarshaled", func() { BeforeEach(func() { unmarshaler.UnmarshalReturns(errors.New("something went wrong")) }) It("should return an error", func() { err := jsonClient.BuildAndDo(config) Expect(err).To(MatchError("failed to unmarshal result: something went wrong")) }) }) }) }) })