Files
iris-context/root/suggestions_test.go
T
VERSE 6ffb9f83f2 feat(scoring): transition workflow learning and fix history UX (#39)
- add transition scoring engine to learn sequential workflows per
directory using command skeletons
- prioritize current active git branch over older branches in
suggestions
- restore strict chronological order for history navigation and bypass
AI re-ranking
- add in-memory session history for instant access to just-run commands
- fix PTY prompt not syncing when using arrow keys in the history menu
- fix history tie-breaker to properly prioritize newer commands by
assigning larger IDs
- fix potential mutex deadlock between bufferMu and pty write during
history navigation
- fix workspace git detection to remove depth limits and correctly
identify repositories with detached HEADs
- fix SQLite connection leaks in frecency queries
- fix global state leaks in history tests by snapshotting and restoring
registry states
- modernize string prefix checks using strings.CutPrefix
2026-07-26 19:10:56 +07:00

81 lines
2.0 KiB
Go

package root
import (
"testing"
"github.com/versenilvis/iris/spec"
)
func TestMergeResults(t *testing.T) {
t.Run("Dedup exact match", func(t *testing.T) {
// Mock history items that might conflict with specs
res := MergeResults("git", "spec")
seen := make(map[string]bool)
for _, r := range res {
if seen[r.Cmd] {
t.Errorf("Duplicate suggestion found: %q", r.Cmd)
}
seen[r.Cmd] = true
}
})
t.Run("Limit 100", func(t *testing.T) {
res := MergeResults("a", "history")
if len(res) > 100 {
t.Errorf("Expected max 100 suggestions, got %d", len(res))
}
})
t.Run("AI Suggestion Promotion", func(t *testing.T) {
aiSugg := &spec.Suggestion{
Cmd: "git commit -m \"fix(auth): login bug\"",
Desc: "AI suggestion",
Source: "ai",
Confidence: 85,
}
SetCurrentAISuggestion(aiSugg)
defer SetCurrentAISuggestion(nil)
res := MergeResults("git c", "history")
if len(res) == 0 {
t.Fatalf("Expected suggestions, got 0")
}
if res[0].Cmd != aiSugg.Cmd {
t.Errorf("Expected AI suggestion at index 0, got %q (confidence %d)", res[0].Cmd, res[0].Confidence)
}
if res[0].Source != "ai" {
t.Errorf("Expected promoted source 'ai', got %q", res[0].Source)
}
})
}
func TestPrevRecordedCommandState(t *testing.T) {
origRegistry := spec.Registry
t.Cleanup(func() {
spec.Registry = origRegistry
})
spec.ResetRegistry()
spec.Register(&spec.Spec{
Name: "git",
Subcommands: []spec.Subcommand{
{Name: "checkout"},
},
})
setPrevRecordedInfo("git checkout feature-abc", "/repo/dir")
skel, cwd := getPrevRecordedInfo()
if skel != "git checkout" || cwd != "/repo/dir" {
t.Errorf("expected skel='git checkout' and cwd='/repo/dir', got skel=%q, cwd=%q", skel, cwd)
}
if gotSkel := getPrevSkeleton(); gotSkel != "git checkout" {
t.Errorf("expected getPrevSkeleton()='git checkout', got %q", gotSkel)
}
setPrevRecordedInfo("", "")
if gotSkel := getPrevSkeleton(); gotSkel != "" {
t.Errorf("expected empty getPrevSkeleton() after reset, got %q", gotSkel)
}
}