test(catalog): cover global availability decisions

This commit is contained in:
2026-08-25 09:03:09 -03:00
parent 98bfc0d5e9
commit 3c646f3560
3 changed files with 56 additions and 60 deletions

View File

@@ -2,7 +2,7 @@
namespace Tests\Unit\Catalog;
use App\Domains\Catalog\Enums\AvailabilitySubject;
use App\Domains\Catalog\Services\AvailabilityPolicyResolver;
use App\Domains\Catalog\Services\CatalogItemAllowanceService;
use App\Domains\Purchase\Services\UserPurchaseLimitService;
use Mockery;
@@ -10,70 +10,65 @@ use Tests\TestCase;
class CatalogItemAllowanceServiceTest extends TestCase
{
public function test_it_composes_stock_and_quota_into_restrictions_and_capabilities(): void
public function test_a_hidden_decision_only_exposes_its_state_and_reasons(): void
{
$service = new CatalogItemAllowanceService(
Mockery::mock(UserPurchaseLimitService::class),
);
$availability = $this->service()->availability(0, 0)->toArray();
$availability = $service->availability(0, 0, AvailabilitySubject::Variant);
$this->assertSame('variant', $availability['subject']);
$this->assertSame(0, $availability['maximum_quantity']);
$this->assertSame('hidden', $availability['state']);
$this->assertSame(
['user_quota_reached', 'out_of_stock'],
array_column($availability['restrictions'], 'code'),
array_column($availability['reasons'], 'code'),
);
$this->assertSame([
'display' => false,
'select_variant' => false,
'change_quantity' => false,
'add_to_cart' => false,
'buy_now' => false,
], $availability['capabilities']);
$this->assertArrayNotHasKey('maximum_quantity', $availability);
$this->assertArrayNotHasKey('allowed_actions', $availability);
}
public function test_it_keeps_all_capabilities_when_no_restriction_applies(): void
public function test_an_available_decision_keeps_all_actions(): void
{
$service = new CatalogItemAllowanceService(
Mockery::mock(UserPurchaseLimitService::class),
);
$availability = $this->service()->availability(5, 3)->toArray();
$availability = $service->availability(5, 3);
$this->assertSame('product', $availability['subject']);
$this->assertSame('visible', $availability['state']);
$this->assertSame(3, $availability['maximum_quantity']);
$this->assertSame([], $availability['restrictions']);
$this->assertNotContains(false, $availability['capabilities'], true);
$this->assertSame([], $availability['reasons']);
$this->assertSame([
'select_variant',
'change_quantity',
'add_to_cart',
'buy_now',
], $availability['allowed_actions']);
}
public function test_reaching_the_user_quota_keeps_the_product_visible(): void
public function test_reaching_the_user_quota_keeps_the_product_visible_without_actions(): void
{
$service = new CatalogItemAllowanceService(
Mockery::mock(UserPurchaseLimitService::class),
);
$availability = $this->service()->availability(5, 0)->toArray();
$availability = $service->availability(5, 0);
$this->assertTrue($availability['capabilities']['display']);
$this->assertFalse($availability['capabilities']['add_to_cart']);
$this->assertSame('user_quota_reached', $availability['restrictions'][0]['code']);
$this->assertSame('visible', $availability['state']);
$this->assertSame([], $availability['allowed_actions']);
$this->assertSame('user_quota_reached', $availability['reasons'][0]['code']);
}
public function test_it_describes_a_requested_quantity_that_exceeds_the_remaining_quota(): void
public function test_exceeding_the_remaining_quota_allows_the_quantity_to_be_corrected(): void
{
$service = new CatalogItemAllowanceService(
Mockery::mock(UserPurchaseLimitService::class),
);
$availability = $service->purchaseLimitExceededAvailability(1, 'Solo podés agregar una unidad.');
$availability = $this->service()
->purchaseLimitExceededAvailability(1, 'Solo podés agregar una unidad.')
->toArray();
$this->assertSame(1, $availability['maximum_quantity']);
$this->assertSame(
'requested_quantity_exceeds_user_quota',
$availability['restrictions'][0]['code'],
$availability['reasons'][0]['code'],
);
$this->assertSame([
'select_variant',
'change_quantity',
], $availability['allowed_actions']);
}
private function service(): CatalogItemAllowanceService
{
return new CatalogItemAllowanceService(
Mockery::mock(UserPurchaseLimitService::class),
new AvailabilityPolicyResolver,
);
$this->assertTrue($availability['capabilities']['display']);
$this->assertTrue($availability['capabilities']['change_quantity']);
}
}