feat(cart): implement cart editing policies and update related functionality

This commit is contained in:
2026-08-19 10:15:37 -03:00
parent 67e6211857
commit 014b5bb012
20 changed files with 305 additions and 39 deletions

View File

@@ -121,6 +121,7 @@ class CartControllerTest extends TestCase
->assertOk()
->assertJsonPath('data.items.0.catalog_item_id', $item->id)
->assertJsonPath('data.items.0.variant_id', $variant->id)
->assertJsonPath('data.items.0.variants.0.id', $variant->id)
->assertJsonPath('data.items.0.cantidad', 5)
->assertJsonPath('data.subtotal', '125.00');
@@ -383,6 +384,83 @@ class CartControllerTest extends TestCase
]);
}
public function test_quantity_and_remove_policy_hides_variants_and_rejects_variant_changes(): void
{
$tenant = $this->createTenant('acme');
$tenant->update(['cart_editing_policy' => 'quantity_and_remove']);
[$item, $firstVariant] = $this->createVariantItem($tenant, 10, '15.00');
$secondInventory = Inventory::query()->create(['real_stock' => 10]);
$secondVariant = $item->variants()->create(['inventory_id' => $secondInventory->id]);
$createResponse = $this->postJson('/api/tenants/acme/cart/items', [
'catalog_item_id' => $item->id,
'variant_id' => $firstVariant->id,
'cantidad' => 1,
])->assertJsonMissingPath('data.items.0.variants');
$guestToken = $createResponse->getCookie('guest_token', false)?->getValue();
$cartItemId = $createResponse->json('data.items.0.id');
$this->call(
'PATCH',
"/api/tenants/acme/cart/items/{$cartItemId}",
[],
['guest_token' => $guestToken],
[],
['HTTP_Accept' => 'application/json', 'CONTENT_TYPE' => 'application/json'],
json_encode(['cantidad' => 2]),
)->assertOk()->assertJsonPath('data.items.0.cantidad', 2);
$this->call(
'PATCH',
"/api/tenants/acme/cart/items/{$cartItemId}",
[],
['guest_token' => $guestToken],
[],
['HTTP_Accept' => 'application/json', 'CONTENT_TYPE' => 'application/json'],
json_encode(['cantidad' => 2, 'variant_id' => $secondVariant->id]),
)->assertUnprocessable()->assertJsonValidationErrors('variant_id');
$this->call(
'DELETE',
"/api/tenants/acme/cart/items/{$cartItemId}",
[],
['guest_token' => $guestToken],
[],
['HTTP_Accept' => 'application/json'],
)->assertOk()->assertJsonPath('data.items', []);
}
public function test_disabled_policy_rejects_quantity_changes_and_removal(): void
{
$tenant = $this->createTenant('acme');
$tenant->update(['cart_editing_policy' => 'disabled']);
$item = $this->createDirectItem($tenant, 10, '15.00');
$createResponse = $this->postJson('/api/tenants/acme/cart/items', [
'catalog_item_id' => $item->id,
'cantidad' => 1,
])->assertOk();
$guestToken = $createResponse->getCookie('guest_token', false)?->getValue();
$cartItemId = $createResponse->json('data.items.0.id');
$this->call(
'PATCH',
"/api/tenants/acme/cart/items/{$cartItemId}",
[],
['guest_token' => $guestToken],
[],
['HTTP_Accept' => 'application/json', 'CONTENT_TYPE' => 'application/json'],
json_encode(['cantidad' => 2]),
)->assertUnprocessable()->assertJsonValidationErrors('cantidad');
$this->call(
'DELETE',
"/api/tenants/acme/cart/items/{$cartItemId}",
[],
['guest_token' => $guestToken],
[],
['HTTP_Accept' => 'application/json'],
)->assertUnprocessable()->assertJsonValidationErrors('cart_item');
}
public function test_it_requires_a_variant_when_the_item_has_variant_inventory(): void
{
$tenant = $this->createTenant('acme');