Files
ttstd-infinite-canvas/backend/internal/protocol/expression_test.go

93 lines
2.9 KiB
Go

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)
}
}