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