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)) }) }