89 lines
2.6 KiB
Go
89 lines
2.6 KiB
Go
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)
|
|
})
|
|
}
|
|
}
|