120 lines
3.1 KiB
Go
120 lines
3.1 KiB
Go
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)
|
|
})
|
|
}
|
|
}
|