package github import ( "testing" "github.com/github/github-mcp-server/pkg/octicons" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) // TestAllToolsetIconsExist validates that every toolset with an Icon field // references an icon that actually exists in the embedded octicons. // This prevents broken icon references from being merged. func TestAllToolsetIconsExist(t *testing.T) { // Get all available toolsets from the inventory inv, err := NewInventory(stubTranslator).Build() require.NoError(t, err) toolsets := inv.AvailableToolsets() // Also test remote-only toolsets remoteToolsets := RemoteOnlyToolsets() // Combine both lists allToolsets := make([]struct { name string icon string }, 0) for _, ts := range toolsets { if ts.Icon != "" { allToolsets = append(allToolsets, struct { name string icon string }{name: string(ts.ID), icon: ts.Icon}) } } for _, ts := range remoteToolsets { if ts.Icon != "" { allToolsets = append(allToolsets, struct { name string icon string }{name: string(ts.ID), icon: ts.Icon}) } } require.NotEmpty(t, allToolsets, "expected at least one toolset with an icon") for _, ts := range allToolsets { t.Run(ts.name, func(t *testing.T) { // Check that icons return valid data URIs (not empty) icons := octicons.Icons(ts.icon) require.NotNil(t, icons, "toolset %s references icon %q which does not exist", ts.name, ts.icon) assert.Len(t, icons, 2, "expected light and dark icon variants for toolset %s", ts.name) // Verify both variants have valid data URIs for _, icon := range icons { assert.NotEmpty(t, icon.Source, "icon source should not be empty for toolset %s", ts.name) assert.Contains(t, icon.Source, "data:image/png;base64,", "icon %s for toolset %s should be a valid data URI", ts.icon, ts.name) } }) } } // TestToolsetMetadataHasIcons ensures all toolsets have icons defined. // This is a policy test - if you want to allow toolsets without icons, // you can remove or modify this test. func TestToolsetMetadataHasIcons(t *testing.T) { // These toolsets are expected to NOT have icons (internal/special purpose) exceptionsWithoutIcons := map[string]bool{ "all": true, // Meta-toolset "default": true, // Meta-toolset } inv, err := NewInventory(stubTranslator).Build() require.NoError(t, err) toolsets := inv.AvailableToolsets() for _, ts := range toolsets { if exceptionsWithoutIcons[string(ts.ID)] { continue } t.Run(string(ts.ID), func(t *testing.T) { assert.NotEmpty(t, ts.Icon, "toolset %s should have an icon defined", ts.ID) }) } }