skills_test.go

 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}