ldc-boutique-cnc-sable/tests/Unit/Domain/Builders/OrderBuilderTest.php
2026-10-27 09:58:12 +01:00

58 lines
2.2 KiB
PHP

<?php
declare(strict_types=1);
use Domain\Builders\OrderBuilder;
use Domain\Builders\OrderBuilderCompleted;
use Domain\Builders\OrderBuilderType;
use Domain\Builders\OrderBuilderWithBasket;
use Domain\Models\Entities\Basket;
use Domain\Models\ValueObjects\Entities\BasketId;
use Domain\Models\ValueObjects\Entities\ShopId;
use Domain\Models\ValueObjects\Entities\ShopperId;
use Domain\Models\ValueObjects\PickupTimeSlot;
use Ramsey\Uuid\Uuid;
describe('OrderBuilder', function (): void {
it('initializes from basket with the correct state', function (): void {
// GIVEN
$basketId = new BasketId(Uuid::uuid7());
$basket = new Basket($basketId);
$customerId = new ShopperId(Uuid::uuid7());
// WHEN
$builder = OrderBuilder::fromBasket($basket, $customerId);
// THEN
expect($builder)
->toBeInstanceOf(OrderBuilderWithBasket::class)
->and($builder->getBuilderType())->toBe(OrderBuilderType::FROM_BASKET)
->and($builder->isFromBasket())->toBeTrue()
->and($builder->isCompleted())->toBeFalse()
->and($builder->getBasket())->toBe($basket)
->and($builder->getShopperId())->toBe($customerId);
});
it('transitions to with_pickup state when adding a timeslot', function (): void {
// GIVEN
$basketId = new BasketId(Uuid::uuid7());
$basket = new Basket($basketId);
$customerId = new ShopperId(Uuid::uuid7());
$shopId = new ShopId(Uuid::uuid7());
$timeSlot = new PickupTimeSlot(new \DateTimeImmutable(), new \DateInterval('PT1H'));
$builder = OrderBuilder::fromBasket($basket, $customerId);
// WHEN
$completedBuilder = $builder->withPickupTimeSlot($shopId, $timeSlot);
// THEN
expect($completedBuilder)
->toBeInstanceOf(OrderBuilderCompleted::class)
->and($completedBuilder->getBuilderType())->toBe(OrderBuilderType::WITH_PICKUP)
->and($completedBuilder->isFromBasket())->toBeTrue()
->and($completedBuilder->isCompleted())->toBeTrue()
->and($completedBuilder->getShopId())->toBe($shopId)
->and($completedBuilder->getPickupTimeSlot())->toBe($timeSlot);
});
});