fix(t232): log freight import diagnostics

This commit is contained in:
QiuSW
2026-07-29 11:08:23 +08:00
parent 3981a61423
commit b316287092
5 changed files with 90 additions and 14 deletions
+3 -1
View File
@@ -306,7 +306,9 @@ func buildRouter(
if err != nil {
return nil, err
}
webHandler, err := webui.NewHandler(webService, renderer)
webHandler, err := webui.NewHandler(webService, renderer, func(event string) {
log.Print(event)
})
if err != nil {
return nil, err
}
@@ -35,18 +35,30 @@ const (
type Handler struct {
service Service
renderer *Renderer
logEvent EventLogger
}
func NewHandler(service Service, renderer *Renderer) (*Handler, error) {
type EventLogger func(string)
func NewHandler(
service Service,
renderer *Renderer,
loggers ...EventLogger,
) (*Handler, error) {
if service == nil {
return nil, errors.New("admin web service is required")
}
if renderer == nil {
return nil, errors.New("admin web renderer is required")
}
logEvent := EventLogger(func(string) {})
if len(loggers) > 0 && loggers[0] != nil {
logEvent = loggers[0]
}
return &Handler{
service: service,
renderer: renderer,
logEvent: logEvent,
}, nil
}
@@ -412,7 +424,9 @@ func (h *Handler) CreateFreightImport(ctx *gin.Context) {
if err != nil {
token, _ := csrfToken(ctx)
code, title, message := freightImportError(err)
h.render(ctx, serviceErrorStatus(err), "freight-import", freightImportPage{
status := serviceErrorStatus(err)
h.logFreightImportFailure(code, status)
h.render(ctx, status, "freight-import", freightImportPage{
Page: pageView{
Title: "导入 ERP 货运",
FreightCurrent: true,
@@ -432,6 +446,17 @@ func (h *Handler) CreateFreightImport(ctx *gin.Context) {
ctx.Redirect(http.StatusSeeOther, "/freight/import?sync="+pathEscape(run.ID))
}
func (h *Handler) logFreightImportFailure(code string, status int) {
if code == "" {
h.logEvent("freight_import_failed status=" + strconv.Itoa(status))
return
}
h.logEvent(
"freight_import_preflight_failed code=" + code +
" status=" + strconv.Itoa(status),
)
}
func freightImportError(err error) (string, string, string) {
switch {
case errors.Is(err, ErrOCRServiceInvalid):
@@ -10,6 +10,7 @@ import (
"net/http/httptest"
"net/url"
"regexp"
"strconv"
"strings"
"testing"
"time"
@@ -1122,7 +1123,10 @@ func TestFreightImportShowsStablePreflightErrorDialog(t *testing.T) {
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
service := &fakeFreightService{fakeService: &fakeService{}, err: testCase.err}
router := newTestRouter(t, service)
var event string
router := newTestRouterWithLogger(t, service, func(value string) {
event = value
})
page := performRequest(t, router, http.MethodGet, "/freight/import", nil, "")
if page.Code != http.StatusOK {
t.Fatalf("import page status = %d", page.Code)
@@ -1147,10 +1151,44 @@ func TestFreightImportShowsStablePreflightErrorDialog(t *testing.T) {
service.createInput.OrderNumber != "ORDER-123" {
t.Fatalf("dialog response/input = %d / %s / %+v", response.Code, response.Body, service.createInput)
}
wantEvent := "freight_import_preflight_failed code=" +
testCase.code + " status=" + strconv.Itoa(testCase.status)
if event != wantEvent || strings.Contains(event, "private") {
t.Fatalf("event = %q, want %q", event, wantEvent)
}
})
}
}
func TestFreightImportLogsUnknownFailureWithoutRawError(t *testing.T) {
service := &fakeFreightService{
fakeService: &fakeService{},
err: errors.New("private ERP response with cookie and password"),
}
var event string
router := newTestRouterWithLogger(t, service, func(value string) {
event = value
})
page := performRequest(t, router, http.MethodGet, "/freight/import", nil, "")
cookie := csrfCookie(t, page)
values := url.Values{
"csrf_token": {cookie.Value},
"idempotency_key": {mustToken(t)},
"mode": {"ORDER_NUMBER"},
"order_number": {"ORDER-123"},
}
request := httptest.NewRequest(http.MethodPost, "/freight/import", strings.NewReader(values.Encode()))
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
request.AddCookie(cookie)
response := httptest.NewRecorder()
router.ServeHTTP(response, request)
if response.Code != http.StatusInternalServerError ||
event != "freight_import_failed status=500" ||
strings.Contains(event, "private") {
t.Fatalf("response/event = %d / %q", response.Code, event)
}
}
func TestFreightDetailCreatesProcurementTaskWithCSRF(t *testing.T) {
const itemID = "00000000-0000-4000-8000-000000000002"
service := &fakeProcurementService{
@@ -1431,13 +1469,21 @@ func (service *fakeService) AuthorizeOrder(
}
func newTestRouter(t *testing.T, service Service) http.Handler {
return newTestRouterWithLogger(t, service, nil)
}
func newTestRouterWithLogger(
t *testing.T,
service Service,
logEvent EventLogger,
) http.Handler {
t.Helper()
gin.SetMode(gin.TestMode)
renderer, err := NewRenderer()
if err != nil {
t.Fatalf("NewRenderer() error = %v", err)
}
handler, err := NewHandler(service, renderer)
handler, err := NewHandler(service, renderer, logEvent)
if err != nil {
t.Fatalf("NewHandler() error = %v", err)
}