mirror of
https://github.com/Awuqing/BackupX.git
synced 2026-08-29 03:57:39 +08:00
refactor: simplify architecture and harden lifecycle
Remove obsolete implementations, centralize background task ownership and terminal-state recovery, consolidate frontend routing and log streaming, and enforce project-wide verification in CI.
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
package response
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"go.uber.org/zap"
|
||||
"go.uber.org/zap/zaptest/observer"
|
||||
)
|
||||
|
||||
func TestErrorLogsInternalFailureAndHidesDetail(t *testing.T) {
|
||||
gin.SetMode(gin.TestMode)
|
||||
recorder := httptest.NewRecorder()
|
||||
ctx, _ := gin.CreateTestContext(recorder)
|
||||
ctx.Request = httptest.NewRequest(http.MethodGet, "/api/test", nil)
|
||||
core, observed := observer.New(zap.WarnLevel)
|
||||
SetLogger(ctx, zap.New(core))
|
||||
|
||||
Error(ctx, errors.New("database password should stay private"))
|
||||
|
||||
if recorder.Code != http.StatusInternalServerError {
|
||||
t.Fatalf("status = %d, want %d", recorder.Code, http.StatusInternalServerError)
|
||||
}
|
||||
if strings.Contains(recorder.Body.String(), "database password") {
|
||||
t.Fatalf("internal detail leaked in response: %s", recorder.Body.String())
|
||||
}
|
||||
entries := observed.All()
|
||||
if len(entries) != 1 || entries[0].Level != zap.ErrorLevel {
|
||||
t.Fatalf("observed logs = %#v, want one error", entries)
|
||||
}
|
||||
context := entries[0].ContextMap()
|
||||
if context["code"] != "INTERNAL_ERROR" || context["path"] != "/api/test" {
|
||||
t.Fatalf("unexpected log context: %#v", context)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user