2026-10-01 10:50:32 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
|
|
use App\Actions\Orders\FinalizeOrder;
|
|
|
|
|
use App\Actions\Orders\FinalizeOrderInput;
|
|
|
|
|
use Domain\Builders\OrderBuilderCompleted;
|
|
|
|
|
use Domain\Enums\OrderStatus;
|
|
|
|
|
use Domain\Models\Entities\Order;
|
|
|
|
|
use Domain\Models\ValueObjects\DeliveryAddress;
|
|
|
|
|
use Domain\Models\ValueObjects\Entities\OrderId;
|
|
|
|
|
use Domain\Models\ValueObjects\Entities\ShopId;
|
|
|
|
|
use Domain\Models\ValueObjects\Matricule;
|
|
|
|
|
use Domain\Models\ValueObjects\OrderEmployee;
|
|
|
|
|
use Domain\Models\ValueObjects\OrderReference;
|
|
|
|
|
use Domain\Models\ValueObjects\PickupTimeSlot;
|
2026-10-02 12:14:48 +02:00
|
|
|
use Domain\Models\ValueObjects\ShopperEstablishmentCode;
|
|
|
|
|
use Domain\Models\ValueObjects\ShopperServiceCode;
|
|
|
|
|
use Domain\Models\ValueObjects\ShopperSiteCode;
|
2026-10-01 10:50:32 +02:00
|
|
|
use Domain\Services\OrderTunnelService;
|
|
|
|
|
use Money\Money;
|
|
|
|
|
use Ramsey\Uuid\Uuid;
|
|
|
|
|
|
|
|
|
|
describe('FinalizeOrder', function (): void {
|
|
|
|
|
it('finalizes order and returns reference via OrderTunnelService', function (): void {
|
|
|
|
|
// GIVEN
|
|
|
|
|
$input = new FinalizeOrderInput();
|
|
|
|
|
|
2026-10-03 10:51:42 +02:00
|
|
|
$orderReference = new OrderReference(Uuid::uuid7());
|
2026-10-01 10:50:32 +02:00
|
|
|
$builder = \Mockery::mock(OrderBuilderCompleted::class);
|
|
|
|
|
$order = new Order(
|
|
|
|
|
id: new OrderId(Uuid::uuid7()),
|
|
|
|
|
shopId: new ShopId(Uuid::uuid7()),
|
|
|
|
|
reference: $orderReference,
|
|
|
|
|
employee: new OrderEmployee(
|
2026-10-02 12:14:48 +02:00
|
|
|
matricule: new Matricule('1234567'),
|
2026-10-01 10:50:32 +02:00
|
|
|
firstname: 'Jean',
|
|
|
|
|
lastname: 'Dupont',
|
2026-10-02 12:14:48 +02:00
|
|
|
facility: new ShopperEstablishmentCode('ETAB01'),
|
|
|
|
|
site: new ShopperSiteCode('SITEA'),
|
|
|
|
|
service: new ShopperServiceCode('101'),
|
2026-10-01 10:50:32 +02:00
|
|
|
),
|
|
|
|
|
deliveryAddress: new DeliveryAddress(
|
|
|
|
|
name: 'Shop',
|
|
|
|
|
address: '1 rue Test',
|
|
|
|
|
postcode: '75001',
|
|
|
|
|
city: 'Paris',
|
|
|
|
|
),
|
|
|
|
|
pickupTimeSlot: new PickupTimeSlot(now(), new \DateInterval('PT1H')),
|
|
|
|
|
status: OrderStatus::WAITING,
|
|
|
|
|
total: Money::EUR(1000),
|
|
|
|
|
lines: [],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$orderTunnelService = \Mockery::mock(OrderTunnelService::class);
|
|
|
|
|
$orderTunnelService->shouldReceive('getBuilderCompletedOrFail')
|
|
|
|
|
->once()
|
|
|
|
|
->andReturn($builder);
|
|
|
|
|
$orderTunnelService->shouldReceive('finalizeOrder')
|
|
|
|
|
->once()
|
|
|
|
|
->with($builder)
|
|
|
|
|
->andReturn($order);
|
|
|
|
|
|
|
|
|
|
$action = new FinalizeOrder($orderTunnelService);
|
|
|
|
|
|
|
|
|
|
// WHEN
|
|
|
|
|
$result = $action($input);
|
|
|
|
|
|
|
|
|
|
// THEN
|
|
|
|
|
expect($result)->toBeInstanceOf(OrderReference::class)
|
|
|
|
|
->and($result->value)->toBe($orderReference->value);
|
|
|
|
|
});
|
|
|
|
|
});
|