package octicons import ( "strings" "testing" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/stretchr/testify/assert" ) func TestDataURI(t *testing.T) { tests := []struct { name string icon string theme Theme wantDataURI bool wantEmpty bool }{ { name: "light theme icon returns data URI", icon: "repo", theme: ThemeLight, wantDataURI: true, wantEmpty: false, }, { name: "dark theme icon returns data URI", icon: "repo", theme: ThemeDark, wantDataURI: true, wantEmpty: false, }, { name: "non-embedded icon returns empty string", icon: "nonexistent-icon", theme: ThemeLight, wantDataURI: false, wantEmpty: true, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { result := DataURI(tc.icon, tc.theme) if tc.wantDataURI { assert.True(t, strings.HasPrefix(result, "data:image/png;base64,"), "expected data URI prefix") assert.NotContains(t, result, "https://") } if tc.wantEmpty { assert.Empty(t, result, "expected empty string for non-embedded icon") } }) } } func TestIcons(t *testing.T) { tests := []struct { name string icon string wantNil bool wantCount int }{ { name: "valid embedded icon returns light and dark variants", icon: "repo", wantNil: false, wantCount: 2, }, { name: "empty name returns nil", icon: "", wantNil: true, wantCount: 0, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { result := Icons(tc.icon) if tc.wantNil { assert.Nil(t, result) return } assert.NotNil(t, result) assert.Len(t, result, tc.wantCount) // Verify first icon is light theme assert.Equal(t, DataURI(tc.icon, ThemeLight), result[0].Source) assert.Equal(t, "image/png", result[0].MIMEType) assert.Empty(t, result[0].Sizes) // Sizes field omitted for backward compatibility assert.Equal(t, mcp.IconThemeLight, result[0].Theme) // Verify second icon is dark theme assert.Equal(t, DataURI(tc.icon, ThemeDark), result[1].Source) assert.Equal(t, "image/png", result[1].MIMEType) assert.Empty(t, result[1].Sizes) // Sizes field omitted for backward compatibility assert.Equal(t, mcp.IconThemeDark, result[1].Theme) }) } } func TestThemeConstants(t *testing.T) { assert.Equal(t, Theme("light"), ThemeLight) assert.Equal(t, Theme("dark"), ThemeDark) } func TestEmbeddedIconsExist(t *testing.T) { // Test that all required icons from required_icons.txt are properly embedded // This is the single source of truth for which icons should be available expectedIcons := RequiredIcons() for _, icon := range expectedIcons { t.Run(icon, func(t *testing.T) { lightURI := DataURI(icon, ThemeLight) darkURI := DataURI(icon, ThemeDark) assert.True(t, strings.HasPrefix(lightURI, "data:image/png;base64,"), "light theme icon %s should be embedded", icon) assert.True(t, strings.HasPrefix(darkURI, "data:image/png;base64,"), "dark theme icon %s should be embedded", icon) }) } }