skills_test.go

 1package model
 2
 3import (
 4	"testing"
 5
 6	"github.com/charmbracelet/crush/internal/skills"
 7	"github.com/charmbracelet/crush/internal/ui/common"
 8	uistyles "github.com/charmbracelet/crush/internal/ui/styles"
 9	"github.com/stretchr/testify/require"
10)
11
12// TestSkillStatusItemsIncludesBuiltinSkills verifies sidebar skills include
13// both runtime-discovered skill states and builtin skills that may not have
14// emitted a SkillState event yet.
15func TestSkillStatusItemsIncludesBuiltinSkills(t *testing.T) {
16	t.Parallel()
17
18	st := uistyles.DefaultStyles()
19	ui := &UI{
20		com: &common.Common{Styles: &st},
21		skillStates: []*skills.SkillState{
22			{Name: "go-doc", Path: "/tmp/go-doc/SKILL.md", State: skills.StateNormal},
23		},
24	}
25
26	items := ui.skillStatusItems()
27	require.NotEmpty(t, items)
28
29	var hasGoDoc bool
30	for _, item := range items {
31		if item.title == st.ResourceName.Render("go-doc") {
32			hasGoDoc = true
33			break
34		}
35	}
36	require.True(t, hasGoDoc)
37
38	builtinSkills := skills.DiscoverBuiltin()
39	require.NotEmpty(t, builtinSkills)
40
41	var hasBuiltin bool
42	for _, skill := range builtinSkills {
43		if skill.Name == "go-doc" {
44			continue
45		}
46		expected := st.ResourceName.Render(skill.Name)
47		for _, item := range items {
48			if item.title == expected {
49				hasBuiltin = true
50				break
51			}
52		}
53		if hasBuiltin {
54			break
55		}
56	}
57	require.True(t, hasBuiltin)
58}