init push
This commit is contained in:
88
internal/repository/mysql/idempotency_store_test.go
Normal file
88
internal/repository/mysql/idempotency_store_test.go
Normal file
@@ -0,0 +1,88 @@
|
||||
package mysql
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"wucher/internal/queue"
|
||||
)
|
||||
|
||||
func TestQueueIdempotencyStore_AcquireMarkCompletedRelease(t *testing.T) {
|
||||
db := openDBTestSQLite(t)
|
||||
if err := AutoMigrate(db); err != nil {
|
||||
t.Fatalf("auto migrate: %v", err)
|
||||
}
|
||||
|
||||
baseTime := time.Date(2026, 3, 20, 10, 0, 0, 0, time.UTC)
|
||||
store := NewQueueIdempotencyStore(db, "queue:idempotency:")
|
||||
store.now = func() time.Time { return baseTime }
|
||||
|
||||
ctx := context.Background()
|
||||
state, err := store.Acquire(ctx, "msg-1", time.Minute)
|
||||
if err != nil {
|
||||
t.Fatalf("acquire first: %v", err)
|
||||
}
|
||||
if state != queue.IdempotencyStateAcquired {
|
||||
t.Fatalf("expected acquired, got %s", state)
|
||||
}
|
||||
|
||||
state, err = store.Acquire(ctx, "msg-1", time.Minute)
|
||||
if err != nil {
|
||||
t.Fatalf("acquire in-progress: %v", err)
|
||||
}
|
||||
if state != queue.IdempotencyStateInProgress {
|
||||
t.Fatalf("expected in progress, got %s", state)
|
||||
}
|
||||
|
||||
if err := store.MarkCompleted(ctx, "msg-1", time.Hour); err != nil {
|
||||
t.Fatalf("mark completed: %v", err)
|
||||
}
|
||||
state, err = store.Acquire(ctx, "msg-1", time.Minute)
|
||||
if err != nil {
|
||||
t.Fatalf("acquire duplicate: %v", err)
|
||||
}
|
||||
if state != queue.IdempotencyStateDuplicate {
|
||||
t.Fatalf("expected duplicate, got %s", state)
|
||||
}
|
||||
|
||||
if err := store.Release(ctx, "msg-1"); err != nil {
|
||||
t.Fatalf("release: %v", err)
|
||||
}
|
||||
state, err = store.Acquire(ctx, "msg-1", time.Minute)
|
||||
if err != nil {
|
||||
t.Fatalf("acquire after release: %v", err)
|
||||
}
|
||||
if state != queue.IdempotencyStateAcquired {
|
||||
t.Fatalf("expected acquired after release, got %s", state)
|
||||
}
|
||||
}
|
||||
|
||||
func TestQueueIdempotencyStore_ReacquiresExpiredProcessingRecord(t *testing.T) {
|
||||
db := openDBTestSQLite(t)
|
||||
if err := AutoMigrate(db); err != nil {
|
||||
t.Fatalf("auto migrate: %v", err)
|
||||
}
|
||||
|
||||
baseTime := time.Date(2026, 3, 20, 10, 0, 0, 0, time.UTC)
|
||||
store := NewQueueIdempotencyStore(db, "queue:idempotency:")
|
||||
store.now = func() time.Time { return baseTime }
|
||||
|
||||
ctx := context.Background()
|
||||
state, err := store.Acquire(ctx, "msg-expired", time.Minute)
|
||||
if err != nil {
|
||||
t.Fatalf("acquire first: %v", err)
|
||||
}
|
||||
if state != queue.IdempotencyStateAcquired {
|
||||
t.Fatalf("expected acquired, got %s", state)
|
||||
}
|
||||
|
||||
store.now = func() time.Time { return baseTime.Add(2 * time.Minute) }
|
||||
state, err = store.Acquire(ctx, "msg-expired", time.Minute)
|
||||
if err != nil {
|
||||
t.Fatalf("reacquire expired: %v", err)
|
||||
}
|
||||
if state != queue.IdempotencyStateAcquired {
|
||||
t.Fatalf("expected reacquired state, got %s", state)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user