summaryrefslogtreecommitdiff
path: root/go/internal/gitlabnet/client_test.go
diff options
context:
space:
mode:
authorBob Van Landuyt <bob@vanlanduyt.co>2019-03-07 10:58:37 +0100
committerBob Van Landuyt <bob@vanlanduyt.co>2019-03-14 12:18:07 +0100
commit53511f3655a5eed9976164fbd88d14df3490000c (patch)
treeb46d8d7ccee0d21f9d5e8df3af02b6f37db5852d /go/internal/gitlabnet/client_test.go
parent049beb74303a03d9fa598d23b150e0ccea3cd60d (diff)
downloadgitlab-shell-53511f3655a5eed9976164fbd88d14df3490000c.tar.gz
Detect user based on key, username or id
This allows gitlab-shell to be called with an argument of the format `key-123` or `username-name`. When called in this way, `gitlab-shell` will call the GitLab internal API. If the API responds with user information, it will print a welcome message including the username. If the API responds with a successful but empty response, gitlab-shell will print a welcome message for an anonymous user. If the API response includes an error message in JSON, this message will be printed to stderr. If the API call fails, an error message including the status code will be printed to stderr.
Diffstat (limited to 'go/internal/gitlabnet/client_test.go')
-rw-r--r--go/internal/gitlabnet/client_test.go131
1 files changed, 131 insertions, 0 deletions
diff --git a/go/internal/gitlabnet/client_test.go b/go/internal/gitlabnet/client_test.go
new file mode 100644
index 0000000..f69f284
--- /dev/null
+++ b/go/internal/gitlabnet/client_test.go
@@ -0,0 +1,131 @@
+package gitlabnet
+
+import (
+ "encoding/base64"
+ "encoding/json"
+ "fmt"
+ "io/ioutil"
+ "net/http"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+ "gitlab.com/gitlab-org/gitlab-shell/go/internal/config"
+ "gitlab.com/gitlab-org/gitlab-shell/go/internal/gitlabnet/testserver"
+)
+
+func TestClients(t *testing.T) {
+ requests := []testserver.TestRequestHandler{
+ {
+ Path: "/api/v4/internal/hello",
+ Handler: func(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprint(w, "Hello")
+ },
+ },
+ {
+ Path: "/api/v4/internal/auth",
+ Handler: func(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprint(w, r.Header.Get(secretHeaderName))
+ },
+ },
+ {
+ Path: "/api/v4/internal/error",
+ Handler: func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(http.StatusBadRequest)
+ body := map[string]string{
+ "message": "Don't do that",
+ }
+ json.NewEncoder(w).Encode(body)
+ },
+ },
+ {
+ Path: "/api/v4/internal/broken",
+ Handler: func(w http.ResponseWriter, r *http.Request) {
+ panic("Broken")
+ },
+ },
+ }
+ testConfig := &config.Config{GitlabUrl: "http+unix://" + testserver.TestSocket, Secret: "sssh, it's a secret"}
+
+ testCases := []struct {
+ desc string
+ client GitlabClient
+ server func([]testserver.TestRequestHandler) (func(), error)
+ }{
+ {
+ desc: "Socket client",
+ client: buildSocketClient(testConfig),
+ server: testserver.StartSocketHttpServer,
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.desc, func(t *testing.T) {
+ cleanup, err := tc.server(requests)
+ defer cleanup()
+ require.NoError(t, err)
+
+ testBrokenRequest(t, tc.client)
+ testSuccessfulGet(t, tc.client)
+ testMissing(t, tc.client)
+ testErrorMessage(t, tc.client)
+ testAuthenticationHeader(t, tc.client)
+ })
+ }
+}
+
+func testSuccessfulGet(t *testing.T, client GitlabClient) {
+ t.Run("Successful get", func(t *testing.T) {
+ response, err := client.Get("/hello")
+ defer response.Body.Close()
+
+ require.NoError(t, err)
+ require.NotNil(t, response)
+
+ responseBody, err := ioutil.ReadAll(response.Body)
+ assert.NoError(t, err)
+ assert.Equal(t, string(responseBody), "Hello")
+ })
+}
+
+func testMissing(t *testing.T, client GitlabClient) {
+ t.Run("Missing error", func(t *testing.T) {
+ response, err := client.Get("/missing")
+ assert.EqualError(t, err, "Internal API error (404)")
+ assert.Nil(t, response)
+ })
+}
+
+func testErrorMessage(t *testing.T, client GitlabClient) {
+ t.Run("Error with message", func(t *testing.T) {
+ response, err := client.Get("/error")
+ assert.EqualError(t, err, "Don't do that")
+ assert.Nil(t, response)
+ })
+}
+
+func testBrokenRequest(t *testing.T, client GitlabClient) {
+ t.Run("Broken request", func(t *testing.T) {
+ response, err := client.Get("/broken")
+ assert.EqualError(t, err, "Internal API unreachable")
+ assert.Nil(t, response)
+ })
+}
+
+func testAuthenticationHeader(t *testing.T, client GitlabClient) {
+ t.Run("Authentication headers", func(t *testing.T) {
+ response, err := client.Get("/auth")
+ defer response.Body.Close()
+
+ require.NoError(t, err)
+ require.NotNil(t, response)
+
+ responseBody, err := ioutil.ReadAll(response.Body)
+ require.NoError(t, err)
+
+ header, err := base64.StdEncoding.DecodeString(string(responseBody))
+ require.NoError(t, err)
+ assert.Equal(t, "sssh, it's a secret", string(header))
+ })
+}