test(catalog): cover composed availability restrictions

This commit is contained in:
2026-08-24 14:33:01 -03:00
parent 2fd6851b40
commit a73b628bb4
6 changed files with 80 additions and 49 deletions

View File

@@ -3,41 +3,60 @@
namespace Tests\Unit\Catalog;
use App\Domains\Catalog\Services\CatalogItemAllowanceService;
use ReflectionClass;
use App\Domains\Purchase\Services\UserPurchaseLimitService;
use Mockery;
use Tests\TestCase;
class CatalogItemAllowanceServiceTest extends TestCase
{
private CatalogItemAllowanceService $service;
protected function setUp(): void
public function test_it_composes_stock_and_quota_into_restrictions_and_capabilities(): void
{
parent::setUp();
$this->service = (new ReflectionClass(CatalogItemAllowanceService::class))
->newInstanceWithoutConstructor();
}
public function test_it_returns_the_user_quota_message_with_priority_over_stock(): void
{
$this->assertSame(
'Alcanzaste el cupo máximo permitido para este producto.',
$this->service->unavailableMessage(0, 0),
$service = new CatalogItemAllowanceService(
Mockery::mock(UserPurchaseLimitService::class),
);
}
public function test_it_returns_the_out_of_stock_message(): void
{
$availability = $service->availability(0, 0, 'variant');
$this->assertSame(0, $availability['maximum_quantity']);
$this->assertSame(
'Este producto no tiene stock disponible.',
$this->service->unavailableMessage(0, null),
['user_quota_reached', 'out_of_stock'],
array_column($availability['restrictions'], 'code'),
);
$this->assertSame(['variant', 'variant'], array_column($availability['restrictions'], 'scope'));
$this->assertSame([
'select_variant' => false,
'change_quantity' => false,
'add_to_cart' => false,
'buy_now' => false,
], $availability['capabilities']);
}
public function test_it_returns_no_message_when_the_item_is_available(): void
public function test_it_keeps_all_capabilities_when_no_restriction_applies(): void
{
$this->assertNull($this->service->unavailableMessage(1, null));
$this->assertNull($this->service->unavailableMessage(null, 1));
$this->assertNull($this->service->unavailableMessage(null, null));
$service = new CatalogItemAllowanceService(
Mockery::mock(UserPurchaseLimitService::class),
);
$availability = $service->availability(5, 3);
$this->assertSame(3, $availability['maximum_quantity']);
$this->assertSame([], $availability['restrictions']);
$this->assertNotContains(false, $availability['capabilities'], true);
}
public function test_it_describes_a_requested_quantity_that_exceeds_the_remaining_quota(): void
{
$service = new CatalogItemAllowanceService(
Mockery::mock(UserPurchaseLimitService::class),
);
$availability = $service->purchaseLimitExceededAvailability(1, 'Solo podés agregar una unidad.');
$this->assertSame(1, $availability['maximum_quantity']);
$this->assertSame(
'requested_quantity_exceeds_user_quota',
$availability['restrictions'][0]['code'],
);
$this->assertTrue($availability['capabilities']['change_quantity']);
}
}