github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/metric/http_test.go (about)

     1  package metric_test
     2  
     3  import (
     4  	"net/http"
     5  	"net/http/httptest"
     6  
     7  	"github.com/pf-qiu/concourse/v6/atc/metric"
     8  	"github.com/pf-qiu/concourse/v6/atc/metric/metricfakes"
     9  
    10  	. "github.com/pf-qiu/concourse/v6/atc/metric"
    11  	. "github.com/onsi/ginkgo"
    12  	. "github.com/onsi/gomega"
    13  )
    14  
    15  func noopHandler(w http.ResponseWriter, r *http.Request) {
    16  	switch r.URL.Path {
    17  	case "/success":
    18  		return
    19  	case "/failure":
    20  		w.WriteHeader(500)
    21  		return
    22  	}
    23  
    24  	w.WriteHeader(404)
    25  	return
    26  }
    27  
    28  var _ = Describe("MetricsHandler", func() {
    29  	var (
    30  		ts      *httptest.Server
    31  		emitter *metricfakes.FakeEmitter
    32  		monitor *metric.Monitor
    33  	)
    34  
    35  	BeforeEach(func() {
    36  		emitter = &metricfakes.FakeEmitter{}
    37  		monitor = metric.NewMonitor()
    38  
    39  		emitterFactory := &metricfakes.FakeEmitterFactory{}
    40  		emitterFactory.IsConfiguredReturns(true)
    41  		emitterFactory.NewEmitterReturns(emitter, nil)
    42  
    43  		monitor.RegisterEmitter(emitterFactory)
    44  		monitor.Initialize(testLogger, "test", map[string]string{}, 1000)
    45  
    46  		ts = httptest.NewServer(
    47  			WrapHandler(
    48  				testLogger,
    49  				monitor,
    50  				"ApiEndpoint",
    51  				http.HandlerFunc(noopHandler),
    52  			),
    53  		)
    54  	})
    55  
    56  	AfterEach(func() {
    57  		ts.Close()
    58  	})
    59  
    60  	Context("when serving requests", func() {
    61  		var (
    62  			endpoint = "/"
    63  			event    metric.Event
    64  		)
    65  
    66  		JustBeforeEach(func() {
    67  			res, err := http.Get(ts.URL + endpoint)
    68  			Expect(err).ToNot(HaveOccurred())
    69  			res.Body.Close()
    70  
    71  			Eventually(emitter.EmitCallCount).Should(BeNumerically("==", 1))
    72  			_, event = emitter.EmitArgsForCall(0)
    73  		})
    74  
    75  		It("captures request and response properties", func() {
    76  			Expect(event.Attributes).To(HaveKeyWithValue("status", "404"))
    77  			Expect(event.Attributes).To(HaveKeyWithValue("method", "GET"))
    78  			Expect(event.Attributes).To(HaveKeyWithValue("route", "ApiEndpoint"))
    79  			Expect(event.Attributes).To(HaveKeyWithValue("path", "/"))
    80  		})
    81  
    82  		Context("to endpoint that returns success statuses", func() {
    83  			BeforeEach(func() {
    84  				endpoint = "/success"
    85  			})
    86  
    87  			It("captures error code", func() {
    88  				Expect(event.Attributes).To(HaveKeyWithValue("status", "200"))
    89  			})
    90  
    91  			It("captures route", func() {
    92  				Expect(event.Attributes).To(HaveKeyWithValue("path", "/success"))
    93  			})
    94  		})
    95  
    96  		Context("to faulty endpoint", func() {
    97  			BeforeEach(func() {
    98  				endpoint = "/failure"
    99  			})
   100  
   101  			It("captures error code", func() {
   102  				Expect(event.Attributes).To(HaveKeyWithValue("status", "500"))
   103  			})
   104  
   105  			It("captures route", func() {
   106  				Expect(event.Attributes).To(HaveKeyWithValue("path", "/failure"))
   107  			})
   108  		})
   109  	})
   110  })