55 lines
1.6 KiB
Go
55 lines
1.6 KiB
Go
package api
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// fakeServiceError 模拟 oci-go-sdk 的 common.ServiceError,驱动 respondOCIError 分支。
|
|
type fakeServiceError struct {
|
|
status int
|
|
code string
|
|
message string
|
|
}
|
|
|
|
func (e fakeServiceError) Error() string {
|
|
return fmt.Sprintf("Error returned by service. Http Status Code: %d. Error Code: %s. Message: %s",
|
|
e.status, e.code, e.message)
|
|
}
|
|
|
|
func (e fakeServiceError) GetHTTPStatusCode() int { return e.status }
|
|
func (e fakeServiceError) GetMessage() string { return e.message }
|
|
func (e fakeServiceError) GetCode() string { return e.code }
|
|
func (e fakeServiceError) GetOpcRequestID() string { return "req-1" }
|
|
|
|
// TestRespondErrorOCIStatus 覆盖上游状态码改写规则:
|
|
// 401/429 在前端有本地专属语义(登出 / 跳 /blocked),上游同码须改写 502。
|
|
func TestRespondErrorOCIStatus(t *testing.T) {
|
|
gin.SetMode(gin.TestMode)
|
|
cases := []struct {
|
|
name string
|
|
upstream int
|
|
wantStatus int
|
|
}{
|
|
{"404 原样透传", 404, 404},
|
|
{"409 原样透传", 409, 409},
|
|
{"上游 401 改写 502", 401, 502},
|
|
{"上游 429 改写 502", 429, 502},
|
|
{"非错误码兜底 502", 200, 502},
|
|
}
|
|
for _, tc := range cases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
rec := httptest.NewRecorder()
|
|
c, _ := gin.CreateTestContext(rec)
|
|
err := fmt.Errorf("获取流量: %w", fakeServiceError{tc.upstream, "TooManyRequests", "slow down"})
|
|
respondError(c, err)
|
|
if rec.Code != tc.wantStatus {
|
|
t.Fatalf("status = %d, want %d", rec.Code, tc.wantStatus)
|
|
}
|
|
})
|
|
}
|
|
}
|