github.com/sykesm/fabric@v1.1.0-preview.0.20200129034918-2aa12b1a0181/common/flogging/httpadmin/spec_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package httpadmin_test
     8  
     9  import (
    10  	"errors"
    11  	"net/http"
    12  	"net/http/httptest"
    13  	"strings"
    14  
    15  	"github.com/hyperledger/fabric/common/flogging"
    16  	"github.com/hyperledger/fabric/common/flogging/httpadmin"
    17  	"github.com/hyperledger/fabric/common/flogging/httpadmin/fakes"
    18  	. "github.com/onsi/ginkgo"
    19  	. "github.com/onsi/gomega"
    20  )
    21  
    22  var _ = Describe("SpecHandler", func() {
    23  	var (
    24  		fakeLogging *fakes.Logging
    25  		handler     *httpadmin.SpecHandler
    26  	)
    27  
    28  	BeforeEach(func() {
    29  		fakeLogging = &fakes.Logging{}
    30  		fakeLogging.SpecReturns("the-returned-specification")
    31  		handler = &httpadmin.SpecHandler{
    32  			Logging: fakeLogging,
    33  		}
    34  	})
    35  
    36  	It("responds with the current logging spec", func() {
    37  		req := httptest.NewRequest("GET", "/ignored", nil)
    38  		resp := httptest.NewRecorder()
    39  		handler.ServeHTTP(resp, req)
    40  
    41  		Expect(fakeLogging.SpecCallCount()).To(Equal(1))
    42  		Expect(resp.Code).To(Equal(http.StatusOK))
    43  		Expect(resp.Body).To(MatchJSON(`{"spec": "the-returned-specification"}`))
    44  		Expect(resp.Header().Get("Content-Type")).To(Equal("application/json"))
    45  	})
    46  
    47  	It("sets the current logging spec", func() {
    48  		req := httptest.NewRequest("PUT", "/ignored", strings.NewReader(`{"spec": "updated-spec"}`))
    49  		resp := httptest.NewRecorder()
    50  		handler.ServeHTTP(resp, req)
    51  
    52  		Expect(resp.Code).To(Equal(http.StatusNoContent))
    53  		Expect(fakeLogging.ActivateSpecCallCount()).To(Equal(1))
    54  		Expect(fakeLogging.ActivateSpecArgsForCall(0)).To(Equal("updated-spec"))
    55  	})
    56  
    57  	Context("when the update spec payload cannot be decoded", func() {
    58  		It("responds with an error payload", func() {
    59  			req := httptest.NewRequest("PUT", "/ignored", strings.NewReader(`goo`))
    60  			resp := httptest.NewRecorder()
    61  			handler.ServeHTTP(resp, req)
    62  
    63  			Expect(fakeLogging.ActivateSpecCallCount()).To(Equal(0))
    64  			Expect(resp.Code).To(Equal(http.StatusBadRequest))
    65  			Expect(resp.Body).To(MatchJSON(`{"error": "invalid character 'g' looking for beginning of value"}`))
    66  		})
    67  	})
    68  
    69  	Context("when activating the spec fails", func() {
    70  		BeforeEach(func() {
    71  			fakeLogging.ActivateSpecReturns(errors.New("ewww; that's not right!"))
    72  		})
    73  
    74  		It("responds with an error payload", func() {
    75  			req := httptest.NewRequest("PUT", "/ignored", strings.NewReader(`{}`))
    76  			resp := httptest.NewRecorder()
    77  			handler.ServeHTTP(resp, req)
    78  
    79  			Expect(resp.Code).To(Equal(http.StatusBadRequest))
    80  			Expect(resp.Body).To(MatchJSON(`{"error": "ewww; that's not right!"}`))
    81  		})
    82  	})
    83  
    84  	Context("when an unsupported method is used", func() {
    85  		It("responds with an error", func() {
    86  			req := httptest.NewRequest("POST", "/ignored", strings.NewReader(`{}`))
    87  			resp := httptest.NewRecorder()
    88  			handler.ServeHTTP(resp, req)
    89  
    90  			Expect(resp.Code).To(Equal(http.StatusBadRequest))
    91  			Expect(resp.Body).To(MatchJSON(`{"error": "invalid request method: POST"}`))
    92  		})
    93  
    94  		It("doesn't use logging", func() {
    95  			req := httptest.NewRequest("POST", "/ignored", strings.NewReader(`{}`))
    96  			resp := httptest.NewRecorder()
    97  			handler.ServeHTTP(resp, req)
    98  
    99  			Expect(fakeLogging.ActivateSpecCallCount()).To(Equal(0))
   100  			Expect(fakeLogging.SpecCallCount()).To(Equal(0))
   101  		})
   102  	})
   103  
   104  	Describe("NewSpecHandler", func() {
   105  		It("constructs a handler that modifies the global spec", func() {
   106  			specHandler := httpadmin.NewSpecHandler()
   107  			Expect(specHandler.Logging).To(Equal(flogging.Global))
   108  			Expect(specHandler.Logger).NotTo(BeNil())
   109  		})
   110  	})
   111  })