fix(cart): invalidate checkout on mutation

This commit is contained in:
2026-08-21 14:06:11 -03:00
parent afd69b8393
commit dc0fbe06b8
2 changed files with 102 additions and 1 deletions

View File

@@ -13,6 +13,7 @@ use App\Domains\Catalog\Models\Inventory;
use App\Domains\Catalog\Models\Variant;
use App\Domains\Purchase\Models\Purchase;
use App\Domains\Purchase\Services\CheckoutService;
use App\Domains\Purchase\Services\UserPurchaseLimitService;
use App\Domains\Tenant\Models\Tenant;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Queue;
@@ -562,6 +563,50 @@ class StorePurchaseTest extends TestCase
]);
}
public function test_removing_a_checkout_item_supersedes_the_purchase_and_restores_the_user_quota(): void
{
$this->createTenant('sonder', 'Sonder', 'sonder.com.ar');
$user = User::factory()->create();
$variant = $this->createVariantForTenant('sonder', 10, '50.00');
$variant->catalogItem->update(['max_units_per_user' => 3]);
$purchase = $this->createCheckoutPurchase($user, 'sonder', $variant, 2);
$cart = $purchase->cart;
$cartItem = $cart->items()->firstOrFail();
$cart->removeItem($cartItem->id);
$this->assertDatabaseHas('compras', [
'id' => $purchase->id,
'status' => Purchase::STATUS_SUPERSEDED,
]);
$this->assertDatabaseHas('compra_items', [
'compra_id' => $purchase->id,
'source_catalog_item_id' => $variant->catalog_item_id,
'cantidad' => 2,
]);
$this->assertDatabaseHas('carritos', [
'id' => $cart->id,
'current_purchase_id' => null,
]);
$this->assertDatabaseHas('stock_reservations', [
'inventory_id' => $variant->inventory_id,
'cart_item_id' => null,
'purchase_id' => null,
'quantity' => 0,
'status' => 'released',
]);
$this->assertDatabaseHas('inventories', [
'id' => $variant->inventory_id,
'reserved_stock' => 0,
]);
$remaining = app(UserPurchaseLimitService::class)
->remainingByCatalogItem(collect([$variant->catalogItem->fresh()]), $user->id)
->get($variant->catalog_item_id);
$this->assertSame(3, $remaining);
}
public function test_it_expires_the_purchase_without_mutating_the_active_cart(): void
{
$this->createTenant('sonder', 'Sonder', 'sonder.com.ar');