51 lines
1.8 KiB
Go
51 lines
1.8 KiB
Go
package app
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"testing"
|
|
"time"
|
|
|
|
"yingce/backend/internal/model"
|
|
"yingce/backend/internal/repository"
|
|
)
|
|
|
|
// 停机时审批后的媒体等待会被取消。此时不能继续回写结果、也不能恢复运行时:
|
|
// 否则正在排空的进程会拉起新的 Agent 步骤,并把仍在生成的媒体任务当作失败处理。
|
|
// MediaTaskID 必须原样保留,让下次启动的 recoverCloudAgentPiRunners 重新挂上等待。
|
|
func TestFinishApprovedCloudAgentMediaStopsWhenWaitIsCancelled(t *testing.T) {
|
|
s, db, a := agentMediaFixture(t)
|
|
s.disablePiRuntime = true
|
|
run, state := agentMediaRun(t, s, a, "request_approval", "approved-media-cancel")
|
|
task := &model.Task{ID: "approved-media-task", UserID: "user", ProjectID: "agent-canvas", Type: "canvas_video",
|
|
Status: model.TaskStatusRunning, CreatedAt: time.Now(), UpdatedAt: time.Now()}
|
|
if err := db.Create(task).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
state.MediaTaskID = task.ID
|
|
state.TaskIDs = append(state.TaskIDs, task.ID)
|
|
if err := s.repo.MutateCloudAgent("user", run.ID, run.Revision, func(current *model.CloudAgentExecution, _ *repository.Repository) error {
|
|
return cloudAgentSave(current, &state)
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
cancel()
|
|
err := s.finishApprovedCloudAgentMedia(ctx, "user", run.ID, task.ID)
|
|
if !errors.Is(err, context.Canceled) {
|
|
t.Fatalf("finishApprovedCloudAgentMedia() error = %v, want context.Canceled", err)
|
|
}
|
|
latest, err := s.repo.CloudAgent("user", run.ID)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
decoded, err := cloudAgentDecode(latest)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if decoded.MediaTaskID != task.ID || decoded.PiResumePrompt != "" {
|
|
t.Fatalf("cancelled wait mutated run state: mediaTask=%q resumePrompt=%q", decoded.MediaTaskID, decoded.PiResumePrompt)
|
|
}
|
|
}
|