Files
proxy/cmd/proxyctl/shell_test.go
T

64 lines
2.4 KiB
Go

package main
import (
"bytes"
"os"
"path/filepath"
"strings"
"testing"
"proxyctl/internal/profile"
"proxyctl/internal/shell"
)
type commandEnvironment struct {
identity profile.UserIdentity
env map[string]string
}
func (e commandEnvironment) CurrentUser() (profile.UserIdentity, error) { return e.identity, nil }
func (e commandEnvironment) LookupUser(string) (profile.UserIdentity, error) {
return profile.UserIdentity{}, os.ErrNotExist
}
func (e commandEnvironment) LookupEnv(name string) (string, bool) {
value, ok := e.env[name]
return value, ok
}
func TestShellInstallAndUninstallCommandsUseInjectedUserRoots(t *testing.T) {
home := t.TempDir()
environment := commandEnvironment{identity: profile.UserIdentity{Username: "tester", HomeDir: home, UID: os.Getuid(), GID: os.Getgid()}, env: map[string]string{"SHELL": "/bin/bash", "XDG_CONFIG_HOME": filepath.Join(home, "config"), "XDG_STATE_HOME": filepath.Join(home, "state")}}
var output bytes.Buffer
if err := runWithEnvironment([]string{"shell", "install"}, strings.NewReader(""), &output, environment, shell.OSFileSystem{}, "/test/proxyctl"); err != nil {
t.Fatal(err)
}
startup := filepath.Join(home, ".bashrc")
data, err := os.ReadFile(startup)
if err != nil {
t.Fatal(err)
}
if !strings.Contains(string(data), "command '/test/proxyctl'") || !strings.Contains(output.String(), "installed") {
t.Fatalf("install output/startup = %q / %q", output.String(), data)
}
output.Reset()
if err := runWithEnvironment([]string{"shell", "uninstall"}, strings.NewReader(""), &output, environment, shell.OSFileSystem{}, "/test/proxyctl"); err != nil {
t.Fatal(err)
}
data, err = os.ReadFile(startup)
if err != nil {
t.Fatal(err)
}
if strings.Contains(string(data), "proxyctl shell integration") || !strings.Contains(output.String(), "uninstalled") {
t.Fatalf("uninstall output/startup = %q / %q", output.String(), data)
}
}
func TestUnsupportedShellMaintenanceCommandExplainsAvailability(t *testing.T) {
home := t.TempDir()
environment := commandEnvironment{identity: profile.UserIdentity{Username: "tester", HomeDir: home, UID: os.Getuid(), GID: os.Getgid()}, env: map[string]string{"SHELL": "/bin/fish"}}
err := runWithEnvironment([]string{"shell", "install"}, strings.NewReader(""), &bytes.Buffer{}, environment, shell.OSFileSystem{}, "/test/proxyctl")
if err == nil || !strings.Contains(err.Error(), "Bash or Zsh") {
t.Fatalf("unsupported Shell error = %v", err)
}
}