package filetool import ( "context" "path/filepath" "strings" "testing" ) func TestReadDeniedOutsideAllowedDir(t *testing.T) { allowed := t.TempDir() tool := New([]string{allowed}, 4000, nil) _, err := tool.Call(context.Background(), "read ../outside.txt") if err == nil { t.Fatal("expected path denied error") } } func TestWriteAndReadInsideAllowedDir(t *testing.T) { allowed := t.TempDir() tool := New([]string{allowed}, 4000, nil) path := filepath.Join(allowed, "a.txt") _, err := tool.Call(context.Background(), "write "+path+"\nhello") if err != nil { t.Fatalf("write error: %v", err) } out, err := tool.Call(context.Background(), "read "+path) if err != nil { t.Fatalf("read error: %v", err) } if out != "hello" { t.Fatalf("unexpected read output: %q", out) } } func TestReadDirectoryReturnsStructuredError(t *testing.T) { allowed := t.TempDir() tool := New([]string{allowed}, 4000, nil) _, err := tool.Call(context.Background(), "read "+allowed) if err == nil { t.Fatal("expected directory read error") } if !strings.Contains(err.Error(), "PATH_IS_DIRECTORY") { t.Fatalf("expected PATH_IS_DIRECTORY, got: %v", err) } } func TestListDirectory(t *testing.T) { allowed := t.TempDir() tool := New([]string{allowed}, 4000, nil) path := filepath.Join(allowed, "x.txt") _, err := tool.Call(context.Background(), "write "+path+"\nhello") if err != nil { t.Fatalf("write error: %v", err) } out, err := tool.Call(context.Background(), "list "+allowed) if err != nil { t.Fatalf("list error: %v", err) } if !strings.Contains(out, "x.txt") { t.Fatalf("expected x.txt in list output, got: %q", out) } }