diff options
author | Alessio Caiazza <acaiazza@gitlab.com> | 2022-01-26 17:24:29 +0300 |
---|---|---|
committer | Alessio Caiazza <acaiazza@gitlab.com> | 2022-01-26 17:24:29 +0300 |
commit | ffb818c4aeb5859e243f850fb1482b5fdeba008b (patch) | |
tree | f3209bb8bd7698eb7455cf0077f9d0c38984bb5f /internal | |
parent | 496177d2363379f9a0fa71087dbbbae427ac7994 (diff) | |
parent | 06ac5159ed6bb6a3a78f678841ae494e3d569ab2 (diff) |
Merge branch 'mock/resolver' into 'master'
test: update domain test to use mocked resolver
See merge request gitlab-org/gitlab-pages!647
Diffstat (limited to 'internal')
-rw-r--r-- | internal/domain/domain.go | 6 | ||||
-rw-r--r-- | internal/domain/domain_test.go | 112 | ||||
-rw-r--r-- | internal/mocks/resolver.go | 51 |
3 files changed, 116 insertions, 53 deletions
diff --git a/internal/domain/domain.go b/internal/domain/domain.go index 695bc166..bf202cd3 100644 --- a/internal/domain/domain.go +++ b/internal/domain/domain.go @@ -157,10 +157,10 @@ func (d *Domain) ServeNotFoundHTTP(w http.ResponseWriter, r *http.Request) { request.ServeNotFoundHTTP(w, r) } -// serveNamespaceNotFound will try to find a parent namespace domain for a request +// ServeNamespaceNotFound will try to find a parent namespace domain for a request // that failed authentication so that we serve the custom namespace error page for // public namespace domains -func (d *Domain) serveNamespaceNotFound(w http.ResponseWriter, r *http.Request) { +func (d *Domain) ServeNamespaceNotFound(w http.ResponseWriter, r *http.Request) { // clone r and override the path and try to resolve the domain name clonedReq := r.Clone(context.Background()) clonedReq.URL.Path = "/" @@ -201,5 +201,5 @@ func (d *Domain) ServeNotFoundAuthFailed(w http.ResponseWriter, r *http.Request) return } - d.serveNamespaceNotFound(w, r) + d.ServeNamespaceNotFound(w, r) } diff --git a/internal/domain/domain_test.go b/internal/domain/domain_test.go index 57b8f185..408ddf38 100644 --- a/internal/domain/domain_test.go +++ b/internal/domain/domain_test.go @@ -1,33 +1,22 @@ -package domain +package domain_test import ( "fmt" "net/http" "testing" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" + "gitlab.com/gitlab-org/gitlab-pages/internal/domain" "gitlab.com/gitlab-org/gitlab-pages/internal/fixture" + "gitlab.com/gitlab-org/gitlab-pages/internal/mocks" "gitlab.com/gitlab-org/gitlab-pages/internal/serving" "gitlab.com/gitlab-org/gitlab-pages/internal/serving/disk/local" "gitlab.com/gitlab-org/gitlab-pages/internal/testhelpers" ) -type stubbedResolver struct { - project *serving.LookupPath - subpath string - err error -} - -func (resolver *stubbedResolver) Resolve(*http.Request) (*serving.Request, error) { - return &serving.Request{ - Serving: local.Instance(), - LookupPath: resolver.project, - SubPath: resolver.subpath, - }, resolver.err -} - -func serveFileOrNotFound(domain *Domain) http.HandlerFunc { +func serveFileOrNotFound(domain *domain.Domain) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if !domain.ServeFileHTTP(w, r) { domain.ServeNotFoundHTTP(w, r) @@ -38,39 +27,41 @@ func serveFileOrNotFound(domain *Domain) http.HandlerFunc { func TestIsHTTPSOnly(t *testing.T) { tests := []struct { name string - domain *Domain + domain *domain.Domain url string expected bool }{ { name: "Custom domain with HTTPS-only enabled", - domain: New("custom-domain", "", "", - &stubbedResolver{ - project: &serving.LookupPath{ + domain: domain.New("custom-domain", "", "", + mockResolver(t, + &serving.LookupPath{ Path: "group/project/public", SHA256: "foo", IsHTTPSOnly: true, }, - }), + "", + nil)), url: "http://custom-domain", expected: true, }, { name: "Custom domain with HTTPS-only disabled", - domain: New("custom-domain", "", "", - &stubbedResolver{ - project: &serving.LookupPath{ + domain: domain.New("custom-domain", "", "", + mockResolver(t, + &serving.LookupPath{ Path: "group/project/public", SHA256: "foo", IsHTTPSOnly: false, }, - }), + "", + nil)), url: "http://custom-domain", expected: false, }, { name: "Unknown project", - domain: New("", "", "", &stubbedResolver{err: ErrDomainDoesNotExist}), + domain: domain.New("", "", "", mockResolver(t, nil, "", domain.ErrDomainDoesNotExist)), url: "http://test-domain/project", expected: false, }, @@ -88,14 +79,14 @@ func TestPredefined404ServeHTTP(t *testing.T) { cleanup := setUpTests(t) defer cleanup() - testDomain := New("", "", "", &stubbedResolver{err: ErrDomainDoesNotExist}) + testDomain := domain.New("", "", "", mockResolver(t, nil, "", domain.ErrDomainDoesNotExist)) require.HTTPStatusCode(t, serveFileOrNotFound(testDomain), http.MethodGet, "http://group.test.io/not-existing-file", nil, http.StatusNotFound) require.HTTPBodyContains(t, serveFileOrNotFound(testDomain), http.MethodGet, "http://group.test.io/not-existing-file", nil, "The page you're looking for could not be found") } func TestGroupCertificate(t *testing.T) { - testGroup := &Domain{} + testGroup := &domain.Domain{} tls, err := testGroup.EnsureCertificate() require.Nil(t, tls) @@ -103,7 +94,7 @@ func TestGroupCertificate(t *testing.T) { } func TestDomainNoCertificate(t *testing.T) { - testDomain := &Domain{ + testDomain := &domain.Domain{ Name: "test.domain.com", } @@ -118,7 +109,7 @@ func TestDomainNoCertificate(t *testing.T) { func BenchmarkEnsureCertificate(b *testing.B) { for i := 0; i < b.N; i++ { - testDomain := &Domain{ + testDomain := &domain.Domain{ Name: "test.domain.com", CertificateCert: fixture.Certificate, CertificateKey: fixture.Key, @@ -142,70 +133,91 @@ func TestServeNamespaceNotFound(t *testing.T) { name string domain string path string - resolver *stubbedResolver + resolver domain.Resolver expectedResponse string }{ { name: "public_namespace_domain", domain: "group.404.gitlab-example.com", path: "/unknown", - resolver: &stubbedResolver{ - project: &serving.LookupPath{ + resolver: mockResolver(t, + &serving.LookupPath{ Path: "group.404/group.404.gitlab-example.com/public", IsNamespaceProject: true, }, - subpath: "/unknown", - }, + "/unknown", + nil, + ), expectedResponse: "Custom 404 group page", }, { name: "private_project_under_public_namespace_domain", domain: "group.404.gitlab-example.com", path: "/private_project/unknown", - resolver: &stubbedResolver{ - project: &serving.LookupPath{ + resolver: mockResolver(t, + &serving.LookupPath{ Path: "group.404/group.404.gitlab-example.com/public", IsNamespaceProject: true, HasAccessControl: false, }, - subpath: "/", - }, + "/", + nil, + ), expectedResponse: "Custom 404 group page", }, { name: "private_namespace_domain", domain: "group.404.gitlab-example.com", path: "/unknown", - resolver: &stubbedResolver{ - project: &serving.LookupPath{ + resolver: mockResolver(t, + &serving.LookupPath{ Path: "group.404/group.404.gitlab-example.com/public", IsNamespaceProject: true, HasAccessControl: true, }, - subpath: "/", - }, + "/", + nil, + ), expectedResponse: "The page you're looking for could not be found.", }, { name: "no_parent_namespace_domain", domain: "group.404.gitlab-example.com", path: "/unknown", - resolver: &stubbedResolver{ - err: ErrDomainDoesNotExist, - subpath: "/", - }, + resolver: mockResolver(t, + nil, + "/", + domain.ErrDomainDoesNotExist, + ), expectedResponse: "The page you're looking for could not be found.", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - d := &Domain{ + d := &domain.Domain{ Name: tt.domain, Resolver: tt.resolver, } - require.HTTPStatusCode(t, d.serveNamespaceNotFound, http.MethodGet, fmt.Sprintf("http://%s%s", tt.domain, tt.path), nil, http.StatusNotFound) - require.HTTPBodyContains(t, d.serveNamespaceNotFound, http.MethodGet, fmt.Sprintf("http://%s%s", tt.domain, tt.path), nil, tt.expectedResponse) + require.HTTPStatusCode(t, d.ServeNamespaceNotFound, http.MethodGet, fmt.Sprintf("http://%s%s", tt.domain, tt.path), nil, http.StatusNotFound) + require.HTTPBodyContains(t, d.ServeNamespaceNotFound, http.MethodGet, fmt.Sprintf("http://%s%s", tt.domain, tt.path), nil, tt.expectedResponse) }) } } + +func mockResolver(t *testing.T, project *serving.LookupPath, subpath string, err error) domain.Resolver { + mockCtrl := gomock.NewController(t) + + mockResolver := mocks.NewMockResolver(mockCtrl) + + mockResolver.EXPECT(). + Resolve(gomock.Any()). + AnyTimes(). + Return(&serving.Request{ + Serving: local.Instance(), + LookupPath: project, + SubPath: subpath, + }, err) + + return mockResolver +} diff --git a/internal/mocks/resolver.go b/internal/mocks/resolver.go new file mode 100644 index 00000000..14b86a9c --- /dev/null +++ b/internal/mocks/resolver.go @@ -0,0 +1,51 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: internal/domain/resolver.go + +// Package mocks is a generated GoMock package. +package mocks + +import ( + http "net/http" + reflect "reflect" + + gomock "github.com/golang/mock/gomock" + serving "gitlab.com/gitlab-org/gitlab-pages/internal/serving" +) + +// MockResolver is a mock of Resolver interface. +type MockResolver struct { + ctrl *gomock.Controller + recorder *MockResolverMockRecorder +} + +// MockResolverMockRecorder is the mock recorder for MockResolver. +type MockResolverMockRecorder struct { + mock *MockResolver +} + +// NewMockResolver creates a new mock instance. +func NewMockResolver(ctrl *gomock.Controller) *MockResolver { + mock := &MockResolver{ctrl: ctrl} + mock.recorder = &MockResolverMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockResolver) EXPECT() *MockResolverMockRecorder { + return m.recorder +} + +// Resolve mocks base method. +func (m *MockResolver) Resolve(arg0 *http.Request) (*serving.Request, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Resolve", arg0) + ret0, _ := ret[0].(*serving.Request) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Resolve indicates an expected call of Resolve. +func (mr *MockResolverMockRecorder) Resolve(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Resolve", reflect.TypeOf((*MockResolver)(nil).Resolve), arg0) +} |