refactor(*): 平台架构 - 拆分后端领域模块并同步插件协议与模型能力
This commit is contained in:
92
backend/internal/protocol/expression_test.go
Normal file
92
backend/internal/protocol/expression_test.go
Normal file
@@ -0,0 +1,92 @@
|
||||
package protocol
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/base64"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestEvaluateManifestSplitToFloatDivide(t *testing.T) {
|
||||
env := map[string]any{"request": map[string]any{"aspectRatio": "1280x720"}}
|
||||
parts, err := evaluateManifestValue(map[string]any{"$split": []any{map[string]any{"$ref": "request.aspectRatio"}, "x"}}, env)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
items, ok := parts.([]any)
|
||||
if !ok || len(items) != 2 || items[0] != "1280" || items[1] != "720" {
|
||||
t.Fatalf("split = %#v", parts)
|
||||
}
|
||||
width, err := evaluateManifestValue(map[string]any{"$toFloat": map[string]any{"$at": []any{parts, 0}}}, env)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
height, err := evaluateManifestValue(map[string]any{"$toFloat": map[string]any{"$at": []any{parts, 1}}}, env)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
ratio, err := evaluateManifestValue(map[string]any{"$divide": []any{width, height}}, env)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if got := manifestFloat(ratio); got < 1.77 || got > 1.78 {
|
||||
t.Fatalf("ratio = %v", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEvaluateManifestDivideRejectsZero(t *testing.T) {
|
||||
_, err := evaluateManifestValue(map[string]any{"$divide": []any{10, 0}}, map[string]any{})
|
||||
if err == nil || !strings.Contains(err.Error(), "denominator") {
|
||||
t.Fatalf("error = %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEvaluateManifestToFloatLeavesInvalidInputEmpty(t *testing.T) {
|
||||
value, err := evaluateManifestValue(map[string]any{
|
||||
"$coalesce": []any{
|
||||
map[string]any{"$toFloat": "not-a-number"},
|
||||
1,
|
||||
},
|
||||
}, map[string]any{})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if got := manifestFloat(value); got != 1 {
|
||||
t.Fatalf("coalesced float = %v", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBinaryPayloadCreateResultAudio(t *testing.T) {
|
||||
manifest := []byte(`{
|
||||
"apiVersion":"yingce.plugin/v1",
|
||||
"id":"audio-bin","version":"1.0.0","name":"Audio Bin","author":"Test","documentation":"# Audio",
|
||||
"contributes":{"providers":[{
|
||||
"id":"openai-audio","label":"OpenAI Audio","capabilities":["audio"],"scopes":["canvas"],
|
||||
"create":{"method":"POST","path":"/v1/audio/speech","body":{"model":{"$ref":"request.model"},"input":{"$ref":"request.prompt"}}},
|
||||
"response":{"binaryPayload":true,"resultKind":"audio","status":"succeeded"}
|
||||
}]}
|
||||
}`)
|
||||
adapter, err := LoadManifest(manifest)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
payload := []byte("ID3fake-mp3-bytes")
|
||||
result, err := adapter.ParseCreate(context.Background(), payload)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if result.Status != StatusSucceeded || result.Result == nil || len(result.Result.Audios) != 1 {
|
||||
t.Fatalf("result = %#v", result)
|
||||
}
|
||||
audio := result.Result.Audios[0]
|
||||
if !strings.HasPrefix(audio.DataURL, "data:") || !strings.Contains(audio.DataURL, base64.StdEncoding.EncodeToString(payload)) {
|
||||
t.Fatalf("audio dataUrl = %q", audio.DataURL)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBinaryPayloadCreateResultRejectsEmpty(t *testing.T) {
|
||||
_, err := binaryPayloadCreateResult("audio", nil)
|
||||
if err == nil || !strings.Contains(err.Error(), "empty") {
|
||||
t.Fatalf("error = %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user