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 })