88 lines
2.6 KiB
Go
88 lines
2.6 KiB
Go
package github
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
ghcontext "github.com/github/github-mcp-server/pkg/context"
|
|
"github.com/modelcontextprotocol/go-sdk/mcp"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func createMCPRequestWithCapabilities(t *testing.T, caps *mcp.ClientCapabilities) mcp.CallToolRequest {
|
|
t.Helper()
|
|
srv := mcp.NewServer(&mcp.Implementation{Name: "test"}, nil)
|
|
st, _ := mcp.NewInMemoryTransports()
|
|
session, err := srv.Connect(context.Background(), st, &mcp.ServerSessionOptions{
|
|
State: &mcp.ServerSessionState{
|
|
InitializeParams: &mcp.InitializeParams{
|
|
ClientInfo: &mcp.Implementation{Name: "test-client"},
|
|
Capabilities: caps,
|
|
},
|
|
},
|
|
})
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() { _ = session.Close() })
|
|
return mcp.CallToolRequest{Session: session}
|
|
}
|
|
|
|
func Test_clientSupportsUI(t *testing.T) {
|
|
t.Parallel()
|
|
ctx := context.Background()
|
|
|
|
t.Run("client with UI extension", func(t *testing.T) {
|
|
caps := &mcp.ClientCapabilities{}
|
|
caps.AddExtension("io.modelcontextprotocol/ui", map[string]any{
|
|
"mimeTypes": []string{"text/html;profile=mcp-app"},
|
|
})
|
|
req := createMCPRequestWithCapabilities(t, caps)
|
|
assert.True(t, clientSupportsUI(ctx, &req))
|
|
})
|
|
|
|
t.Run("client without UI extension", func(t *testing.T) {
|
|
req := createMCPRequestWithCapabilities(t, &mcp.ClientCapabilities{})
|
|
assert.False(t, clientSupportsUI(ctx, &req))
|
|
})
|
|
|
|
t.Run("client with nil capabilities", func(t *testing.T) {
|
|
req := createMCPRequestWithCapabilities(t, nil)
|
|
assert.False(t, clientSupportsUI(ctx, &req))
|
|
})
|
|
|
|
t.Run("nil request", func(t *testing.T) {
|
|
assert.False(t, clientSupportsUI(ctx, nil))
|
|
})
|
|
|
|
t.Run("nil session", func(t *testing.T) {
|
|
req := createMCPRequest(nil)
|
|
assert.False(t, clientSupportsUI(ctx, &req))
|
|
})
|
|
}
|
|
|
|
func Test_clientSupportsUI_fromContext(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
t.Run("UI supported in context", func(t *testing.T) {
|
|
ctx := ghcontext.WithUISupport(context.Background(), true)
|
|
assert.True(t, clientSupportsUI(ctx, nil))
|
|
})
|
|
|
|
t.Run("UI not supported in context", func(t *testing.T) {
|
|
ctx := ghcontext.WithUISupport(context.Background(), false)
|
|
assert.False(t, clientSupportsUI(ctx, nil))
|
|
})
|
|
|
|
t.Run("context takes precedence over session", func(t *testing.T) {
|
|
ctx := ghcontext.WithUISupport(context.Background(), false)
|
|
caps := &mcp.ClientCapabilities{}
|
|
caps.AddExtension("io.modelcontextprotocol/ui", map[string]any{})
|
|
req := createMCPRequestWithCapabilities(t, caps)
|
|
assert.False(t, clientSupportsUI(ctx, &req))
|
|
})
|
|
|
|
t.Run("no context or session", func(t *testing.T) {
|
|
assert.False(t, clientSupportsUI(context.Background(), nil))
|
|
})
|
|
}
|