more fancy features

This commit is contained in:
2025-11-26 18:35:08 +01:00
parent 28c9a24dac
commit 51b30de2d8
5 changed files with 128 additions and 20 deletions
@@ -49,8 +49,8 @@ func TestReserveAndRelease(t *testing.T) {
// Reserve
req := CartReserveRequest{
InventoryReference: &InventoryReference{Sku: sku, LocationID: locationID},
CartId: cartID,
InventoryReference: &InventoryReference{SKU: sku, LocationID: locationID},
CartID: cartID,
Quantity: 2,
TTL: 5 * time.Minute,
}
@@ -132,8 +132,8 @@ func TestConcurrentReserves(t *testing.T) {
go func(cartNum int) {
defer wg.Done()
req := CartReserveRequest{
InventoryReference: &InventoryReference{Sku: sku, LocationID: locationID},
CartId: CartID(fmt.Sprintf("cart%d", cartNum)),
InventoryReference: &InventoryReference{SKU: sku, LocationID: locationID},
CartID: CartID(fmt.Sprintf("cart%d", cartNum)),
Quantity: 1,
TTL: 5 * time.Minute,
}
@@ -195,8 +195,8 @@ func TestExpiry(t *testing.T) {
// Reserve with short TTL
req := CartReserveRequest{
InventoryReference: &InventoryReference{Sku: sku, LocationID: locationID},
CartId: cartID,
InventoryReference: &InventoryReference{SKU: sku, LocationID: locationID},
CartID: cartID,
Quantity: 2,
TTL: 10 * time.Second,
}
@@ -239,3 +239,73 @@ func TestExpiry(t *testing.T) {
t.Errorf("expected available 8, got %d", available)
}
}
func TestGetReservationSummary(t *testing.T) {
client, mr, err := setupTestRedis()
if err != nil {
t.Fatal(err)
}
defer mr.Close()
service, err := NewRedisCartReservationService(client)
if err != nil {
t.Fatal(err)
}
ctx := context.Background()
sku := SKU("test-item")
locationID := LocationID("warehouse1")
// Set initial inventory
err = client.Set(ctx, getInventoryKey(sku, locationID), 10, 0).Err()
if err != nil {
t.Fatal(err)
}
// Reserve two carts
req1 := CartReserveRequest{
InventoryReference: &InventoryReference{SKU: sku, LocationID: locationID},
CartID: "cart1",
Quantity: 2,
TTL: 5 * time.Minute,
}
err = service.ReserveForCart(ctx, req1)
if err != nil {
t.Fatal(err)
}
req2 := CartReserveRequest{
InventoryReference: &InventoryReference{SKU: sku, LocationID: locationID},
CartID: "cart2",
Quantity: 1,
TTL: 10 * time.Minute,
}
err = service.ReserveForCart(ctx, req2)
if err != nil {
t.Fatal(err)
}
// Get summary
summary, err := service.GetReservationSummary(ctx, sku, locationID)
if err != nil {
t.Fatal(err)
}
if summary.ReservationCount != 2 {
t.Errorf("expected 2 reservations, got %d", summary.ReservationCount)
}
if summary.RemainingItems != 7 {
t.Errorf("expected remaining 7, got %d", summary.RemainingItems)
}
if summary.EarliestRelease.IsZero() {
t.Error("expected earliest release time")
}
// Earliest should be cart1's expiry (5 min)
expectedEarliest := time.Now().Add(5 * time.Minute)
if summary.EarliestRelease.After(expectedEarliest.Add(1*time.Second)) || summary.EarliestRelease.Before(expectedEarliest.Add(-1*time.Second)) {
t.Errorf("earliest release time incorrect: %v", summary.EarliestRelease)
}
}