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}