github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/api/auth/check_authentication_handler_test.go (about) 1 package auth_test 2 3 import ( 4 "bytes" 5 "io" 6 "io/ioutil" 7 "net/http" 8 "net/http/httptest" 9 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/api/auth" 13 "github.com/pf-qiu/concourse/v6/atc/api/auth/authfakes" 14 "github.com/pf-qiu/concourse/v6/atc/auditor/auditorfakes" 15 16 . "github.com/onsi/ginkgo" 17 . "github.com/onsi/gomega" 18 ) 19 20 var _ = Describe("AuthenticationHandler", func() { 21 22 var ( 23 fakeAccess *accessorfakes.FakeAccess 24 fakeAccessor *accessorfakes.FakeAccessFactory 25 fakeRejector *authfakes.FakeRejector 26 27 server *httptest.Server 28 client *http.Client 29 30 err error 31 request *http.Request 32 response *http.Response 33 ) 34 35 simpleHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 36 buffer := bytes.NewBufferString("simple hello") 37 38 _, err := io.Copy(w, buffer) 39 Expect(err).ToNot(HaveOccurred()) 40 }) 41 42 BeforeEach(func() { 43 fakeAccess = new(accessorfakes.FakeAccess) 44 fakeAccessor = new(accessorfakes.FakeAccessFactory) 45 fakeRejector = new(authfakes.FakeRejector) 46 47 fakeAccessor.CreateReturns(fakeAccess, nil) 48 49 fakeRejector.UnauthorizedStub = func(w http.ResponseWriter, r *http.Request) { 50 http.Error(w, "nope", http.StatusUnauthorized) 51 } 52 53 client = http.DefaultClient 54 }) 55 56 JustBeforeEach(func() { 57 response, err = client.Do(request) 58 Expect(err).NotTo(HaveOccurred()) 59 }) 60 61 Describe("CheckAuthenticationHandler", func() { 62 63 BeforeEach(func() { 64 innerHandler := auth.CheckAuthenticationHandler( 65 simpleHandler, 66 fakeRejector, 67 ) 68 69 server = httptest.NewServer(accessor.NewHandler( 70 logger, 71 "some-action", 72 innerHandler, 73 fakeAccessor, 74 new(auditorfakes.FakeAuditor), 75 map[string]string{}, 76 )) 77 }) 78 79 Context("when a request is made", func() { 80 BeforeEach(func() { 81 request, err = http.NewRequest("GET", server.URL, nil) 82 Expect(err).NotTo(HaveOccurred()) 83 }) 84 85 Context("when the user is authenticated ", func() { 86 BeforeEach(func() { 87 fakeAccess.IsAuthenticatedReturns(true) 88 }) 89 90 It("returns 200", func() { 91 Expect(response.StatusCode).To(Equal(http.StatusOK)) 92 }) 93 94 It("proxies to the handler", func() { 95 responseBody, err := ioutil.ReadAll(response.Body) 96 Expect(err).NotTo(HaveOccurred()) 97 Expect(string(responseBody)).To(Equal("simple hello")) 98 }) 99 }) 100 101 Context("when the user is not authenticated", func() { 102 BeforeEach(func() { 103 fakeAccess.IsAuthenticatedReturns(false) 104 }) 105 106 It("returns 401", func() { 107 Expect(response.StatusCode).To(Equal(http.StatusUnauthorized)) 108 }) 109 110 It("rejects the request", func() { 111 responseBody, err := ioutil.ReadAll(response.Body) 112 Expect(err).NotTo(HaveOccurred()) 113 Expect(string(responseBody)).To(Equal("nope\n")) 114 }) 115 }) 116 }) 117 }) 118 119 Describe("CheckAuthenticationIfProvidedHandler", func() { 120 121 BeforeEach(func() { 122 innerHandler := auth.CheckAuthenticationIfProvidedHandler( 123 simpleHandler, 124 fakeRejector, 125 ) 126 127 server = httptest.NewServer(accessor.NewHandler( 128 logger, 129 "some-action", 130 innerHandler, 131 fakeAccessor, 132 new(auditorfakes.FakeAuditor), 133 map[string]string{}, 134 )) 135 }) 136 137 Context("when a request is made", func() { 138 BeforeEach(func() { 139 request, err = http.NewRequest("GET", server.URL, nil) 140 Expect(err).NotTo(HaveOccurred()) 141 }) 142 143 Context("when a token is provided", func() { 144 BeforeEach(func() { 145 fakeAccess.HasTokenReturns(true) 146 }) 147 148 Context("when the user is not authenticated", func() { 149 BeforeEach(func() { 150 fakeAccess.IsAuthenticatedReturns(false) 151 }) 152 153 It("returns 401", func() { 154 Expect(response.StatusCode).To(Equal(http.StatusUnauthorized)) 155 }) 156 157 It("rejects the request", func() { 158 responseBody, err := ioutil.ReadAll(response.Body) 159 Expect(err).NotTo(HaveOccurred()) 160 Expect(string(responseBody)).To(Equal("nope\n")) 161 }) 162 }) 163 164 Context("when the user is authenticated ", func() { 165 BeforeEach(func() { 166 fakeAccess.IsAuthenticatedReturns(true) 167 }) 168 169 It("returns 200", func() { 170 Expect(response.StatusCode).To(Equal(http.StatusOK)) 171 }) 172 173 It("proxies to the handler", func() { 174 responseBody, err := ioutil.ReadAll(response.Body) 175 Expect(err).NotTo(HaveOccurred()) 176 Expect(string(responseBody)).To(Equal("simple hello")) 177 }) 178 }) 179 }) 180 181 Context("when a token is NOT provided", func() { 182 BeforeEach(func() { 183 fakeAccess.HasTokenReturns(false) 184 }) 185 186 It("returns 200", func() { 187 Expect(response.StatusCode).To(Equal(http.StatusOK)) 188 }) 189 190 It("proxies to the handler", func() { 191 responseBody, err := ioutil.ReadAll(response.Body) 192 Expect(err).NotTo(HaveOccurred()) 193 Expect(string(responseBody)).To(Equal("simple hello")) 194 }) 195 }) 196 }) 197 }) 198 })