fix: 幂等测试使用哈希值避免超出 VARCHAR(64) 限制
idempotency_key_hash 和 request_fingerprint 列为 VARCHAR(64), 而 uniqueTestValue 生成的字符串含完整测试名可能超过 64 字符。 新增 hashedTestValue 辅助函数对测试值做 SHA-256 哈希, 与生产逻辑一致且严格符合列宽限制。
This commit is contained in:
@@ -4,6 +4,8 @@ package repository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/sha256"
|
||||||
|
"encoding/hex"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -11,6 +13,13 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// hashedTestValue returns a unique SHA-256 hex string (64 chars) that fits VARCHAR(64) columns.
|
||||||
|
func hashedTestValue(t *testing.T, prefix string) string {
|
||||||
|
t.Helper()
|
||||||
|
sum := sha256.Sum256([]byte(uniqueTestValue(t, prefix)))
|
||||||
|
return hex.EncodeToString(sum[:])
|
||||||
|
}
|
||||||
|
|
||||||
func TestIdempotencyRepo_CreateProcessing_CompeteSameKey(t *testing.T) {
|
func TestIdempotencyRepo_CreateProcessing_CompeteSameKey(t *testing.T) {
|
||||||
tx := testTx(t)
|
tx := testTx(t)
|
||||||
repo := &idempotencyRepository{sql: tx}
|
repo := &idempotencyRepository{sql: tx}
|
||||||
@@ -19,8 +28,8 @@ func TestIdempotencyRepo_CreateProcessing_CompeteSameKey(t *testing.T) {
|
|||||||
now := time.Now().UTC()
|
now := time.Now().UTC()
|
||||||
record := &service.IdempotencyRecord{
|
record := &service.IdempotencyRecord{
|
||||||
Scope: uniqueTestValue(t, "idem-scope-create"),
|
Scope: uniqueTestValue(t, "idem-scope-create"),
|
||||||
IdempotencyKeyHash: uniqueTestValue(t, "idem-hash"),
|
IdempotencyKeyHash: hashedTestValue(t, "idem-hash"),
|
||||||
RequestFingerprint: uniqueTestValue(t, "idem-fp"),
|
RequestFingerprint: hashedTestValue(t, "idem-fp"),
|
||||||
Status: service.IdempotencyStatusProcessing,
|
Status: service.IdempotencyStatusProcessing,
|
||||||
LockedUntil: ptrTime(now.Add(30 * time.Second)),
|
LockedUntil: ptrTime(now.Add(30 * time.Second)),
|
||||||
ExpiresAt: now.Add(24 * time.Hour),
|
ExpiresAt: now.Add(24 * time.Hour),
|
||||||
@@ -33,7 +42,7 @@ func TestIdempotencyRepo_CreateProcessing_CompeteSameKey(t *testing.T) {
|
|||||||
duplicate := &service.IdempotencyRecord{
|
duplicate := &service.IdempotencyRecord{
|
||||||
Scope: record.Scope,
|
Scope: record.Scope,
|
||||||
IdempotencyKeyHash: record.IdempotencyKeyHash,
|
IdempotencyKeyHash: record.IdempotencyKeyHash,
|
||||||
RequestFingerprint: uniqueTestValue(t, "idem-fp-other"),
|
RequestFingerprint: hashedTestValue(t, "idem-fp-other"),
|
||||||
Status: service.IdempotencyStatusProcessing,
|
Status: service.IdempotencyStatusProcessing,
|
||||||
LockedUntil: ptrTime(now.Add(30 * time.Second)),
|
LockedUntil: ptrTime(now.Add(30 * time.Second)),
|
||||||
ExpiresAt: now.Add(24 * time.Hour),
|
ExpiresAt: now.Add(24 * time.Hour),
|
||||||
@@ -51,8 +60,8 @@ func TestIdempotencyRepo_TryReclaim_StatusAndLockWindow(t *testing.T) {
|
|||||||
now := time.Now().UTC()
|
now := time.Now().UTC()
|
||||||
record := &service.IdempotencyRecord{
|
record := &service.IdempotencyRecord{
|
||||||
Scope: uniqueTestValue(t, "idem-scope-reclaim"),
|
Scope: uniqueTestValue(t, "idem-scope-reclaim"),
|
||||||
IdempotencyKeyHash: uniqueTestValue(t, "idem-hash-reclaim"),
|
IdempotencyKeyHash: hashedTestValue(t, "idem-hash-reclaim"),
|
||||||
RequestFingerprint: uniqueTestValue(t, "idem-fp-reclaim"),
|
RequestFingerprint: hashedTestValue(t, "idem-fp-reclaim"),
|
||||||
Status: service.IdempotencyStatusProcessing,
|
Status: service.IdempotencyStatusProcessing,
|
||||||
LockedUntil: ptrTime(now.Add(10 * time.Second)),
|
LockedUntil: ptrTime(now.Add(10 * time.Second)),
|
||||||
ExpiresAt: now.Add(24 * time.Hour),
|
ExpiresAt: now.Add(24 * time.Hour),
|
||||||
@@ -116,8 +125,8 @@ func TestIdempotencyRepo_StatusTransition_ToSucceeded(t *testing.T) {
|
|||||||
now := time.Now().UTC()
|
now := time.Now().UTC()
|
||||||
record := &service.IdempotencyRecord{
|
record := &service.IdempotencyRecord{
|
||||||
Scope: uniqueTestValue(t, "idem-scope-success"),
|
Scope: uniqueTestValue(t, "idem-scope-success"),
|
||||||
IdempotencyKeyHash: uniqueTestValue(t, "idem-hash-success"),
|
IdempotencyKeyHash: hashedTestValue(t, "idem-hash-success"),
|
||||||
RequestFingerprint: uniqueTestValue(t, "idem-fp-success"),
|
RequestFingerprint: hashedTestValue(t, "idem-fp-success"),
|
||||||
Status: service.IdempotencyStatusProcessing,
|
Status: service.IdempotencyStatusProcessing,
|
||||||
LockedUntil: ptrTime(now.Add(10 * time.Second)),
|
LockedUntil: ptrTime(now.Add(10 * time.Second)),
|
||||||
ExpiresAt: now.Add(24 * time.Hour),
|
ExpiresAt: now.Add(24 * time.Hour),
|
||||||
|
|||||||
Reference in New Issue
Block a user