116 lines
3.6 KiB
Go
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)
|
|
}
|
|
}
|