tracker_test.go

  1package skills
  2
  3import (
  4	"testing"
  5
  6	"github.com/stretchr/testify/require"
  7)
  8
  9func TestTracker_MarkLoadedAndIsLoaded(t *testing.T) {
 10	t.Parallel()
 11
 12	activeSkills := []*Skill{
 13		{Name: "go-doc"},
 14		{Name: "bash"},
 15	}
 16	tracker := NewTracker(activeSkills)
 17
 18	// Initially not loaded.
 19	require.False(t, tracker.IsLoaded("go-doc"))
 20	require.False(t, tracker.IsLoaded("bash"))
 21
 22	// Mark as loaded.
 23	tracker.MarkLoaded("go-doc")
 24	require.True(t, tracker.IsLoaded("go-doc"))
 25	require.False(t, tracker.IsLoaded("bash"))
 26
 27	// Mark another.
 28	tracker.MarkLoaded("bash")
 29	require.True(t, tracker.IsLoaded("go-doc"))
 30	require.True(t, tracker.IsLoaded("bash"))
 31}
 32
 33func TestTracker_NonActiveSkillCannotBeMarkedLoaded(t *testing.T) {
 34	t.Parallel()
 35
 36	activeSkills := []*Skill{
 37		{Name: "go-doc"},
 38	}
 39	tracker := NewTracker(activeSkills)
 40
 41	// Cannot mark non-active skill as loaded.
 42	tracker.MarkLoaded("bash")
 43	require.False(t, tracker.IsLoaded("bash"))
 44
 45	// Can mark active skill as loaded.
 46	tracker.MarkLoaded("go-doc")
 47	require.True(t, tracker.IsLoaded("go-doc"))
 48}
 49
 50func TestTracker_NilSafety(t *testing.T) {
 51	t.Parallel()
 52
 53	var tracker *Tracker
 54
 55	// Should not panic.
 56	tracker.MarkLoaded("go-doc")
 57	require.False(t, tracker.IsLoaded("go-doc"))
 58}
 59
 60func TestTracker_BuiltinSkillTracking(t *testing.T) {
 61	t.Parallel()
 62
 63	// Simulate active skills including a builtin skill (crush-config).
 64	activeSkills := []*Skill{
 65		{Name: "crush-config", Description: "Crush config", Builtin: true},
 66		{Name: "go-doc", Description: "Go docs", Builtin: false},
 67	}
 68	tracker := NewTracker(activeSkills)
 69
 70	// Initially not loaded.
 71	require.False(t, tracker.IsLoaded("crush-config"))
 72	require.False(t, tracker.IsLoaded("go-doc"))
 73
 74	// Mark builtin skill as loaded (simulating read via crush://...).
 75	tracker.MarkLoaded("crush-config")
 76	require.True(t, tracker.IsLoaded("crush-config"))
 77
 78	// Mark user skill as loaded.
 79	tracker.MarkLoaded("go-doc")
 80	require.True(t, tracker.IsLoaded("go-doc"))
 81}
 82
 83func TestTracker_OverriddenBuiltinNotTracked(t *testing.T) {
 84	t.Parallel()
 85
 86	// Simulate scenario where builtin "bash" is overridden by user "bash".
 87	// After dedup, only user "bash" is active.
 88	activeSkills := []*Skill{
 89		{Name: "bash", Description: "User bash override", Builtin: false},
 90	}
 91	tracker := NewTracker(activeSkills)
 92
 93	// Trying to mark the builtin "bash" as loaded should not work
 94	// because the active skill is the user override.
 95	tracker.MarkLoaded("bash")
 96	require.True(t, tracker.IsLoaded("bash"))
 97
 98	// But if we somehow tried to mark a different builtin that's not active,
 99	// it wouldn't get marked.
100	tracker.MarkLoaded("nonexistent-builtin")
101	require.False(t, tracker.IsLoaded("nonexistent-builtin"))
102}