feat(purchase): add review submission for pending purchases and update related logic

This commit is contained in:
2026-07-29 09:11:00 -03:00
parent 1c870d9cfa
commit 45553dc514
9 changed files with 136 additions and 10 deletions

View File

@@ -100,7 +100,7 @@ class TelepagosWebhookTest extends TestCase
]);
}
public function test_transfer_webhook_matches_pending_purchase_by_dni_and_total_amount(): void
public function test_transfer_webhook_matches_purchase_in_review_by_dni_and_total_amount(): void
{
$tenant = $this->createTenant('sonder', 'Sonder', 'sonder.com.ar');
$this->configureTelepagosIntegration($tenant);
@@ -122,6 +122,8 @@ class TelepagosWebhookTest extends TestCase
'12345678'
);
$matchingPurchase->update(['status' => Purchase::STATUS_IN_REVIEW]);
$newerPurchase = $this->createPendingTransferPurchase(
$tenant,
$newerUser->id,

View File

@@ -474,6 +474,62 @@ class StorePurchaseTest extends TestCase
]);
}
public function test_it_submits_a_pending_purchase_for_review_idempotently(): 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([
'payment_method' => 'transfer',
'status' => Purchase::STATUS_PENDING_PAYMENT,
'expires_at' => now()->addMinutes(30),
]);
$url = "/api/tenants/sonder/compras/{$purchase->id}/review";
$this->actingAs($user, 'sanctum')
->postJson($url)
->assertOk()
->assertJsonPath('data.status', Purchase::STATUS_IN_REVIEW)
->assertJsonPath('data.expires_at', null);
$this->assertDatabaseHas('compras', [
'id' => $purchase->id,
'status' => Purchase::STATUS_IN_REVIEW,
'expires_at' => null,
]);
$this->actingAs($user, 'sanctum')
->postJson($url)
->assertOk()
->assertJsonPath('data.status', Purchase::STATUS_IN_REVIEW);
$this->actingAs($user, 'sanctum')
->postJson("/api/tenants/sonder/compras/{$purchase->id}/complete")
->assertOk()
->assertJsonPath('data.status', Purchase::STATUS_IN_REVIEW);
}
public function test_it_rejects_review_for_a_purchase_that_is_not_awaiting_payment(): 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, 1);
$this->actingAs($user, 'sanctum')
->postJson("/api/tenants/sonder/compras/{$purchase->id}/review")
->assertUnprocessable()
->assertJsonValidationErrors(['purchase']);
$this->assertDatabaseHas('compras', [
'id' => $purchase->id,
'status' => Purchase::STATUS_CREATED,
]);
}
public function test_it_expires_an_abandoned_purchase_and_restores_its_cart(): void
{
$this->createTenant('sonder', 'Sonder', 'sonder.com.ar');