1package model
2
3import (
4 "testing"
5
6 "github.com/charmbracelet/crush/internal/config"
7 "github.com/charmbracelet/crush/internal/skills"
8 "github.com/charmbracelet/crush/internal/ui/common"
9 uistyles "github.com/charmbracelet/crush/internal/ui/styles"
10 "github.com/stretchr/testify/require"
11)
12
13// TestSkillStatusItemsIncludesBuiltinSkills verifies sidebar skills include
14// both runtime-discovered skill states and builtin skills that may not have
15// emitted a SkillState event yet.
16func TestSkillStatusItemsIncludesBuiltinSkills(t *testing.T) {
17 t.Parallel()
18
19 st := uistyles.CharmtonePantera()
20 ui := &UI{
21 com: &common.Common{Styles: &st},
22 skillStates: []*skills.SkillState{
23 {Name: "go-doc", Path: "/tmp/go-doc/SKILL.md", State: skills.StateNormal},
24 },
25 }
26
27 items := ui.skillStatusItems()
28 require.NotEmpty(t, items)
29
30 var hasGoDoc bool
31 for _, item := range items {
32 if item.title == st.Resource.Name.Render("go-doc") {
33 hasGoDoc = true
34 break
35 }
36 }
37 require.True(t, hasGoDoc)
38
39 builtinSkills := skills.DiscoverBuiltin()
40 require.NotEmpty(t, builtinSkills)
41
42 var hasBuiltin bool
43 for _, skill := range builtinSkills {
44 if skill.Name == "go-doc" {
45 continue
46 }
47 expected := st.Resource.Name.Render(skill.Name)
48 for _, item := range items {
49 if item.title == expected {
50 hasBuiltin = true
51 break
52 }
53 }
54 if hasBuiltin {
55 break
56 }
57 }
58 require.True(t, hasBuiltin)
59}
60
61func TestSkillStatusItemsExcludesDisabledSkills(t *testing.T) {
62 t.Parallel()
63
64 st := uistyles.CharmtonePantera()
65 ui := &UI{
66 com: &common.Common{
67 Styles: &st,
68 Workspace: &testWorkspace{cfg: &config.Config{Options: &config.Options{DisabledSkills: []string{"go-doc", "crush-config"}}}},
69 },
70 skillStates: []*skills.SkillState{
71 {Name: "go-doc", Path: "/tmp/go-doc/SKILL.md", State: skills.StateNormal},
72 },
73 }
74
75 items := ui.skillStatusItems()
76
77 for _, item := range items {
78 require.NotEqual(t, "go-doc", item.name)
79 require.NotEqual(t, "crush-config", item.name)
80 }
81}