//go:build unit package handler import ( "encoding/json" "net/http" "net/http/httptest" "testing" "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestWriteSuccessResponse(t *testing.T) { gin.SetMode(gin.TestMode) tests := []struct { name string providerKey string wantCode int wantContentType string wantBody string checkJSON bool wantJSONCode string wantJSONMessage string }{ { name: "wxpay returns JSON with code SUCCESS", providerKey: "wxpay", wantCode: http.StatusOK, wantContentType: "application/json", checkJSON: true, wantJSONCode: "SUCCESS", wantJSONMessage: "成功", }, { name: "stripe returns empty 200", providerKey: "stripe", wantCode: http.StatusOK, wantContentType: "text/plain", wantBody: "", }, { name: "easypay returns plain text success", providerKey: "easypay", wantCode: http.StatusOK, wantContentType: "text/plain", wantBody: "success", }, { name: "alipay returns plain text success", providerKey: "alipay", wantCode: http.StatusOK, wantContentType: "text/plain", wantBody: "success", }, { name: "unknown provider returns plain text success", providerKey: "unknown_provider", wantCode: http.StatusOK, wantContentType: "text/plain", wantBody: "success", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { w := httptest.NewRecorder() c, _ := gin.CreateTestContext(w) writeSuccessResponse(c, tt.providerKey) assert.Equal(t, tt.wantCode, w.Code) assert.Contains(t, w.Header().Get("Content-Type"), tt.wantContentType) if tt.checkJSON { var resp wxpaySuccessResponse err := json.Unmarshal(w.Body.Bytes(), &resp) require.NoError(t, err, "response body should be valid JSON") assert.Equal(t, tt.wantJSONCode, resp.Code) assert.Equal(t, tt.wantJSONMessage, resp.Message) } else { assert.Equal(t, tt.wantBody, w.Body.String()) } }) } } func TestWebhookConstants(t *testing.T) { t.Run("maxWebhookBodySize is 1MB", func(t *testing.T) { assert.Equal(t, int64(1<<20), int64(maxWebhookBodySize)) }) t.Run("webhookLogTruncateLen is 200", func(t *testing.T) { assert.Equal(t, 200, webhookLogTruncateLen) }) }