Files
team-api/relay/handler/error_writer_test.go
T
fa053529af 图片请求统一异步处理 (#11)
* fix:未导入unicode包

* feat:图片异步转换

* feat:添加R2支持

* feat:新增文件管理

* fix:修复错误信息双写导致响应异常

* chore:渠道列表中添加快捷启用停止按钮

* fix:修复模型异常终端导致报错的问题

* improve:优化无可用渠道的日志打印,减少日志污染

* fix:在线体验出错缺少提示信息

* fix:修复日志库问题,只有请求日志保存到独立的库中

* feat:新增阿里图片模型说明文档

* fix:阿里千问图片生成

* fix:修复图片异步控制无效问题

* improve:优化文件展示,支持缩略图查看

* feat:实时监控中添加图片异步转换池状态信息

* improve:优化在线体验页面布局

* fix:修复异步任务状态显示异常问题

* feat:图片异步任务停止时等待任务完成后再退出程序

* chore:调整存储路径

---------

Co-authored-by: qian <wuchengqian5@163.com>
Co-authored-by: chengqian <wuchengqian@kkidc.com>
2026-07-18 00:26:13 +08:00

68 lines
2.0 KiB
Go

package handler
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/qianfree/team-api/relay/constant"
)
// TestErrorWriters_SkipResponseWritten 验证当 adaptor 已置 ResponseWritten=true 时,
// 三个错误写入器都跳过二次写入(不写 header、不写 body)。
// 这是 Gemini/OpenAI「双重写入」修复的核心机制兜底。
func TestErrorWriters_SkipResponseWritten(t *testing.T) {
writtenErr := constant.NewUpstreamError(http.StatusTooManyRequests, "upstream 429", nil)
writtenErr.ResponseWritten = true
cases := []struct {
name string
fn func(http.ResponseWriter, error)
}{
{"WriteRelayError", WriteRelayError},
{"WriteClaudeRelayError", WriteClaudeRelayError},
{"WriteGeminiRelayError", WriteGeminiRelayError},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
rec := httptest.NewRecorder()
c.fn(rec, writtenErr)
if rec.Code != http.StatusOK {
t.Errorf("Code = %d, want 200 (no WriteHeader should happen)", rec.Code)
}
if rec.Body.Len() != 0 {
t.Errorf("body = %q, want empty (no write should happen)", rec.Body.String())
}
})
}
}
// TestErrorWriters_WriteNormalError 验证普通(未标记 ResponseWritten)的 RelayError
// 仍被三个写入器正常写入一次,确保短路逻辑不影响正常错误路径。
func TestErrorWriters_WriteNormalError(t *testing.T) {
normalErr := constant.NewUpstreamError(http.StatusTooManyRequests, "upstream 429", nil)
cases := []struct {
name string
fn func(http.ResponseWriter, error)
}{
{"WriteRelayError", WriteRelayError},
{"WriteClaudeRelayError", WriteClaudeRelayError},
{"WriteGeminiRelayError", WriteGeminiRelayError},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
rec := httptest.NewRecorder()
c.fn(rec, normalErr)
if rec.Code != http.StatusTooManyRequests {
t.Errorf("Code = %d, want 429", rec.Code)
}
if rec.Body.Len() == 0 {
t.Errorf("body empty, want non-empty error response")
}
})
}
}