91 lines
2.5 KiB
Go
91 lines
2.5 KiB
Go
package prompt
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"gitea.maximumdirect.net/eric/scriptorium/internal/domain"
|
|
)
|
|
|
|
func TestGoRenderer_Render(t *testing.T) {
|
|
renderer := NewGoRenderer()
|
|
ctx := context.Background()
|
|
|
|
profile := &domain.PromptProfile{
|
|
ID: "test-profile",
|
|
ExpectedInputs: []string{"transcript"},
|
|
Templates: []domain.PromptMessageTemplate{
|
|
{Role: "system", Content: "You are a {{.role}}."},
|
|
{Role: "user", Content: "Analyze this: {{input \"transcript\"}}"},
|
|
},
|
|
}
|
|
|
|
inputs := map[string]*domain.Artifact{
|
|
"transcript": {Body: []byte("The quick brown fox.")},
|
|
}
|
|
|
|
vars := map[string]string{
|
|
"role": "helpful assistant",
|
|
}
|
|
|
|
t.Run("successful render", func(t *testing.T) {
|
|
res, err := renderer.Render(ctx, profile, inputs, vars)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if len(res.Messages) != 2 {
|
|
t.Errorf("expected 2 messages, got %d", len(res.Messages))
|
|
}
|
|
if res.Messages[0].Content != "You are a helpful assistant." {
|
|
t.Errorf("unexpected system message: %s", res.Messages[0].Content)
|
|
}
|
|
if res.Messages[1].Content != "Analyze this: The quick brown fox." {
|
|
t.Errorf("unexpected user message: %s", res.Messages[1].Content)
|
|
}
|
|
})
|
|
|
|
t.Run("missing required input", func(t *testing.T) {
|
|
emptyInputs := map[string]*domain.Artifact{}
|
|
_, err := renderer.Render(ctx, profile, emptyInputs, vars)
|
|
if err == nil || (err != ErrMissingRequiredInput && err.Error() != "missing required input artifact: transcript") {
|
|
t.Errorf("expected ErrMissingRequiredInput, got %v", err)
|
|
}
|
|
})
|
|
|
|
t.Run("unknown input in template", func(t *testing.T) {
|
|
profileUnknown := &domain.PromptProfile{
|
|
Templates: []domain.PromptMessageTemplate{
|
|
{Role: "user", Content: "Hello {{input \"ghost\"}}"},
|
|
},
|
|
}
|
|
_, err := renderer.Render(ctx, profileUnknown, inputs, vars)
|
|
if err == nil {
|
|
t.Error("expected error for unknown input")
|
|
}
|
|
})
|
|
|
|
t.Run("invalid template syntax", func(t *testing.T) {
|
|
profileInvalid := &domain.PromptProfile{
|
|
Templates: []domain.PromptMessageTemplate{
|
|
{Role: "user", Content: "Hello {{.unclosed"},
|
|
},
|
|
}
|
|
_, err := renderer.Render(ctx, profileInvalid, inputs, vars)
|
|
if err == nil {
|
|
t.Error("expected error for invalid template syntax")
|
|
}
|
|
})
|
|
|
|
t.Run("empty message role", func(t *testing.T) {
|
|
profileNoRole := &domain.PromptProfile{
|
|
Templates: []domain.PromptMessageTemplate{
|
|
{Role: "", Content: "Hello"},
|
|
},
|
|
}
|
|
_, err := renderer.Render(ctx, profileNoRole, inputs, vars)
|
|
if err == nil {
|
|
t.Error("expected error for empty message role")
|
|
}
|
|
})
|
|
}
|