feat(capability/skills): 可复用工作流技能(Skill 模型 + Store + YAML Loader + Runner 展开 + 注册)
This commit is contained in:
1 parent
d947ec41a9
commit
915aa8a100
10 files changed
+1235
No files matched your search
@@ -0,0 +1,115 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user