more fancy features
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user