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  })