iop/apps/edge/internal/openai/single_request_chat_test.go
toki 39fa1da55b fix(benchmark): 원샷 비교 실행 실패를 해소한다
호출기별 격리 쓰기 계약과 Gemini ingress, 단일 요청 stage 처리를 맞춰 실제 9-cell 비교가 생성물을 남길 수 있게 한다.
2026-08-12 14:37:17 +09:00

96 lines
3.4 KiB
Go

package openai
import (
"context"
"errors"
"net/http/httptest"
"strings"
"testing"
edgeservice "iop/apps/edge/internal/service"
)
func TestSingleRequestChatStreamPumpProjectsOnlyFinalResult(t *testing.T) {
execution := startSingleRequestAnthropicTestExecution(t, func(
_ context.Context,
req edgeservice.SingleRequestRequest,
ctrl edgeservice.SingleRequestController,
) error {
for index, stage := range []edgeservice.SingleRequestState{
edgeservice.SingleRequestStatePlanning,
edgeservice.SingleRequestStateWorking,
edgeservice.SingleRequestStateReviewing,
edgeservice.SingleRequestStateFinalizing,
} {
envelope := edgeservice.SingleRequestEnvelope{
RequestID: req.RequestID, Sequence: uint64(index + 1), Stage: stage,
}
if stage == edgeservice.SingleRequestStateFinalizing {
envelope.Result = &edgeservice.SingleRequestResult{Output: "safe final"}
}
if err := ctrl.SubmitEnvelope(envelope); err != nil {
return err
}
}
return nil
})
w := httptest.NewRecorder()
stream, err := newSingleRequestChatStream(w, "req_chat", "virtual-model")
if err != nil {
t.Fatal(err)
}
ticker := newManualSingleRequestAnthropicTicker()
if err := pumpSingleRequestChatStream(context.Background(), execution, stream, func() singleRequestAnthropicTicker { return ticker }); err != nil {
t.Fatal(err)
}
body := w.Body.String()
if !strings.Contains(body, `"content":"safe final"`) || !strings.Contains(body, `"finish_reason":"stop"`) || strings.Count(body, "data: [DONE]") != 1 {
t.Fatalf("unexpected Chat stream: %s", body)
}
for _, private := range []string{"Planning the requested work", "Executing the requested work", "Reviewing the completed work"} {
if strings.Contains(body, private) {
t.Fatalf("internal progress leaked: %s", body)
}
}
}
func TestSingleRequestChatStreamSanitizesExecutorFailure(t *testing.T) {
execution := startSingleRequestAnthropicTestExecution(t, func(
_ context.Context,
req edgeservice.SingleRequestRequest,
ctrl edgeservice.SingleRequestController,
) error {
if err := ctrl.SubmitEnvelope(edgeservice.SingleRequestEnvelope{RequestID: req.RequestID, Sequence: 1, Stage: edgeservice.SingleRequestStatePlanning}); err != nil {
return err
}
return errors.New("PRIVATE_EXECUTOR_FAILURE")
})
w := httptest.NewRecorder()
stream, err := newSingleRequestChatStream(w, "req_chat_error", "virtual-model")
if err != nil {
t.Fatal(err)
}
ticker := newManualSingleRequestAnthropicTicker()
if err := pumpSingleRequestChatStream(context.Background(), execution, stream, func() singleRequestAnthropicTicker { return ticker }); err != nil {
t.Fatal(err)
}
body := w.Body.String()
if strings.Contains(body, "PRIVATE_EXECUTOR_FAILURE") || !strings.Contains(body, "single-request execution failed") || strings.Count(body, "data: [DONE]") != 1 {
t.Fatalf("unexpected sanitized Chat error: %s", body)
}
}
func TestMarkedSingleRequestSkipsLegacyWorkspaceToolBinding(t *testing.T) {
dispatch := routeDispatch{
Preset: validSingleRequestPreset(),
SingleRequest: newSingleRequestAnthropicTestBinding(t),
}
binding, pinArtifact, err := (&Server{}).compilePresetArtifactBinding(
dispatch,
"openai",
[]byte(`{"model":"virtual-model","messages":[{"role":"user","content":"task"}]}`),
)
if err != nil || binding != nil || pinArtifact {
t.Fatalf("marked single request entered legacy workspace binding: binding=%+v pin=%t err=%v", binding, pinArtifact, err)
}
}