coder/enterprise/cli/workspaceproxy_test.go

141 lines
3.5 KiB
Go

package cli_test
import (
"strings"
"testing"
"github.com/google/uuid"
"github.com/stretchr/testify/require"
"github.com/coder/coder/v2/cli/clitest"
"github.com/coder/coder/v2/coderd/coderdtest"
"github.com/coder/coder/v2/codersdk"
"github.com/coder/coder/v2/enterprise/coderd/coderdenttest"
"github.com/coder/coder/v2/enterprise/coderd/license"
"github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
)
func Test_ProxyCRUD(t *testing.T) {
t.Parallel()
t.Run("Create", func(t *testing.T) {
t.Parallel()
dv := coderdtest.DeploymentValues(t)
dv.Experiments = []string{
string(codersdk.ExperimentMoons),
"*",
}
client, _ := coderdenttest.New(t, &coderdenttest.Options{
Options: &coderdtest.Options{
DeploymentValues: dv,
},
LicenseOptions: &coderdenttest.LicenseOptions{
Features: license.Features{
codersdk.FeatureWorkspaceProxy: 1,
},
},
})
expectedName := "test-proxy"
ctx := testutil.Context(t, testutil.WaitLong)
inv, conf := newCLI(
t,
"wsproxy", "create",
"--name", expectedName,
"--display-name", "Test Proxy",
"--icon", "/emojis/1f4bb.png",
"--only-token",
)
pty := ptytest.New(t)
inv.Stdout = pty.Output()
clitest.SetupConfig(t, client, conf) //nolint:gocritic // create wsproxy requires owner
err := inv.WithContext(ctx).Run()
require.NoError(t, err)
line := pty.ReadLine(ctx)
parts := strings.Split(line, ":")
require.Len(t, parts, 2, "expected 2 parts")
_, err = uuid.Parse(parts[0])
require.NoError(t, err, "expected token to be a uuid")
// Fetch proxies and check output
inv, conf = newCLI(
t,
"wsproxy", "ls",
)
pty = ptytest.New(t)
inv.Stdout = pty.Output()
clitest.SetupConfig(t, client, conf) //nolint:gocritic // requires owner
err = inv.WithContext(ctx).Run()
require.NoError(t, err)
pty.ExpectMatch(expectedName)
// Also check via the api
proxies, err := client.WorkspaceProxies(ctx) //nolint:gocritic // requires owner
require.NoError(t, err, "failed to get workspace proxies")
// Include primary
require.Len(t, proxies.Regions, 2, "expected 1 proxy")
found := false
for _, proxy := range proxies.Regions {
if proxy.Name == expectedName {
found = true
}
}
require.True(t, found, "expected proxy to be found")
})
t.Run("Delete", func(t *testing.T) {
t.Parallel()
dv := coderdtest.DeploymentValues(t)
dv.Experiments = []string{
string(codersdk.ExperimentMoons),
"*",
}
client, _ := coderdenttest.New(t, &coderdenttest.Options{
Options: &coderdtest.Options{
DeploymentValues: dv,
},
LicenseOptions: &coderdenttest.LicenseOptions{
Features: license.Features{
codersdk.FeatureWorkspaceProxy: 1,
},
},
})
ctx := testutil.Context(t, testutil.WaitLong)
expectedName := "test-proxy"
_, err := client.CreateWorkspaceProxy(ctx, codersdk.CreateWorkspaceProxyRequest{
Name: expectedName,
DisplayName: "Test Proxy",
Icon: "/emojis/us.png",
})
require.NoError(t, err, "failed to create workspace proxy")
inv, conf := newCLI(
t,
"wsproxy", "delete", "-y", expectedName,
)
pty := ptytest.New(t)
inv.Stdout = pty.Output()
clitest.SetupConfig(t, client, conf) //nolint:gocritic // requires owner
err = inv.WithContext(ctx).Run()
require.NoError(t, err)
proxies, err := client.WorkspaceProxies(ctx) //nolint:gocritic // requires owner
require.NoError(t, err, "failed to get workspace proxies")
require.Len(t, proxies.Regions, 1, "expected only primary proxy")
})
}