package pipeline import ( "context" "testing" ) func TestMemoryIdempotencyStoreLeaseLifecycle(t *testing.T) { store := NewMemoryIdempotencyStore() ctx := context.Background() first, err := store.Acquire(ctx, "key-1") if err != nil || first.State != IdempotencyAcquired || first.Token == "" { t.Fatalf("first lease=%#v err=%v", first, err) } second, err := store.Acquire(ctx, "key-1") if err != nil || second.State != IdempotencyInProgress { t.Fatalf("second lease=%#v err=%v", second, err) } if err := store.Release(ctx, "key-1", "stale-token"); err == nil { t.Fatal("stale release succeeded") } if err := store.Release(ctx, "key-1", first.Token); err != nil { t.Fatalf("release: %v", err) } reacquired, err := store.Acquire(ctx, "key-1") if err != nil || reacquired.State != IdempotencyAcquired || reacquired.Token == first.Token { t.Fatalf("reacquired lease=%#v err=%v", reacquired, err) } if err := store.Complete(ctx, "key-1", reacquired.Token); err != nil { t.Fatalf("complete: %v", err) } afterComplete, err := store.Acquire(ctx, "key-1") if err != nil || afterComplete.State != IdempotencyAcquired || afterComplete.Token == reacquired.Token { t.Fatalf("lease after complete=%#v err=%v", afterComplete, err) } } func TestMemoryIdempotencyStoreHonorsCanceledContext(t *testing.T) { store := NewMemoryIdempotencyStore() ctx, cancel := context.WithCancel(context.Background()) cancel() if _, err := store.Acquire(ctx, "key-1"); err == nil { t.Fatal("Acquire accepted canceled context") } }