chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
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)
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user