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 }