58 lines
2.2 KiB
PHP
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);
|
|
});
|
|
});
|