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

     1  package api_test
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"net/url"
     9  
    10  	"code.cloudfoundry.org/lager/lagertest"
    11  
    12  	"github.com/pf-qiu/concourse/v6/atc/api"
    13  	"github.com/pf-qiu/concourse/v6/atc/api/accessor"
    14  	"github.com/pf-qiu/concourse/v6/atc/auditor/auditorfakes"
    15  	"github.com/pf-qiu/concourse/v6/atc/db"
    16  	"github.com/pf-qiu/concourse/v6/atc/db/dbfakes"
    17  	. "github.com/onsi/ginkgo"
    18  	. "github.com/onsi/gomega"
    19  )
    20  
    21  var _ = Describe("TeamScopedHandlerFactory", func() {
    22  	var (
    23  		response        *http.Response
    24  		server          *httptest.Server
    25  		delegate        *delegateHandler
    26  		fakeTeamFactory *dbfakes.FakeTeamFactory
    27  		fakeTeam        *dbfakes.FakeTeam
    28  		handler         http.Handler
    29  	)
    30  
    31  	BeforeEach(func() {
    32  		fakeTeamFactory = new(dbfakes.FakeTeamFactory)
    33  		fakeTeam = new(dbfakes.FakeTeam)
    34  		fakeTeamFactory.FindTeamReturns(fakeTeam, true, nil)
    35  
    36  		delegate = &delegateHandler{}
    37  
    38  		logger := lagertest.NewTestLogger("test")
    39  
    40  		handlerFactory := api.NewTeamScopedHandlerFactory(logger, fakeTeamFactory)
    41  		innerHandler := handlerFactory.HandlerFor(delegate.GetHandler)
    42  
    43  		handler = accessor.NewHandler(
    44  			logger,
    45  			"some-action",
    46  			innerHandler,
    47  			fakeAccessor,
    48  			new(auditorfakes.FakeAuditor),
    49  			map[string]string{},
    50  		)
    51  	})
    52  
    53  	JustBeforeEach(func() {
    54  		server = httptest.NewServer(handler)
    55  
    56  		fullUrl := fmt.Sprintf("%s?:team_name=some-team", server.URL)
    57  
    58  		serverUrl, err := url.Parse(fullUrl)
    59  		Expect(err).NotTo(HaveOccurred())
    60  
    61  		request, err := http.NewRequest("POST", serverUrl.String(), nil)
    62  		Expect(err).NotTo(HaveOccurred())
    63  
    64  		response, err = new(http.Client).Do(request)
    65  		Expect(err).NotTo(HaveOccurred())
    66  	})
    67  
    68  	var _ = AfterEach(func() {
    69  		server.Close()
    70  	})
    71  
    72  	Context("when team is in auth context", func() {
    73  		BeforeEach(func() {
    74  			fakeAccess.IsAuthenticatedReturns(true)
    75  			fakeAccess.IsAuthorizedReturns(true)
    76  		})
    77  
    78  		Context("when the team is not found", func() {
    79  			BeforeEach(func() {
    80  				fakeTeamFactory.FindTeamReturns(nil, false, nil)
    81  			})
    82  
    83  			It("returns 404", func() {
    84  				Expect(response.StatusCode).To(Equal(http.StatusNotFound))
    85  			})
    86  		})
    87  
    88  		Context("when finding the team fails", func() {
    89  			BeforeEach(func() {
    90  				fakeTeamFactory.FindTeamReturns(nil, false, errors.New("what is a team?"))
    91  			})
    92  
    93  			It("returns 500", func() {
    94  				Expect(response.StatusCode).To(Equal(http.StatusInternalServerError))
    95  			})
    96  		})
    97  
    98  		It("creates team with team name from context", func() {
    99  			Expect(fakeTeamFactory.FindTeamCallCount()).To(Equal(1))
   100  			Expect(fakeTeamFactory.FindTeamArgsForCall(0)).To(Equal("some-team"))
   101  		})
   102  
   103  		It("calls scoped handler with team from context", func() {
   104  			Expect(delegate.IsCalled).To(BeTrue())
   105  			Expect(delegate.Team).To(BeIdenticalTo(fakeTeam))
   106  		})
   107  	})
   108  
   109  	Context("when team is not in auth context", func() {
   110  		BeforeEach(func() {
   111  			fakeAccess.IsAuthorizedReturns(false)
   112  		})
   113  
   114  		It("returns 403", func() {
   115  			Expect(response.StatusCode).To(Equal(http.StatusForbidden))
   116  		})
   117  
   118  		It("does not call scoped handler", func() {
   119  			Expect(delegate.IsCalled).To(BeFalse())
   120  			Expect(delegate.Team).To(BeNil())
   121  		})
   122  	})
   123  })
   124  
   125  type delegateHandler struct {
   126  	IsCalled bool
   127  	Team     db.Team
   128  }
   129  
   130  func (handler *delegateHandler) GetHandler(team db.Team) http.Handler {
   131  	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   132  		handler.IsCalled = true
   133  		handler.Team = team
   134  	})
   135  }