Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-pages.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2019-11-26 17:22:02 +0300
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2019-11-26 17:22:02 +0300
commit204b225d2308a61586ad7557d1f2f86bebfe73e6 (patch)
treef06a8f725fc2f5f5bb78ddd165d4c716fbe35324
parent806c6dcec76021c78026dc0301331dbe983a938d (diff)
Make new gitlab domains source more testable
-rw-r--r--internal/auth/auth_test.go21
-rw-r--r--internal/source/domains_test.go17
-rw-r--r--internal/source/gitlab/client/client_stub.go31
-rw-r--r--internal/source/gitlab/client/testdata/test.gitlab.io.json1
-rw-r--r--internal/source/gitlab/gitlab_test.go35
-rw-r--r--internal/source/source_mock.go24
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{}
+}