test(catalog): cover global availability decisions
This commit is contained in:
@@ -72,11 +72,11 @@ class CatalogControllerTest extends TestCase
|
|||||||
->assertJsonPath('0.items.0.nombre', 'Variants')
|
->assertJsonPath('0.items.0.nombre', 'Variants')
|
||||||
->assertJsonPath('0.items.0.descripcion', 'Variants description')
|
->assertJsonPath('0.items.0.descripcion', 'Variants description')
|
||||||
->assertJsonPath('0.items.0.precio', '100.00')
|
->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)
|
->assertJsonPath('0.items.0.availability.maximum_quantity', 7)
|
||||||
->assertJsonCount(2, '0.items.0.variants')
|
->assertJsonCount(2, '0.items.0.variants')
|
||||||
->assertJsonPath('0.items.0.variants.0.availability.maximum_quantity', 4)
|
->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('0.items.0.variants.1.availability.maximum_quantity', 3)
|
||||||
->assertJsonPath('1.title', 'Row')
|
->assertJsonPath('1.title', 'Row')
|
||||||
->assertJsonPath('1.items.data.0.availability.maximum_quantity', 8)
|
->assertJsonPath('1.items.data.0.availability.maximum_quantity', 8)
|
||||||
@@ -115,20 +115,16 @@ class CatalogControllerTest extends TestCase
|
|||||||
$this->actingAs($user, 'sanctum')
|
$this->actingAs($user, 'sanctum')
|
||||||
->getJson("/api/tenants/{$tenant->codigo}/catalog")
|
->getJson("/api/tenants/{$tenant->codigo}/catalog")
|
||||||
->assertOk()
|
->assertOk()
|
||||||
->assertJsonPath('0.items.0.variants.0.availability.maximum_quantity', 0)
|
->assertJsonPath('0.items.0.availability.maximum_quantity', 0)
|
||||||
->assertJsonPath('0.items.0.variants.1.availability.maximum_quantity', 0)
|
->assertJsonPath('0.items.0.availability.allowed_actions', [])
|
||||||
->assertJsonPath(
|
->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.',
|
'Alcanzaste el cupo máximo permitido para este producto.',
|
||||||
)
|
)
|
||||||
->assertJsonPath(
|
->assertJsonPath('0.items.0.variants.0.availability.maximum_quantity', 8)
|
||||||
'0.items.0.variants.1.availability.restrictions.0.message',
|
->assertJsonPath('0.items.0.variants.1.availability.maximum_quantity', 9)
|
||||||
'Alcanzaste el cupo máximo permitido para este producto.',
|
->assertJsonCount(0, '0.items.0.variants.0.availability.reasons')
|
||||||
)
|
->assertJsonCount(0, '0.items.0.variants.1.availability.reasons')
|
||||||
->assertJsonPath(
|
|
||||||
'0.items.0.variants.1.availability.capabilities.buy_now',
|
|
||||||
false,
|
|
||||||
)
|
|
||||||
->assertJsonMissingPath('0.items.0.variants.0.stock_tecnico')
|
->assertJsonMissingPath('0.items.0.variants.0.stock_tecnico')
|
||||||
->assertJsonMissingPath('0.items.0.variants.1.stock_tecnico');
|
->assertJsonMissingPath('0.items.0.variants.1.stock_tecnico');
|
||||||
}
|
}
|
||||||
@@ -163,7 +159,7 @@ class CatalogControllerTest extends TestCase
|
|||||||
->assertOk()
|
->assertOk()
|
||||||
->assertJsonCount(1, '0.items')
|
->assertJsonCount(1, '0.items')
|
||||||
->assertJsonPath('0.items.0.nombre', 'Available')
|
->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
|
public function test_column_with_image_uses_item_image_then_variant_image_then_null(): void
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ class CatalogItemDetailControllerTest extends TestCase
|
|||||||
->assertOk()
|
->assertOk()
|
||||||
->assertJsonCount(1, 'data.variants')
|
->assertJsonCount(1, 'data.variants')
|
||||||
->assertJsonPath('data.variants.0.id', $secondVariant->id)
|
->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.id', $secondVariant->id)
|
||||||
->assertJsonPath('data.selected_variant.availability.maximum_quantity', 6)
|
->assertJsonPath('data.selected_variant.availability.maximum_quantity', 6)
|
||||||
->assertJsonMissingPath('data.selected_variant.stock_tecnico')
|
->assertJsonMissingPath('data.selected_variant.stock_tecnico')
|
||||||
@@ -360,6 +360,9 @@ class CatalogItemDetailControllerTest extends TestCase
|
|||||||
->assertJsonPath('data.resolved_variant', null)
|
->assertJsonPath('data.resolved_variant', null)
|
||||||
->assertJsonCount(3, 'data.variants')
|
->assertJsonCount(3, 'data.variants')
|
||||||
->assertJsonPath('data.variants.0.id', $first->id)
|
->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.sector.value', 'A')
|
||||||
->assertJsonPath('data.variants.0.values.seat.value', '1')
|
->assertJsonPath('data.variants.0.values.seat.value', '1')
|
||||||
->assertJsonCount(2, 'data.selectors')
|
->assertJsonCount(2, 'data.selectors')
|
||||||
@@ -427,7 +430,9 @@ class CatalogItemDetailControllerTest extends TestCase
|
|||||||
->assertOk()
|
->assertOk()
|
||||||
->assertJsonPath('data.selected_values.sector', 'VIP')
|
->assertJsonPath('data.selected_values.sector', 'VIP')
|
||||||
->assertJsonPath('data.selected_values.seat', 'A-12')
|
->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(
|
private function createItem(
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
namespace Tests\Unit\Catalog;
|
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\Catalog\Services\CatalogItemAllowanceService;
|
||||||
use App\Domains\Purchase\Services\UserPurchaseLimitService;
|
use App\Domains\Purchase\Services\UserPurchaseLimitService;
|
||||||
use Mockery;
|
use Mockery;
|
||||||
@@ -10,70 +10,65 @@ use Tests\TestCase;
|
|||||||
|
|
||||||
class CatalogItemAllowanceServiceTest extends 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(
|
$availability = $this->service()->availability(0, 0)->toArray();
|
||||||
Mockery::mock(UserPurchaseLimitService::class),
|
|
||||||
);
|
|
||||||
|
|
||||||
$availability = $service->availability(0, 0, AvailabilitySubject::Variant);
|
$this->assertSame('hidden', $availability['state']);
|
||||||
|
|
||||||
$this->assertSame('variant', $availability['subject']);
|
|
||||||
$this->assertSame(0, $availability['maximum_quantity']);
|
|
||||||
$this->assertSame(
|
$this->assertSame(
|
||||||
['user_quota_reached', 'out_of_stock'],
|
['user_quota_reached', 'out_of_stock'],
|
||||||
array_column($availability['restrictions'], 'code'),
|
array_column($availability['reasons'], 'code'),
|
||||||
);
|
);
|
||||||
$this->assertSame([
|
$this->assertArrayNotHasKey('maximum_quantity', $availability);
|
||||||
'display' => false,
|
$this->assertArrayNotHasKey('allowed_actions', $availability);
|
||||||
'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
|
public function test_an_available_decision_keeps_all_actions(): void
|
||||||
{
|
{
|
||||||
$service = new CatalogItemAllowanceService(
|
$availability = $this->service()->availability(5, 3)->toArray();
|
||||||
Mockery::mock(UserPurchaseLimitService::class),
|
|
||||||
);
|
|
||||||
|
|
||||||
$availability = $service->availability(5, 3);
|
$this->assertSame('visible', $availability['state']);
|
||||||
|
|
||||||
$this->assertSame('product', $availability['subject']);
|
|
||||||
$this->assertSame(3, $availability['maximum_quantity']);
|
$this->assertSame(3, $availability['maximum_quantity']);
|
||||||
$this->assertSame([], $availability['restrictions']);
|
$this->assertSame([], $availability['reasons']);
|
||||||
$this->assertNotContains(false, $availability['capabilities'], true);
|
$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(
|
$availability = $this->service()->availability(5, 0)->toArray();
|
||||||
Mockery::mock(UserPurchaseLimitService::class),
|
|
||||||
);
|
|
||||||
|
|
||||||
$availability = $service->availability(5, 0);
|
$this->assertSame('visible', $availability['state']);
|
||||||
|
$this->assertSame([], $availability['allowed_actions']);
|
||||||
$this->assertTrue($availability['capabilities']['display']);
|
$this->assertSame('user_quota_reached', $availability['reasons'][0]['code']);
|
||||||
$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
|
public function test_exceeding_the_remaining_quota_allows_the_quantity_to_be_corrected(): void
|
||||||
{
|
{
|
||||||
$service = new CatalogItemAllowanceService(
|
$availability = $this->service()
|
||||||
Mockery::mock(UserPurchaseLimitService::class),
|
->purchaseLimitExceededAvailability(1, 'Solo podés agregar una unidad.')
|
||||||
);
|
->toArray();
|
||||||
|
|
||||||
$availability = $service->purchaseLimitExceededAvailability(1, 'Solo podés agregar una unidad.');
|
|
||||||
|
|
||||||
$this->assertSame(1, $availability['maximum_quantity']);
|
$this->assertSame(1, $availability['maximum_quantity']);
|
||||||
$this->assertSame(
|
$this->assertSame(
|
||||||
'requested_quantity_exceeds_user_quota',
|
'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']);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user