package handler
import (
"context"
"fmt"
"os"
"path/filepath"
"testing"
"github.com/mark3labs/mcp-go/mcp"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestReadfile_Valid(t *testing.T) {
// prepare temp directory
dir := t.TempDir()
content := "test-content"
err := os.WriteFile(filepath.Join(dir, "test"), []byte(content), 0644)
require.NoError(t, err)
handler, err := NewFilesystemHandler(resolveAllowedDirs(t, dir))
require.NoError(t, err)
request := mcp.CallToolRequest{}
request.Params.Name = "read_file"
request.Params.Arguments = map[string]any{
"path": filepath.Join(dir, "test"),
}
result, err := handler.HandleReadFile(context.Background(), request)
require.NoError(t, err)
assert.Len(t, result.Content, 1)
assert.Equal(t, content, result.Content[0].(mcp.TextContent).Text)
}
func TestReadfile_Invalid(t *testing.T) {
dir := t.TempDir()
handler, err := NewFilesystemHandler(resolveAllowedDirs(t, dir))
require.NoError(t, err)
request := mcp.CallToolRequest{}
request.Params.Name = "read_file"
request.Params.Arguments = map[string]any{
"path": filepath.Join(dir, "test"),
}
result, err := handler.HandleReadFile(context.Background(), request)
require.NoError(t, err)
assert.True(t, result.IsError)
assert.Contains(t, fmt.Sprint(result.Content[0]), "no such file or directory")
}
func TestReadfile_NoAccess(t *testing.T) {
dir1 := t.TempDir()
dir2 := t.TempDir()
handler, err := NewFilesystemHandler(resolveAllowedDirs(t, dir1))
require.NoError(t, err)
request := mcp.CallToolRequest{}
request.Params.Name = "read_file"
request.Params.Arguments = map[string]any{
"path": filepath.Join(dir2, "test"),
}
result, err := handler.HandleReadFile(context.Background(), request)
require.NoError(t, err)
assert.True(t, result.IsError)
assert.Contains(t, fmt.Sprint(result.Content[0]), "access denied - path outside allowed directories")
}