supabase-cli/internal/status/status_test.go

177 lines
5.8 KiB
Go

package status
import (
"bytes"
"context"
"errors"
"net/http"
"testing"
"github.com/docker/docker/api/types"
"github.com/h2non/gock"
"github.com/spf13/afero"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/supabase/cli/internal/testing/apitest"
"github.com/supabase/cli/internal/utils"
)
func TestStatusCommand(t *testing.T) {
t.Run("shows service status", func(t *testing.T) {
var running []types.Container
for _, name := range utils.GetDockerIds() {
running = append(running, types.Container{
Names: []string{name + "_test"},
})
}
// Setup in-memory fs
fsys := afero.NewMemMapFs()
require.NoError(t, utils.InitConfig(utils.InitParams{ProjectId: "test"}, fsys))
// Setup mock docker
require.NoError(t, apitest.MockDocker(utils.Docker))
defer gock.OffAll()
gock.New(utils.Docker.DaemonHost()).
Get("/v" + utils.Docker.ClientVersion() + "/containers/supabase_db_test/json").
Reply(http.StatusOK).
JSON(types.ContainerJSON{ContainerJSONBase: &types.ContainerJSONBase{
State: &types.ContainerState{Running: true},
}})
gock.New(utils.Docker.DaemonHost()).
Get("/v" + utils.Docker.ClientVersion() + "/containers/json").
Reply(http.StatusOK).
JSON(running)
// Run test
assert.NoError(t, Run(context.Background(), CustomName{}, utils.OutputPretty, fsys))
// Check error
assert.Empty(t, apitest.ListUnmatchedRequests())
})
t.Run("throws error on malformed config", func(t *testing.T) {
// Setup in-memory fs
fsys := afero.NewMemMapFs()
require.NoError(t, afero.WriteFile(fsys, utils.ConfigPath, []byte("malformed"), 0644))
// Run test
err := Run(context.Background(), CustomName{}, utils.OutputPretty, fsys)
// Check error
assert.ErrorContains(t, err, "toml: expected = after a key, but the document ends there")
})
t.Run("throws error on missing docker", func(t *testing.T) {
// Setup in-memory fs
fsys := afero.NewMemMapFs()
require.NoError(t, utils.WriteConfig(fsys, false))
// Setup mock docker
require.NoError(t, apitest.MockDocker(utils.Docker))
defer gock.OffAll()
gock.New(utils.Docker.DaemonHost()).
Get("/v" + utils.Docker.ClientVersion() + "/containers/supabase_db_").
ReplyError(errors.New("network error"))
// Run test
err := Run(context.Background(), CustomName{}, utils.OutputPretty, fsys)
// Check error
assert.ErrorContains(t, err, "network error")
assert.Empty(t, apitest.ListUnmatchedRequests())
})
}
func TestServiceHealth(t *testing.T) {
t.Run("checks all services", func(t *testing.T) {
var running []types.Container
for _, name := range utils.GetDockerIds() {
running = append(running, types.Container{
Names: []string{"/" + name},
})
}
// Setup mock docker
require.NoError(t, apitest.MockDocker(utils.Docker))
defer gock.OffAll()
gock.New(utils.Docker.DaemonHost()).
Get("/v" + utils.Docker.ClientVersion() + "/containers/json").
Reply(http.StatusOK).
JSON(running)
// Run test
stopped, err := checkServiceHealth(context.Background())
// Check error
assert.NoError(t, err)
assert.Empty(t, stopped)
assert.Empty(t, apitest.ListUnmatchedRequests())
})
t.Run("shows stopped container", func(t *testing.T) {
// Setup mock docker
require.NoError(t, apitest.MockDocker(utils.Docker))
defer gock.OffAll()
gock.New(utils.Docker.DaemonHost()).
Get("/v" + utils.Docker.ClientVersion() + "/containers/json").
Reply(http.StatusOK).
JSON([]types.Container{})
// Run test
stopped, err := checkServiceHealth(context.Background())
// Check error
assert.NoError(t, err)
assert.ElementsMatch(t, utils.GetDockerIds(), stopped)
assert.Empty(t, apitest.ListUnmatchedRequests())
})
t.Run("throws error on network error", func(t *testing.T) {
errNetwork := errors.New("network error")
// Setup mock docker
require.NoError(t, apitest.MockDocker(utils.Docker))
defer gock.OffAll()
gock.New(utils.Docker.DaemonHost()).
Get("/v" + utils.Docker.ClientVersion() + "/containers/json").
ReplyError(errNetwork)
// Run test
stopped, err := checkServiceHealth(context.Background())
// Check error
assert.ErrorIs(t, err, errNetwork)
assert.Empty(t, stopped)
assert.Empty(t, apitest.ListUnmatchedRequests())
})
}
func TestPrintStatus(t *testing.T) {
utils.Config.Db.Port = 0
utils.Config.Hostname = "127.0.0.1"
utils.Config.Api.Enabled = false
utils.Config.Auth.Enabled = false
utils.Config.Storage.Enabled = false
utils.Config.Realtime.Enabled = false
utils.Config.Studio.Enabled = false
utils.Config.Analytics.Enabled = false
utils.Config.Inbucket.Enabled = false
t.Run("outputs env var", func(t *testing.T) {
utils.Config.Hostname = "127.0.0.1"
// Run test
var stdout bytes.Buffer
assert.NoError(t, printStatus(CustomName{DbURL: "DB_URL"}, utils.OutputEnv, &stdout))
// Check error
assert.Equal(t, "DB_URL=\"postgresql://postgres:postgres@127.0.0.1:0/postgres\"\n", stdout.String())
})
t.Run("outputs json object", func(t *testing.T) {
// Run test
var stdout bytes.Buffer
assert.NoError(t, printStatus(CustomName{DbURL: "DB_URL"}, utils.OutputJson, &stdout))
// Check error
assert.Equal(t, "{\n \"DB_URL\": \"postgresql://postgres:postgres@127.0.0.1:0/postgres\"\n}\n", stdout.String())
})
t.Run("outputs yaml properties", func(t *testing.T) {
// Run test
var stdout bytes.Buffer
assert.NoError(t, printStatus(CustomName{DbURL: "DB_URL"}, utils.OutputYaml, &stdout))
// Check error
assert.Equal(t, "DB_URL: postgresql://postgres:postgres@127.0.0.1:0/postgres\n", stdout.String())
})
t.Run("outputs toml fields", func(t *testing.T) {
// Run test
var stdout bytes.Buffer
assert.NoError(t, printStatus(CustomName{DbURL: "DB_URL"}, utils.OutputToml, &stdout))
// Check error
assert.Equal(t, "DB_URL = \"postgresql://postgres:postgres@127.0.0.1:0/postgres\"\n", stdout.String())
})
}