Files
ttstd-infinite-canvas/backend/internal/service/text_replay_test.go
dlh 35dee568c9 feat(create): 创作对话文本模式接入 text-replay 持久化与回放
把后端既有但未接线的 text-replay 能力在前端打通:前端直连模型生成正文时,
把生成过程/结果持久化到后端任务,支持刷新重放与任务中心可见。

后端(最小配套,text-replay 本为前端自管设计):
- 新增 TaskStatusTextReplay 任务状态:不排入 worker 队列、不计费、不执行,
  仅作为正文增量(text-deltas)的存储容器;
- CreateTask 识别 input.replay=true 的请求,走 createTextReplayTask 轻量创建;
- 新增 POST /tasks/:id/text-replay-complete: 写入最终正文、置为 succeeded、
  触发 text-deltas 归并,使 queryTaskTextReplay 能读到 finalText。

前端:
- 新增 creation-text-replay.ts 发布器: start 建任务、publish 节流上报增量、
  finish 存最终全文,失败静默降级不阻塞生成;
- create 文本模式生成时接入发布器,正文流不经展示改动、额外持久化到后端。

测试: 新增 isTextReplayTaskRequest 纯函数测(本地)、text-replay 闭环仓测
(建任务后写增量 -> complete -> succeeded + finalText,CI/cgo 验证)。
build/vet/tsc 全绿。
2026-08-19 22:04:41 +08:00

26 lines
878 B
Go

package service
import "testing"
func TestIsTextReplayTaskRequest(t *testing.T) {
cases := []struct {
name string
input map[string]any
want bool
}{
{"replay 布尔 true", map[string]any{"replay": true}, true},
{"replay 字符串 true", map[string]any{"replay": "true"}, true},
{"replay 字符串 True 大小写", map[string]any{"replay": "TRUE"}, true},
{"replay 布尔 false", map[string]any{"replay": false}, false},
{"无 replay 字段", map[string]any{"mode": "text"}, false},
{"replay 空字符串", map[string]any{"replay": ""}, false},
{"replay 数字", map[string]any{"replay": 1}, false},
{"replay nil", map[string]any{"replay": nil}, false},
}
for _, tc := range cases {
if got := isTextReplayTaskRequest(tc.input); got != tc.want {
t.Errorf("%s: isTextReplayTaskRequest(%v) = %v, want %v", tc.name, tc.input, got, tc.want)
}
}
}