package ssh import ( "errors" "reflect" "strings" "testing" "git.scuroneko.dev/ScuroNeko/est/internal/config" ) func TestPrepareArgsRemoteForwardUsesLoopbackDefaults(t *testing.T) { args, err := prepareArgs("/etc/ssh/est.conf", config.ProxyEntry{ Direction: config.LocalToRemote, Host: "vps", LocalPort: 22, RemotePort: 2222, }) if err != nil { t.Fatalf("prepareArgs() error = %v", err) } want := []string{ "-N", "-T", "-o", "ExitOnForwardFailure=yes", "-F", "/etc/ssh/est.conf", "-R", "127.0.0.1:2222:127.0.0.1:22", "vps", } if !reflect.DeepEqual(args, want) { t.Errorf("prepareArgs() = %#v, want %#v", args, want) } } func TestPrepareArgsLocalForwardWithIdentityFile(t *testing.T) { args, err := prepareArgs("/etc/ssh/est.conf", config.ProxyEntry{ Direction: config.RemoteToLocal, Host: "db-vps", LocalIP: "127.0.0.2", LocalPort: 5433, RemoteIP: "10.0.0.10", RemotePort: 5432, IdentityFile: "/keys/db-vps", }) if err != nil { t.Fatalf("prepareArgs() error = %v", err) } want := []string{ "-N", "-T", "-o", "ExitOnForwardFailure=yes", "-F", "/etc/ssh/est.conf", "-i", "/keys/db-vps", "-L", "127.0.0.2:5433:10.0.0.10:5432", "db-vps", } if !reflect.DeepEqual(args, want) { t.Errorf("prepareArgs() = %#v, want %#v", args, want) } } func TestPrepareArgsRejectsInvalidEntry(t *testing.T) { tests := []struct { name string entry config.ProxyEntry want error }{ {name: "missing host", entry: config.ProxyEntry{LocalPort: 1, RemotePort: 2}, want: ErrEmptyHost}, {name: "missing local port", entry: config.ProxyEntry{Host: "vps", RemotePort: 2}, want: ErrEmptyLocalPort}, {name: "missing remote port", entry: config.ProxyEntry{Host: "vps", LocalPort: 1}, want: ErrEmptyRemotePort}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { _, err := prepareArgs("/etc/ssh/est.conf", tt.entry) if !errors.Is(err, tt.want) { t.Errorf("prepareArgs() error = %v, want %v", err, tt.want) } }) } } func TestPrepareArgsRejectsUnknownDirection(t *testing.T) { _, err := prepareArgs("/etc/ssh/est.conf", config.ProxyEntry{ Direction: "unknown", Host: "vps", LocalPort: 1, RemotePort: 2, }) if err == nil || !strings.Contains(err.Error(), "invalid direction") { t.Fatalf("prepareArgs() error = %v, want invalid-direction error", err) } }