first commit
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
package prompts
|
||||
|
||||
// Tests for global prompt-template discovery (US-005, #336): BuildSlashRegistry
|
||||
// loads both the legacy ~/.pigo/commands and the pi-aligned ~/.pigo/prompts
|
||||
// (non-recursive, global tier), and a same-named template in prompts/ overrides
|
||||
// the one in commands/ (last-write-wins within the global tier).
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/smallnest/pigo/internal/cli"
|
||||
"github.com/smallnest/pigo/internal/cli/testutil"
|
||||
)
|
||||
|
||||
// TestBuildSlashRegistryLoadsLegacyCommandsDir verifies the legacy
|
||||
// ~/.pigo/commands directory still loads templates (regression).
|
||||
func TestBuildSlashRegistryLoadsLegacyCommandsDir(t *testing.T) {
|
||||
home := t.TempDir()
|
||||
t.Setenv("PIGO_HOME", home)
|
||||
testutil.WritePrompt(t, home, "commands", "legacy.md", "Legacy: $ARGUMENTS")
|
||||
|
||||
reg, err := BuildSlashRegistry(&cli.LiveConfig{Model: "test", ProviderName: "test"}, nil, nil, PromptTemplateSources{})
|
||||
if err != nil {
|
||||
t.Fatalf("BuildSlashRegistry: %v", err)
|
||||
}
|
||||
out, err := reg.ResolveOutcome("/legacy hi")
|
||||
if err != nil {
|
||||
t.Fatalf("ResolveOutcome: %v", err)
|
||||
}
|
||||
if !out.Handled || out.Prompt != "Legacy: hi" {
|
||||
t.Errorf("/legacy = handled=%v prompt=%q, want handled=true \"Legacy: hi\"", out.Handled, out.Prompt)
|
||||
}
|
||||
}
|
||||
|
||||
// TestBuildSlashRegistryLoadsPromptsDir verifies the pi-aligned ~/.pigo/prompts
|
||||
// directory loads templates.
|
||||
func TestBuildSlashRegistryLoadsPromptsDir(t *testing.T) {
|
||||
home := t.TempDir()
|
||||
t.Setenv("PIGO_HOME", home)
|
||||
testutil.WritePrompt(t, home, "prompts", "review.md", "Review: $ARGUMENTS")
|
||||
|
||||
reg, err := BuildSlashRegistry(&cli.LiveConfig{Model: "test", ProviderName: "test"}, nil, nil, PromptTemplateSources{})
|
||||
if err != nil {
|
||||
t.Fatalf("BuildSlashRegistry: %v", err)
|
||||
}
|
||||
out, err := reg.ResolveOutcome("/review diff")
|
||||
if err != nil {
|
||||
t.Fatalf("ResolveOutcome: %v", err)
|
||||
}
|
||||
if !out.Handled || out.Prompt != "Review: diff" {
|
||||
t.Errorf("/review = handled=%v prompt=%q, want handled=true \"Review: diff\"", out.Handled, out.Prompt)
|
||||
}
|
||||
}
|
||||
|
||||
// TestBuildSlashRegistryPromptsOverridesCommands verifies that a same-named
|
||||
// template in prompts/ overrides one in commands/ (both global tier; prompts is
|
||||
// loaded second so last-write-wins), with no shadow entry.
|
||||
func TestBuildSlashRegistryPromptsOverridesCommands(t *testing.T) {
|
||||
home := t.TempDir()
|
||||
t.Setenv("PIGO_HOME", home)
|
||||
testutil.WritePrompt(t, home, "commands", "dup.md", "FROM COMMANDS")
|
||||
testutil.WritePrompt(t, home, "prompts", "dup.md", "FROM PROMPTS")
|
||||
|
||||
reg, err := BuildSlashRegistry(&cli.LiveConfig{Model: "test", ProviderName: "test"}, nil, nil, PromptTemplateSources{})
|
||||
if err != nil {
|
||||
t.Fatalf("BuildSlashRegistry: %v", err)
|
||||
}
|
||||
cmd, ok := reg.Lookup("dup")
|
||||
if !ok {
|
||||
t.Fatal("/dup not found")
|
||||
}
|
||||
if got := cmd.Expand(""); got != "FROM PROMPTS" {
|
||||
t.Errorf("prompts should override commands on same name, got %q", got)
|
||||
}
|
||||
if len(reg.Shadowed()) != 0 {
|
||||
t.Errorf("same-tier override must not shadow, got %v", reg.Shadowed())
|
||||
}
|
||||
}
|
||||
|
||||
// TestBuildSlashRegistryMissingDirsNoError verifies that with neither commands/
|
||||
// nor prompts/ present, BuildSlashRegistry returns no error (built-ins only).
|
||||
func TestBuildSlashRegistryMissingDirsNoError(t *testing.T) {
|
||||
t.Setenv("PIGO_HOME", t.TempDir())
|
||||
reg, err := BuildSlashRegistry(&cli.LiveConfig{Model: "test", ProviderName: "test"}, nil, nil, PromptTemplateSources{})
|
||||
if err != nil {
|
||||
t.Fatalf("BuildSlashRegistry with no prompt dirs: %v", err)
|
||||
}
|
||||
if reg == nil {
|
||||
t.Fatal("registry is nil")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user