ldc-boutique-cnc-sable/tests/Unit/App/Actions/Orders/FinalizeOrderTest.php

73 lines
2.6 KiB
PHP

<?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;
use Domain\Models\ValueObjects\ShopperEstablishmentCode;
use Domain\Models\ValueObjects\ShopperServiceCode;
use Domain\Models\ValueObjects\ShopperSiteCode;
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();
$orderReference = new OrderReference(Uuid::uuid7());
$builder = \Mockery::mock(OrderBuilderCompleted::class);
$order = new Order(
id: new OrderId(Uuid::uuid7()),
shopId: new ShopId(Uuid::uuid7()),
reference: $orderReference,
employee: new OrderEmployee(
matricule: new Matricule('1234567'),
firstname: 'Jean',
lastname: 'Dupont',
facility: new ShopperEstablishmentCode('ETAB01'),
site: new ShopperSiteCode('SITEA'),
service: new ShopperServiceCode('101'),
),
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);
});
});