internal/command/healthcheck/healthcheck_test.go
package healthcheck
import (
"bytes"
"context"
"encoding/json"
"net/http"
"testing"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitlab-shell/v14/client/testserver"
"gitlab.com/gitlab-org/gitlab-shell/v14/internal/command/readwriter"
"gitlab.com/gitlab-org/gitlab-shell/v14/internal/config"
"gitlab.com/gitlab-org/gitlab-shell/v14/internal/gitlabnet/healthcheck"
)
var (
okResponse = &healthcheck.Response{
APIVersion: "v4",
GitlabVersion: "v12.0.0-ee",
GitlabRevision: "3b13818e8330f68625d80d9bf5d8049c41fbe197",
Redis: true,
}
badRedisResponse = &healthcheck.Response{Redis: false}
okHandlers = buildTestHandlers(200, okResponse)
badRedisHandlers = buildTestHandlers(200, badRedisResponse)
brokenHandlers = buildTestHandlers(500, nil)
)
func buildTestHandlers(code int, rsp *healthcheck.Response) []testserver.TestRequestHandler {
return []testserver.TestRequestHandler{
{
Path: "/api/v4/internal/check",
Handler: func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(code)
if rsp != nil {
json.NewEncoder(w).Encode(rsp)
}
},
},
}
}
func TestExecute(t *testing.T) {
url := testserver.StartSocketHttpServer(t, okHandlers)
buffer := &bytes.Buffer{}
cmd := &Command{
Config: &config.Config{GitlabUrl: url},
ReadWriter: &readwriter.ReadWriter{Out: buffer},
}
_, err := cmd.Execute(context.Background())
require.NoError(t, err)
require.Equal(t, "Internal API available: OK\nRedis available via internal API: OK\n", buffer.String())
}
func TestFailingRedisExecute(t *testing.T) {
url := testserver.StartSocketHttpServer(t, badRedisHandlers)
buffer := &bytes.Buffer{}
cmd := &Command{
Config: &config.Config{GitlabUrl: url},
ReadWriter: &readwriter.ReadWriter{Out: buffer},
}
_, err := cmd.Execute(context.Background())
require.Error(t, err, "Redis available via internal API: FAILED")
require.Equal(t, "Internal API available: OK\n", buffer.String())
}
func TestFailingAPIExecute(t *testing.T) {
url := testserver.StartSocketHttpServer(t, brokenHandlers)
buffer := &bytes.Buffer{}
cmd := &Command{
Config: &config.Config{GitlabUrl: url},
ReadWriter: &readwriter.ReadWriter{Out: buffer},
}
_, err := cmd.Execute(context.Background())
require.Empty(t, buffer.String())
require.EqualError(t, err, "Internal API available: FAILED - Internal API unreachable")
}