github.com/ManabuSeki/goa-v1@v1.4.3/middleware/log_request_test.go (about)

     1  package middleware_test
     2  
     3  import (
     4  	"net/http"
     5  	"net/url"
     6  	"strings"
     7  
     8  	"context"
     9  
    10  	"github.com/goadesign/goa"
    11  	"github.com/goadesign/goa/middleware"
    12  	. "github.com/onsi/ginkgo"
    13  	. "github.com/onsi/gomega"
    14  )
    15  
    16  var _ = Describe("LogRequest", func() {
    17  	var ctx context.Context
    18  	var rw *testResponseWriter
    19  	var req *http.Request
    20  	var params url.Values
    21  	var logger *testLogger
    22  	var service *goa.Service
    23  
    24  	payload := map[string]interface{}{"payload": 42}
    25  
    26  	BeforeEach(func() {
    27  		logger = new(testLogger)
    28  		service = newService(logger)
    29  
    30  		var err error
    31  		req, err = http.NewRequest("POST", "/goo?param=value", strings.NewReader(`{"payload":42}`))
    32  		Ω(err).ShouldNot(HaveOccurred())
    33  		rw = new(testResponseWriter)
    34  		params = url.Values{"query": []string{"value"}}
    35  		ctrl := service.NewController("test")
    36  		ctx = goa.NewContext(ctrl.Context, rw, req, params)
    37  		goa.ContextRequest(ctx).Payload = payload
    38  	})
    39  
    40  	It("logs requests", func() {
    41  		// Add Action name to the context to make sure we log it properly.
    42  		ctx = goa.WithAction(ctx, "goo")
    43  
    44  		h := func(ctx context.Context, rw http.ResponseWriter, req *http.Request) error {
    45  			return service.Send(ctx, 200, "ok")
    46  		}
    47  		lg := middleware.LogRequest(true)(h)
    48  		Ω(lg(ctx, rw, req)).ShouldNot(HaveOccurred())
    49  		Ω(logger.InfoEntries).Should(HaveLen(4))
    50  
    51  		Ω(logger.InfoEntries[0].Data).Should(HaveLen(10))
    52  		Ω(logger.InfoEntries[0].Data[0]).Should(Equal("req_id"))
    53  		Ω(logger.InfoEntries[0].Data[2]).Should(Equal("POST"))
    54  		Ω(logger.InfoEntries[0].Data[3]).Should(Equal("/goo?param=value"))
    55  
    56  		Ω(logger.InfoEntries[1].Data).Should(HaveLen(4))
    57  		Ω(logger.InfoEntries[1].Data[0]).Should(Equal("req_id"))
    58  		Ω(logger.InfoEntries[1].Data[2]).Should(Equal("query"))
    59  		Ω(logger.InfoEntries[1].Data[3]).Should(Equal("value"))
    60  
    61  		Ω(logger.InfoEntries[2].Data).Should(HaveLen(4))
    62  		Ω(logger.InfoEntries[2].Data[0]).Should(Equal("req_id"))
    63  		Ω(logger.InfoEntries[2].Data[2]).Should(Equal("payload"))
    64  		Ω(logger.InfoEntries[2].Data[3]).Should(Equal(42))
    65  
    66  		Ω(logger.InfoEntries[3].Data).Should(HaveLen(12))
    67  		Ω(logger.InfoEntries[3].Data[0]).Should(Equal("req_id"))
    68  		Ω(logger.InfoEntries[3].Data[2]).Should(Equal("status"))
    69  		Ω(logger.InfoEntries[3].Data[3]).Should(Equal(200))
    70  		Ω(logger.InfoEntries[3].Data[4]).Should(Equal("bytes"))
    71  		Ω(logger.InfoEntries[3].Data[5]).Should(Equal(5))
    72  		Ω(logger.InfoEntries[3].Data[6]).Should(Equal("time"))
    73  		Ω(logger.InfoEntries[3].Data[8]).Should(Equal("ctrl"))
    74  		Ω(logger.InfoEntries[3].Data[9]).Should(Equal("test"))
    75  		Ω(logger.InfoEntries[3].Data[10]).Should(Equal("action"))
    76  		Ω(logger.InfoEntries[3].Data[11]).Should(Equal("goo"))
    77  	})
    78  
    79  	It("logs error codes", func() {
    80  		h := func(ctx context.Context, rw http.ResponseWriter, req *http.Request) error {
    81  			return goa.MissingParamError("foo")
    82  		}
    83  		rw.ParentHeader = make(http.Header)
    84  		lg := middleware.LogRequest(false)(middleware.ErrorHandler(service, false)(h))
    85  		Ω(lg(ctx, rw, req)).ShouldNot(HaveOccurred())
    86  		Ω(logger.InfoEntries).Should(HaveLen(2))
    87  		Ω(logger.InfoEntries[0].Data).Should(HaveLen(10))
    88  		Ω(logger.InfoEntries[0].Data[0]).Should(Equal("req_id"))
    89  		Ω(logger.InfoEntries[0].Data[2]).Should(Equal("POST"))
    90  		Ω(logger.InfoEntries[0].Data[3]).Should(Equal("/goo?param=value"))
    91  
    92  		Ω(logger.InfoEntries[1].Data).Should(HaveLen(14))
    93  		Ω(logger.InfoEntries[1].Data[0]).Should(Equal("req_id"))
    94  		Ω(logger.InfoEntries[1].Data[2]).Should(Equal("status"))
    95  		Ω(logger.InfoEntries[1].Data[3]).Should(Equal(400))
    96  		Ω(logger.InfoEntries[1].Data[4]).Should(Equal("error"))
    97  		Ω(logger.InfoEntries[1].Data[5]).Should(HaveLen(8)) // Error ID
    98  		Ω(logger.InfoEntries[1].Data[6]).Should(Equal("bytes"))
    99  		Ω(logger.InfoEntries[1].Data[7]).Should(Equal(124))
   100  		Ω(logger.InfoEntries[1].Data[8]).Should(Equal("time"))
   101  		Ω(logger.InfoEntries[1].Data[10]).Should(Equal("ctrl"))
   102  		Ω(logger.InfoEntries[1].Data[11]).Should(Equal("test"))
   103  		Ω(logger.InfoEntries[1].Data[12]).Should(Equal("action"))
   104  		Ω(logger.InfoEntries[1].Data[13]).Should(Equal("<unknown>"))
   105  	})
   106  
   107  	It("hides secret headers", func() {
   108  		// Add Action name to the context to make sure we log it properly.
   109  		ctx = goa.WithAction(ctx, "goo")
   110  
   111  		h := func(ctx context.Context, rw http.ResponseWriter, req *http.Request) error {
   112  			return service.Send(ctx, 200, "ok")
   113  		}
   114  		lg := middleware.LogRequest(true, "SECRET")(h)
   115  		req.Header.Add("Secret", "super secret things")
   116  		req.Header.Add("Not so secret", "public")
   117  		Ω(lg(ctx, rw, req)).ShouldNot(HaveOccurred())
   118  		Ω(logger.InfoEntries).Should(HaveLen(5))
   119  
   120  		Ω(logger.InfoEntries[1].Data[2]).Should(Equal("Not so secret"))
   121  		Ω(logger.InfoEntries[1].Data[3]).Should(Equal("public"))
   122  
   123  		Ω(logger.InfoEntries[1].Data[4]).Should(Equal("Secret"))
   124  		Ω(logger.InfoEntries[1].Data[5]).Should(Equal("<hidden>"))
   125  
   126  	})
   127  })