Files
kandev/apps/backend/internal/agentctl/server/acp/client_test.go
T
2026-02-20 17:30:14 +00:00

83 lines
1.9 KiB
Go

package acp
import (
"path/filepath"
"testing"
)
func TestResolvePath(t *testing.T) {
client := NewClient(WithWorkspaceRoot("/workspace/project"))
tests := []struct {
name string
input string
expected string
expectErr bool
}{
{
name: "absolute path within workspace",
input: "/workspace/project/src/main.go",
expected: "/workspace/project/src/main.go",
},
{
name: "relative path resolves within workspace",
input: "src/main.go",
expected: filepath.Join("/workspace/project", "src/main.go"),
},
{
name: "workspace root itself is allowed",
input: "/workspace/project",
expected: "/workspace/project",
},
{
name: "dot path resolves to workspace root",
input: ".",
expected: "/workspace/project",
},
{
name: "path traversal with relative path is rejected",
input: "../../etc/passwd",
expectErr: true,
},
{
name: "path traversal with dot-dot in middle is rejected",
input: "src/../../etc/passwd",
expectErr: true,
},
{
name: "absolute path outside workspace is rejected",
input: "/etc/passwd",
expectErr: true,
},
{
name: "absolute path with parent traversal is rejected",
input: "/workspace/project/../../../etc/passwd",
expectErr: true,
},
{
name: "nested relative path within workspace",
input: "src/pkg/handler.go",
expected: filepath.Join("/workspace/project", "src/pkg/handler.go"),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := client.resolvePath(tt.input)
if tt.expectErr {
if err == nil {
t.Errorf("resolvePath(%q) expected error, got path %q", tt.input, got)
}
return
}
if err != nil {
t.Errorf("resolvePath(%q) unexpected error: %v", tt.input, err)
return
}
if got != tt.expected {
t.Errorf("resolvePath(%q) = %q, want %q", tt.input, got, tt.expected)
}
})
}
}