github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/api/accessor/handler_test.go (about) 1 package accessor_test 2 3 import ( 4 "errors" 5 "net/http" 6 "net/http/httptest" 7 8 "code.cloudfoundry.org/lager" 9 "github.com/pf-qiu/concourse/v6/atc" 10 "github.com/pf-qiu/concourse/v6/atc/api/accessor" 11 "github.com/pf-qiu/concourse/v6/atc/api/accessor/accessorfakes" 12 "github.com/pf-qiu/concourse/v6/atc/auditor/auditorfakes" 13 . "github.com/onsi/ginkgo" 14 . "github.com/onsi/gomega" 15 ) 16 17 var _ = Describe("Handler", func() { 18 19 var ( 20 logger lager.Logger 21 fakeHandler *accessorfakes.FakeHandler 22 fakeAccess *accessorfakes.FakeAccess 23 fakeAccessorFactory *accessorfakes.FakeAccessFactory 24 fakeAuditor *auditorfakes.FakeAuditor 25 26 createAccessError error 27 28 action string 29 customRoles map[string]string 30 31 r *http.Request 32 w *httptest.ResponseRecorder 33 ) 34 35 BeforeEach(func() { 36 logger = lager.NewLogger("test") 37 38 fakeHandler = new(accessorfakes.FakeHandler) 39 fakeAccess = new(accessorfakes.FakeAccess) 40 fakeAccessorFactory = new(accessorfakes.FakeAccessFactory) 41 fakeAuditor = new(auditorfakes.FakeAuditor) 42 43 action = "some-action" 44 customRoles = map[string]string{"some-action": "some-role"} 45 46 var err error 47 r, err = http.NewRequest("GET", "localhost:8080", nil) 48 Expect(err).NotTo(HaveOccurred()) 49 50 w = httptest.NewRecorder() 51 }) 52 53 JustBeforeEach(func() { 54 fakeAccessorFactory.CreateReturns(fakeAccess, createAccessError) 55 handler := accessor.NewHandler( 56 logger, 57 action, 58 fakeHandler, 59 fakeAccessorFactory, 60 fakeAuditor, 61 customRoles, 62 ) 63 64 handler.ServeHTTP(w, r) 65 }) 66 67 Describe("Accessor Handler", func() { 68 Context("when there's a default role for the given action", func() { 69 BeforeEach(func() { 70 action = atc.SaveConfig 71 }) 72 73 Context("when the role has not been customized", func() { 74 BeforeEach(func() { 75 customRoles = map[string]string{} 76 }) 77 78 It("finds the role", func() { 79 Expect(fakeAccessorFactory.CreateCallCount()).To(Equal(1)) 80 _, role := fakeAccessorFactory.CreateArgsForCall(0) 81 Expect(role).To(Equal(accessor.MemberRole)) 82 }) 83 }) 84 85 Context("when the role has been customized", func() { 86 BeforeEach(func() { 87 customRoles = map[string]string{ 88 atc.SaveConfig: accessor.ViewerRole, 89 } 90 }) 91 92 It("finds the role", func() { 93 Expect(fakeAccessorFactory.CreateCallCount()).To(Equal(1)) 94 _, role := fakeAccessorFactory.CreateArgsForCall(0) 95 Expect(role).To(Equal(accessor.ViewerRole)) 96 }) 97 }) 98 }) 99 100 Context("when there's no default role for the given action", func() { 101 BeforeEach(func() { 102 action = "some-admin-role" 103 }) 104 105 Context("when the role has not been customized", func() { 106 BeforeEach(func() { 107 customRoles = map[string]string{} 108 }) 109 110 It("sends a blank role (admin roles don't have defaults)", func() { 111 Expect(fakeAccessorFactory.CreateCallCount()).To(Equal(1)) 112 _, role := fakeAccessorFactory.CreateArgsForCall(0) 113 Expect(role).To(BeEmpty()) 114 }) 115 }) 116 }) 117 118 Context("when the request is authenticated", func() { 119 BeforeEach(func() { 120 fakeAccess.IsAuthenticatedReturns(true) 121 fakeAccess.ClaimsReturns(accessor.Claims{ 122 UserName: "some-user", 123 Connector: "some-connector", 124 Sub: "some-sub", 125 }) 126 }) 127 128 It("audits the event", func() { 129 Expect(fakeAuditor.AuditCallCount()).To(Equal(1)) 130 action, userName, req := fakeAuditor.AuditArgsForCall(0) 131 Expect(action).To(Equal("some-action")) 132 Expect(userName).To(Equal("some-user")) 133 Expect(req).To(Equal(r)) 134 }) 135 136 It("invokes the handler", func() { 137 Expect(fakeHandler.ServeHTTPCallCount()).To(Equal(1)) 138 _, r := fakeHandler.ServeHTTPArgsForCall(0) 139 Expect(accessor.GetAccessor(r)).To(Equal(fakeAccess)) 140 }) 141 }) 142 143 Context("when the request is not authenticated", func() { 144 BeforeEach(func() { 145 fakeAccess.IsAuthenticatedReturns(false) 146 fakeAccess.ClaimsReturns(accessor.Claims{}) 147 }) 148 149 It("audits the anonymous request", func() { 150 Expect(fakeAuditor.AuditCallCount()).To(Equal(1)) 151 action, userName, req := fakeAuditor.AuditArgsForCall(0) 152 Expect(action).To(Equal("some-action")) 153 Expect(userName).To(Equal("")) 154 Expect(req).To(Equal(r)) 155 }) 156 157 It("invokes the handler", func() { 158 Expect(fakeHandler.ServeHTTPCallCount()).To(Equal(1)) 159 _, r := fakeHandler.ServeHTTPArgsForCall(0) 160 Expect(accessor.GetAccessor(r)).To(Equal(fakeAccess)) 161 }) 162 }) 163 164 Context("when the accessor factory errors", func() { 165 BeforeEach(func() { 166 createAccessError = errors.New("<<something bad here>>") 167 }) 168 169 It("returns a server error", func() { 170 Expect(w.Result().StatusCode).To(Equal(http.StatusInternalServerError)) 171 }) 172 }) 173 }) 174 })