diff --git a/tests/Feature/Catalog/CatalogControllerTest.php b/tests/Feature/Catalog/CatalogControllerTest.php index 51da7de..8ce7b33 100644 --- a/tests/Feature/Catalog/CatalogControllerTest.php +++ b/tests/Feature/Catalog/CatalogControllerTest.php @@ -72,11 +72,11 @@ class CatalogControllerTest extends TestCase ->assertJsonPath('0.items.0.nombre', 'Variants') ->assertJsonPath('0.items.0.descripcion', 'Variants description') ->assertJsonPath('0.items.0.precio', '100.00') - ->assertJsonPath('0.items.0.availability.subject', 'product') + ->assertJsonPath('0.items.0.availability.state', 'visible') ->assertJsonPath('0.items.0.availability.maximum_quantity', 7) ->assertJsonCount(2, '0.items.0.variants') ->assertJsonPath('0.items.0.variants.0.availability.maximum_quantity', 4) - ->assertJsonPath('0.items.0.variants.0.availability.subject', 'variant') + ->assertJsonPath('0.items.0.variants.0.availability.state', 'visible') ->assertJsonPath('0.items.0.variants.1.availability.maximum_quantity', 3) ->assertJsonPath('1.title', 'Row') ->assertJsonPath('1.items.data.0.availability.maximum_quantity', 8) @@ -115,20 +115,16 @@ class CatalogControllerTest extends TestCase $this->actingAs($user, 'sanctum') ->getJson("/api/tenants/{$tenant->codigo}/catalog") ->assertOk() - ->assertJsonPath('0.items.0.variants.0.availability.maximum_quantity', 0) - ->assertJsonPath('0.items.0.variants.1.availability.maximum_quantity', 0) + ->assertJsonPath('0.items.0.availability.maximum_quantity', 0) + ->assertJsonPath('0.items.0.availability.allowed_actions', []) ->assertJsonPath( - '0.items.0.variants.0.availability.restrictions.0.message', + '0.items.0.availability.reasons.0.message', 'Alcanzaste el cupo máximo permitido para este producto.', ) - ->assertJsonPath( - '0.items.0.variants.1.availability.restrictions.0.message', - 'Alcanzaste el cupo máximo permitido para este producto.', - ) - ->assertJsonPath( - '0.items.0.variants.1.availability.capabilities.buy_now', - false, - ) + ->assertJsonPath('0.items.0.variants.0.availability.maximum_quantity', 8) + ->assertJsonPath('0.items.0.variants.1.availability.maximum_quantity', 9) + ->assertJsonCount(0, '0.items.0.variants.0.availability.reasons') + ->assertJsonCount(0, '0.items.0.variants.1.availability.reasons') ->assertJsonMissingPath('0.items.0.variants.0.stock_tecnico') ->assertJsonMissingPath('0.items.0.variants.1.stock_tecnico'); } @@ -163,7 +159,7 @@ class CatalogControllerTest extends TestCase ->assertOk() ->assertJsonCount(1, '0.items') ->assertJsonPath('0.items.0.nombre', 'Available') - ->assertJsonCount(0, '0.items.0.availability.restrictions'); + ->assertJsonCount(0, '0.items.0.availability.reasons'); } public function test_column_with_image_uses_item_image_then_variant_image_then_null(): void diff --git a/tests/Feature/Catalog/CatalogItemDetailControllerTest.php b/tests/Feature/Catalog/CatalogItemDetailControllerTest.php index 385d365..8b5d67e 100644 --- a/tests/Feature/Catalog/CatalogItemDetailControllerTest.php +++ b/tests/Feature/Catalog/CatalogItemDetailControllerTest.php @@ -82,7 +82,7 @@ class CatalogItemDetailControllerTest extends TestCase ->assertOk() ->assertJsonCount(1, 'data.variants') ->assertJsonPath('data.variants.0.id', $secondVariant->id) - ->assertJsonPath('data.variants.0.availability.subject', 'variant') + ->assertJsonPath('data.variants.0.availability.state', 'visible') ->assertJsonPath('data.selected_variant.id', $secondVariant->id) ->assertJsonPath('data.selected_variant.availability.maximum_quantity', 6) ->assertJsonMissingPath('data.selected_variant.stock_tecnico') @@ -360,6 +360,9 @@ class CatalogItemDetailControllerTest extends TestCase ->assertJsonPath('data.resolved_variant', null) ->assertJsonCount(3, 'data.variants') ->assertJsonPath('data.variants.0.id', $first->id) + ->assertJsonPath('data.variants.0.availability.state', 'visible') + ->assertJsonPath('data.variants.0.availability.maximum_quantity', 1) + ->assertJsonPath('data.variants.0.availability.allowed_actions.2', 'add_to_cart') ->assertJsonPath('data.variants.0.values.sector.value', 'A') ->assertJsonPath('data.variants.0.values.seat.value', '1') ->assertJsonCount(2, 'data.selectors') @@ -427,7 +430,9 @@ class CatalogItemDetailControllerTest extends TestCase ->assertOk() ->assertJsonPath('data.selected_values.sector', 'VIP') ->assertJsonPath('data.selected_values.seat', 'A-12') - ->assertJsonPath('data.resolved_variant.id', $variant->id); + ->assertJsonPath('data.resolved_variant.id', $variant->id) + ->assertJsonPath('data.resolved_variant.availability.state', 'hidden') + ->assertJsonMissingPath('data.resolved_variant.availability.allowed_actions'); } private function createItem( diff --git a/tests/Unit/Catalog/CatalogItemAllowanceServiceTest.php b/tests/Unit/Catalog/CatalogItemAllowanceServiceTest.php index 2342261..629edcc 100644 --- a/tests/Unit/Catalog/CatalogItemAllowanceServiceTest.php +++ b/tests/Unit/Catalog/CatalogItemAllowanceServiceTest.php @@ -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']); } }