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  }