github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/api/buildserver/scoped_handler_factory_test.go (about) 1 package buildserver_test 2 3 import ( 4 "context" 5 "net/http" 6 "net/http/httptest" 7 8 "code.cloudfoundry.org/lager/lagertest" 9 10 "github.com/pf-qiu/concourse/v6/atc/api/auth" 11 . "github.com/pf-qiu/concourse/v6/atc/api/buildserver" 12 "github.com/pf-qiu/concourse/v6/atc/db" 13 "github.com/pf-qiu/concourse/v6/atc/db/dbfakes" 14 15 . "github.com/onsi/ginkgo" 16 . "github.com/onsi/gomega" 17 ) 18 19 var _ = Describe("ScopedHandlerFactory", func() { 20 var ( 21 response *http.Response 22 server *httptest.Server 23 delegate *delegateHandler 24 handler http.Handler 25 ) 26 27 BeforeEach(func() { 28 delegate = &delegateHandler{} 29 logger := lagertest.NewTestLogger("test") 30 handlerFactory := NewScopedHandlerFactory(logger) 31 handler = handlerFactory.HandlerFor(delegate.GetHandler) 32 }) 33 34 JustBeforeEach(func() { 35 server = httptest.NewServer(handler) 36 37 request, err := http.NewRequest("POST", server.URL, nil) 38 Expect(err).NotTo(HaveOccurred()) 39 40 response, err = new(http.Client).Do(request) 41 Expect(err).NotTo(HaveOccurred()) 42 }) 43 44 var _ = AfterEach(func() { 45 server.Close() 46 }) 47 48 Context("build is in the context", func() { 49 var contextBuild *dbfakes.FakeBuild 50 51 BeforeEach(func() { 52 contextBuild = new(dbfakes.FakeBuild) 53 handler = &wrapHandler{handler, contextBuild} 54 }) 55 56 It("calls scoped handler with build from context", func() { 57 Expect(delegate.IsCalled).To(BeTrue()) 58 Expect(delegate.Build).To(BeIdenticalTo(contextBuild)) 59 }) 60 }) 61 62 Context("build not found in the context", func() { 63 It("returns 500", func() { 64 Expect(response.StatusCode).To(Equal(http.StatusInternalServerError)) 65 }) 66 67 It("does not call the scoped handler", func() { 68 Expect(delegate.IsCalled).To(BeFalse()) 69 }) 70 }) 71 }) 72 73 type delegateHandler struct { 74 IsCalled bool 75 Build db.Build 76 } 77 78 func (handler *delegateHandler) GetHandler(build db.Build) http.Handler { 79 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 80 handler.IsCalled = true 81 handler.Build = build 82 }) 83 } 84 85 type wrapHandler struct { 86 delegate http.Handler 87 contextBuild db.Build 88 } 89 90 func (h *wrapHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 91 ctx := context.WithValue(r.Context(), auth.BuildContextKey, h.contextBuild) 92 h.delegate.ServeHTTP(w, r.WithContext(ctx)) 93 }