Files
Cyrene_v2/internal/capability/skills/runner_test.go
T

116 lines
3.6 KiB
Go

package skills
import (
"context"
"errors"
"testing"
"git.yeij.top/AskaEth/Cyrene_v2/internal/capability/registry"
)
func TestRunner_Expand_正常(t *testing.T) {
t.Parallel()
r := NewRunner(registry.New(), testLogger())
wf, err := r.Expand(context.Background(), makeSkill(t, "review"))
if err != nil {
t.Fatalf("Expand: %v", err)
}
if wf.Name != "review" {
t.Fatalf("Name = %q, want review", wf.Name)
}
if wf.Description != "desc review" {
t.Fatalf("Description = %q, want desc review", wf.Description)
}
if wf.Prompt != "prompt review" {
t.Fatalf("Prompt = %q, want prompt review", wf.Prompt)
}
if len(wf.Steps) != 1 || wf.Steps[0].Name != "s1" {
t.Fatalf("Steps = %+v, want one step s1", wf.Steps)
}
if len(wf.Refs) != 1 || wf.Refs[0].Name != "r1" {
t.Fatalf("Refs = %+v, want one ref r1", wf.Refs)
}
if len(wf.Guardrails) != 1 || wf.Guardrails[0].ID != "g1" {
t.Fatalf("Guardrails = %+v, want one guardrail g1", wf.Guardrails)
}
}
func TestRunner_Expand_Nil_异常(t *testing.T) {
t.Parallel()
r := NewRunner(registry.New(), testLogger())
if _, err := r.Expand(context.Background(), nil); !errors.Is(err, ErrInvalidSkill) {
t.Fatalf("Expand(nil) err = %v, want ErrInvalidSkill", err)
}
}
func TestRunner_Expand_BlankName_异常(t *testing.T) {
t.Parallel()
r := NewRunner(registry.New(), testLogger())
if _, err := r.Expand(context.Background(), mockSkill{name: " "}); !errors.Is(err, ErrInvalidSkill) {
t.Fatalf("Expand(blank) err = %v, want ErrInvalidSkill", err)
}
}
func TestRunner_Expand_ContextCanceled_异常(t *testing.T) {
t.Parallel()
r := NewRunner(registry.New(), testLogger())
ctx, cancel := context.WithCancel(context.Background())
cancel()
if _, err := r.Expand(ctx, makeSkill(t, "review")); !errors.Is(err, context.Canceled) {
t.Fatalf("Expand(canceled) err = %v, want context.Canceled", err)
}
}
func TestRunner_ExpandByName_正常(t *testing.T) {
t.Parallel()
reg := registry.New()
if err := Register(reg, makeSkill(t, "review")); err != nil {
t.Fatalf("Register: %v", err)
}
r := NewRunner(reg, testLogger())
wf, err := r.ExpandByName(context.Background(), "review")
if err != nil {
t.Fatalf("ExpandByName: %v", err)
}
if wf.Name != "review" || len(wf.Steps) != 1 {
t.Fatalf("Workflow = %+v, want review with one step", wf)
}
}
func TestRunner_ExpandByName_NotSkill_异常(t *testing.T) {
t.Parallel()
reg := registry.New()
// Register a capability whose Value is not a Skill (rendered via the raw API).
if err := reg.Register(registry.Capability{Name: "notaskill", Kind: registry.KindTool, Value: "x"}); err != nil {
t.Fatalf("register tool-cap: %v", err)
}
r := NewRunner(reg, testLogger())
if _, err := r.ExpandByName(context.Background(), "notaskill"); !errors.Is(err, ErrNotFound) {
t.Fatalf("ExpandByName(non-skill) err = %v, want ErrNotFound", err)
}
}
func TestRunner_ExpandByName_NotFound_异常(t *testing.T) {
t.Parallel()
r := NewRunner(registry.New(), testLogger())
if _, err := r.ExpandByName(context.Background(), "missing"); !errors.Is(err, registry.ErrNotFound) {
t.Fatalf("ExpandByName(missing) err = %v, want registry.ErrNotFound", err)
}
}
func TestRunner_ExpandByName_NilRegistrar_异常(t *testing.T) {
t.Parallel()
r := NewRunner(nil, testLogger())
if _, err := r.ExpandByName(context.Background(), "x"); !errors.Is(err, ErrNilRegistrar) {
t.Fatalf("ExpandByName(nil reg) err = %v, want ErrNilRegistrar", err)
}
}
func TestRunner_Run_Placeholder_异常(t *testing.T) {
t.Parallel()
r := NewRunner(registry.New(), testLogger())
if _, err := r.Run(context.Background(), "review", nil); !errors.Is(err, ErrRunPending) {
t.Fatalf("Run err = %v, want ErrRunPending", err)
}
}