diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2019-11-26 17:22:02 +0300 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2019-11-26 17:22:02 +0300 |
commit | 204b225d2308a61586ad7557d1f2f86bebfe73e6 (patch) | |
tree | f06a8f725fc2f5f5bb78ddd165d4c716fbe35324 | |
parent | 806c6dcec76021c78026dc0301331dbe983a938d (diff) |
Make new gitlab domains source more testable
-rw-r--r-- | internal/auth/auth_test.go | 21 | ||||
-rw-r--r-- | internal/source/domains_test.go | 17 | ||||
-rw-r--r-- | internal/source/gitlab/client/client_stub.go | 31 | ||||
-rw-r--r-- | internal/source/gitlab/client/testdata/test.gitlab.io.json | 1 | ||||
-rw-r--r-- | internal/source/gitlab/gitlab_test.go | 35 | ||||
-rw-r--r-- | internal/source/source_mock.go | 24 |
6 files changed, 99 insertions, 30 deletions
diff --git a/internal/auth/auth_test.go b/internal/auth/auth_test.go index 0278b595..92e1e8c7 100644 --- a/internal/auth/auth_test.go +++ b/internal/auth/auth_test.go @@ -10,11 +10,10 @@ import ( "testing" "github.com/gorilla/sessions" - "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "gitlab.com/gitlab-org/gitlab-pages/internal/domain" "gitlab.com/gitlab-org/gitlab-pages/internal/request" + "gitlab.com/gitlab-org/gitlab-pages/internal/source" ) func createAuth(t *testing.T) *Auth { @@ -30,16 +29,6 @@ func defaultCookieStore() sessions.Store { return createCookieStore("something-very-secret") } -type mockSource struct { - mock.Mock -} - -func (m *mockSource) GetDomain(name string) (*domain.Domain, error) { - args := m.Called(name) - - return args.Get(0).(*domain.Domain), args.Error(1) -} - // Gorilla's sessions use request context to save session // Which makes session sharable between test code and actually manipulating session // Which leads to negative side effects: we can't test encryption, and cookie params @@ -67,7 +56,7 @@ func TestTryAuthenticate(t *testing.T) { require.NoError(t, err) r := request.WithHTTPSFlag(&http.Request{URL: reqURL}, true) - require.Equal(t, false, auth.TryAuthenticate(result, r, new(mockSource))) + require.Equal(t, false, auth.TryAuthenticate(result, r, source.NewMockSource())) } func TestTryAuthenticateWithError(t *testing.T) { @@ -78,7 +67,7 @@ func TestTryAuthenticateWithError(t *testing.T) { require.NoError(t, err) r := request.WithHTTPSFlag(&http.Request{URL: reqURL}, true) - require.Equal(t, true, auth.TryAuthenticate(result, r, new(mockSource))) + require.Equal(t, true, auth.TryAuthenticate(result, r, source.NewMockSource())) require.Equal(t, 401, result.Code) } @@ -95,7 +84,7 @@ func TestTryAuthenticateWithCodeButInvalidState(t *testing.T) { session.Values["state"] = "state" session.Save(r, result) - require.Equal(t, true, auth.TryAuthenticate(result, r, new(mockSource))) + require.Equal(t, true, auth.TryAuthenticate(result, r, source.NewMockSource())) require.Equal(t, 401, result.Code) } @@ -135,7 +124,7 @@ func testTryAuthenticateWithCodeAndState(t *testing.T, https bool) { }) result := httptest.NewRecorder() - require.Equal(t, true, auth.TryAuthenticate(result, r, new(mockSource))) + require.Equal(t, true, auth.TryAuthenticate(result, r, source.NewMockSource())) require.Equal(t, 302, result.Code) require.Equal(t, "https://pages.gitlab-example.com/project/", result.Header().Get("Location")) require.Equal(t, 600, result.Result().Cookies()[0].MaxAge) diff --git a/internal/source/domains_test.go b/internal/source/domains_test.go index 74ac84c6..5125f462 100644 --- a/internal/source/domains_test.go +++ b/internal/source/domains_test.go @@ -4,28 +4,17 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "gitlab.com/gitlab-org/gitlab-pages/internal/domain" "gitlab.com/gitlab-org/gitlab-pages/internal/source/disk" ) -type mockSource struct { - mock.Mock -} - -func (m *mockSource) GetDomain(name string) (*domain.Domain, error) { - args := m.Called(name) - - return args.Get(0).(*domain.Domain), args.Error(1) -} - func TestHasDomain(t *testing.T) { testDomain := newSourceDomains[0] t.Run("when requesting a test domain", func(t *testing.T) { - newSource := new(mockSource) + newSource := NewMockSource() newSource.On("GetDomain", testDomain). Return(&domain.Domain{Name: testDomain}, nil). Once() @@ -40,7 +29,7 @@ func TestHasDomain(t *testing.T) { }) t.Run("when requesting a non-test domain", func(t *testing.T) { - newSource := new(mockSource) + newSource := NewMockSource() defer newSource.AssertExpectations(t) domains := &Domains{ @@ -55,7 +44,7 @@ func TestHasDomain(t *testing.T) { }) t.Run("when requesting a broken test domain", func(t *testing.T) { - newSource := new(mockSource) + newSource := NewMockSource() defer newSource.AssertExpectations(t) domains := &Domains{ diff --git a/internal/source/gitlab/client/client_stub.go b/internal/source/gitlab/client/client_stub.go new file mode 100644 index 00000000..48dbf549 --- /dev/null +++ b/internal/source/gitlab/client/client_stub.go @@ -0,0 +1,31 @@ +package client + +import ( + "encoding/json" + "os" + + "gitlab.com/gitlab-org/gitlab-pages/internal/source/gitlab/domain" +) + +// StubClient is a stubbed client used for testing +type StubClient struct { + file string +} + +// GetVirtualDomain reads a test fixture and unmarshalls it +func (m *StubClient) GetVirtualDomain(host string) (domain *domain.VirtualDomain, err error) { + f, err := os.Open(m.file) + defer f.Close() + if err != nil { + return nil, err + } + + err = json.NewDecoder(f).Decode(&domain) + + return domain, err +} + +// NewStubClient return a stubbed client +func NewStubClient(fixture string) *StubClient { + return &StubClient{file: fixture} +} diff --git a/internal/source/gitlab/client/testdata/test.gitlab.io.json b/internal/source/gitlab/client/testdata/test.gitlab.io.json new file mode 100644 index 00000000..dfe65ad0 --- /dev/null +++ b/internal/source/gitlab/client/testdata/test.gitlab.io.json @@ -0,0 +1 @@ +{"certificate":"some--cert","key":"some--key","lookup_paths":[{"project_id":123,"access_control":false,"https_only":true,"prefix":"/my/pages/project","source":{"type":"file","path":"/some/path/to/project/"}}]}
\ No newline at end of file diff --git a/internal/source/gitlab/gitlab_test.go b/internal/source/gitlab/gitlab_test.go new file mode 100644 index 00000000..74cbcb79 --- /dev/null +++ b/internal/source/gitlab/gitlab_test.go @@ -0,0 +1,35 @@ +package gitlab + +import ( + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "gitlab.com/gitlab-org/gitlab-pages/internal/source/gitlab/cache" + "gitlab.com/gitlab-org/gitlab-pages/internal/source/gitlab/client" +) + +func TestGetDomain(t *testing.T) { + client := client.NewStubClient("client/testdata/test.gitlab.io.json") + source := Gitlab{client: client, cache: cache.New()} + + domain, err := source.GetDomain("test.gitlab.io") + require.NoError(t, err) + + assert.Equal(t, "test.gitlab.io", domain.Name) +} + +func TestResolve(t *testing.T) { + client := client.NewStubClient("client/testdata/test.gitlab.io.json") + source := Gitlab{client: client, cache: cache.New()} + target := "https://test.gitlab.io:443/my/pages/project/path/index.html" + request := httptest.NewRequest("GET", target, nil) + + lookup, subpath, err := source.Resolve(request) + require.NoError(t, err) + + assert.Equal(t, "/my/pages/project", lookup.Location) + assert.Equal(t, "/path/index.html", subpath) +} diff --git a/internal/source/source_mock.go b/internal/source/source_mock.go new file mode 100644 index 00000000..ee24d804 --- /dev/null +++ b/internal/source/source_mock.go @@ -0,0 +1,24 @@ +package source + +import ( + "github.com/stretchr/testify/mock" + + "gitlab.com/gitlab-org/gitlab-pages/internal/domain" +) + +// MockSource can be used for testing +type MockSource struct { + mock.Mock +} + +// GetDomain is a mocked function +func (m *MockSource) GetDomain(name string) (*domain.Domain, error) { + args := m.Called(name) + + return args.Get(0).(*domain.Domain), args.Error(1) +} + +// NewMockSource returns a new Source mock for testing +func NewMockSource() *MockSource { + return &MockSource{} +} |