availability(0, 0, AvailabilitySubject::Variant); $this->assertSame('variant', $availability['subject']); $this->assertSame(0, $availability['maximum_quantity']); $this->assertSame( ['user_quota_reached', 'out_of_stock'], array_column($availability['restrictions'], 'code'), ); $this->assertSame([ 'display' => false, 'select_variant' => false, 'change_quantity' => false, 'add_to_cart' => false, 'buy_now' => false, ], $availability['capabilities']); } public function test_it_keeps_all_capabilities_when_no_restriction_applies(): void { $service = new CatalogItemAllowanceService( Mockery::mock(UserPurchaseLimitService::class), ); $availability = $service->availability(5, 3); $this->assertSame('product', $availability['subject']); $this->assertSame(3, $availability['maximum_quantity']); $this->assertSame([], $availability['restrictions']); $this->assertNotContains(false, $availability['capabilities'], true); } public function test_reaching_the_user_quota_keeps_the_product_visible(): void { $service = new CatalogItemAllowanceService( Mockery::mock(UserPurchaseLimitService::class), ); $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']); } 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']['display']); $this->assertTrue($availability['capabilities']['change_quantity']); } }