refactor(cart): invalidate payment on actual changes

This commit is contained in:
2026-08-19 12:38:21 -03:00
parent 3206e293eb
commit 8d6bcdcc43
7 changed files with 69 additions and 129 deletions

View File

@@ -631,7 +631,7 @@ class StorePurchaseTest extends TestCase
]);
}
public function test_it_reopens_a_pending_purchase_before_editing_items(): void
public function test_it_invalidates_a_pending_payment_when_the_checkout_cart_changes(): void
{
$this->createTenant('sonder', 'Sonder', 'sonder.com.ar');
$user = User::factory()->create();
@@ -645,16 +645,20 @@ class StorePurchaseTest extends TestCase
'qr_order_id' => 'stale-order',
'qr_code' => 'stale-qr',
]);
$itemId = $purchase->cart->items->firstOrFail()->id;
$this->actingAs($user, 'sanctum')
->postJson("/api/tenants/sonder/checkout-carts/{$purchase->cart_id}/edit")
->patchJson("/api/tenants/sonder/checkout-carts/{$purchase->cart_id}/items/{$itemId}", [
'cantidad' => 3,
])
->assertOk()
->assertJsonPath('data.status', 'checkout');
->assertJsonPath('data.items.0.cantidad', 3);
$this->assertDatabaseHas('compras', [
'id' => $purchase->id,
'status' => Purchase::STATUS_CREATED,
'payment_method' => null,
'total' => '150.00',
]);
$this->assertDatabaseMissing('telepagos_qr', [
'compra_id' => $purchase->id,
@@ -662,6 +666,39 @@ class StorePurchaseTest extends TestCase
]);
}
public function test_a_no_op_checkout_cart_update_keeps_the_pending_payment_intact(): void
{
$this->createTenant('sonder', 'Sonder', 'sonder.com.ar');
$user = User::factory()->create();
$variant = $this->createVariantForTenant('sonder', 10, '50.00');
$purchase = $this->createCheckoutPurchase($user, 'sonder', $variant, 2);
$purchase->update([
'status' => Purchase::STATUS_PENDING_PAYMENT,
'payment_method' => 'qr',
]);
$purchase->telepagosQr()->create([
'qr_order_id' => 'current-order',
'qr_code' => 'current-qr',
]);
$itemId = $purchase->cart->items->firstOrFail()->id;
$this->actingAs($user, 'sanctum')
->patchJson("/api/tenants/sonder/checkout-carts/{$purchase->cart_id}/items/{$itemId}", [
'cantidad' => 2,
])
->assertOk();
$this->assertDatabaseHas('compras', [
'id' => $purchase->id,
'status' => Purchase::STATUS_PENDING_PAYMENT,
'payment_method' => 'qr',
]);
$this->assertDatabaseHas('telepagos_qr', [
'compra_id' => $purchase->id,
'qr_order_id' => 'current-order',
]);
}
public function test_start_checkout_rejects_customer_data(): void
{
$this->createTenant('sonder', 'Sonder', 'sonder.com.ar');