You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@seata.apache.org by ji...@apache.org on 2025/11/06 02:24:38 UTC

(incubator-seata-go) branch master updated: test: improve test coverage for pkg/integration/gin (#969)

This is an automated email from the ASF dual-hosted git repository.

jimin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-seata-go.git


The following commit(s) were added to refs/heads/master by this push:
     new c26ad1cf test: improve test coverage for pkg/integration/gin (#969)
c26ad1cf is described below

commit c26ad1cfc6ac16a17203db998f387043d2c55a58
Author: EVERFID <16...@users.noreply.github.com>
AuthorDate: Thu Nov 6 10:24:33 2025 +0800

    test: improve test coverage for pkg/integration/gin (#969)
---
 .../gin/gin_transaction_middleware_test.go         | 172 +++++++++++++++++++++
 1 file changed, 172 insertions(+)

diff --git a/pkg/integration/gin/gin_transaction_middleware_test.go b/pkg/integration/gin/gin_transaction_middleware_test.go
new file mode 100644
index 00000000..985bdbe4
--- /dev/null
+++ b/pkg/integration/gin/gin_transaction_middleware_test.go
@@ -0,0 +1,172 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package gin
+
+import (
+	"context"
+	"net/http"
+	"net/http/httptest"
+	"testing"
+
+	"github.com/gin-gonic/gin"
+	"github.com/stretchr/testify/assert"
+
+	"seata.apache.org/seata-go/pkg/constant"
+)
+
+func init() {
+	gin.SetMode(gin.TestMode)
+}
+
+func TestTransactionMiddleware_WithXidKey(t *testing.T) {
+	w := httptest.NewRecorder()
+	c, _ := gin.CreateTestContext(w)
+
+	req := httptest.NewRequest(http.MethodGet, "/test", nil)
+	req.Header.Set(constant.XidKey, "test-xid-123")
+	c.Request = req
+
+	middleware := TransactionMiddleware()
+	middleware(c)
+
+	// Should not abort
+	assert.False(t, c.IsAborted())
+	// Context should be updated with XID
+	assert.NotNil(t, c.Request.Context())
+}
+
+func TestTransactionMiddleware_WithXidKeyLowercase(t *testing.T) {
+	w := httptest.NewRecorder()
+	c, _ := gin.CreateTestContext(w)
+
+	req := httptest.NewRequest(http.MethodGet, "/test", nil)
+	req.Header.Set(constant.XidKeyLowercase, "test-xid-lowercase")
+	c.Request = req
+
+	middleware := TransactionMiddleware()
+	middleware(c)
+
+	assert.False(t, c.IsAborted())
+	assert.NotNil(t, c.Request.Context())
+}
+
+func TestTransactionMiddleware_XidKeyPrecedence(t *testing.T) {
+	w := httptest.NewRecorder()
+	c, _ := gin.CreateTestContext(w)
+
+	req := httptest.NewRequest(http.MethodGet, "/test", nil)
+	req.Header.Set(constant.XidKey, "primary-xid")
+	req.Header.Set(constant.XidKeyLowercase, "secondary-xid")
+	c.Request = req
+
+	middleware := TransactionMiddleware()
+	middleware(c)
+
+	assert.False(t, c.IsAborted())
+}
+
+func TestTransactionMiddleware_NoXid(t *testing.T) {
+	w := httptest.NewRecorder()
+	c, _ := gin.CreateTestContext(w)
+
+	req := httptest.NewRequest(http.MethodGet, "/test", nil)
+	c.Request = req
+
+	middleware := TransactionMiddleware()
+	middleware(c)
+
+	// Should abort with BadRequest
+	assert.True(t, c.IsAborted())
+	assert.Equal(t, http.StatusBadRequest, w.Code)
+}
+
+func TestTransactionMiddleware_EmptyXid(t *testing.T) {
+	w := httptest.NewRecorder()
+	c, _ := gin.CreateTestContext(w)
+
+	req := httptest.NewRequest(http.MethodGet, "/test", nil)
+	req.Header.Set(constant.XidKey, "")
+	c.Request = req
+
+	middleware := TransactionMiddleware()
+	middleware(c)
+
+	assert.True(t, c.IsAborted())
+	assert.Equal(t, http.StatusBadRequest, w.Code)
+}
+
+func TestTransactionMiddleware_EmptyPrimaryXid(t *testing.T) {
+	w := httptest.NewRecorder()
+	c, _ := gin.CreateTestContext(w)
+
+	req := httptest.NewRequest(http.MethodGet, "/test", nil)
+	req.Header.Set(constant.XidKey, "")
+	req.Header.Set(constant.XidKeyLowercase, "fallback-xid")
+	c.Request = req
+
+	middleware := TransactionMiddleware()
+	middleware(c)
+
+	assert.False(t, c.IsAborted())
+}
+
+func TestTransactionMiddleware_Integration(t *testing.T) {
+	router := gin.New()
+	router.Use(TransactionMiddleware())
+
+	router.GET("/api/test", func(c *gin.Context) {
+		c.JSON(http.StatusOK, gin.H{"status": "ok"})
+	})
+
+	t.Run("with_valid_xid", func(t *testing.T) {
+		w := httptest.NewRecorder()
+		req := httptest.NewRequest(http.MethodGet, "/api/test", nil)
+		req.Header.Set(constant.XidKey, "integration-xid")
+
+		router.ServeHTTP(w, req)
+
+		assert.Equal(t, http.StatusOK, w.Code)
+	})
+
+	t.Run("without_xid", func(t *testing.T) {
+		w := httptest.NewRecorder()
+		req := httptest.NewRequest(http.MethodGet, "/api/test", nil)
+
+		router.ServeHTTP(w, req)
+
+		assert.Equal(t, http.StatusBadRequest, w.Code)
+	})
+}
+
+func TestTransactionMiddleware_ContextPropagation(t *testing.T) {
+	w := httptest.NewRecorder()
+	c, _ := gin.CreateTestContext(w)
+
+	originalCtx := context.Background()
+	req := httptest.NewRequest(http.MethodGet, "/test", nil)
+	req = req.WithContext(originalCtx)
+	req.Header.Set(constant.XidKey, "ctx-test-xid")
+	c.Request = req
+
+	middleware := TransactionMiddleware()
+	middleware(c)
+
+	// Context should be updated
+	assert.NotEqual(t, originalCtx, c.Request.Context())
+	assert.False(t, c.IsAborted())
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@seata.apache.org
For additional commands, e-mail: notifications-help@seata.apache.org