ldc-boutique-cnc-sable/tests/Integration/WithApp/App/Services/OrderServiceTest.php

135 lines
5.1 KiB
PHP

<?php
declare(strict_types=1);
use App\Models\Customer;
use App\Models\Employee;
use App\Models\Order;
use App\Services\OrderService;
use Carbon\CarbonImmutable;
use Domain\Enums\OrderStatus;
use Domain\Models\ValueObjects\Code;
use Domain\Models\ValueObjects\DeliveryAddress;
use Domain\Models\ValueObjects\Email;
use Domain\Models\ValueObjects\Matricule;
use Domain\Models\ValueObjects\OrderEmployee;
use Domain\Models\ValueObjects\OrderReference;
use Domain\Models\ValueObjects\ShopperEstablishmentCode;
use Domain\Models\ValueObjects\ShopperServiceCode;
use Domain\Models\ValueObjects\ShopperSiteCode;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Money\Currency;
use Money\Money;
use Ramsey\Uuid\Uuid;
uses(RefreshDatabase::class);
covers(OrderService::class);
describe('OrderService', function () {
it('returns true if order is owned by customer', function () {
// GIVEN
$customer = Customer::forceCreate([
'id' => Uuid::uuid7()->toString(),
'hashcode' => Uuid::uuid4()->toString(),
'email' => new Email('owner@example.com'),
]);
Employee::forceCreate([
'id' => 301,
'customer_id' => $customer->id,
'matricule' => new Matricule('1000301'),
'nom' => 'Doe',
'prenom' => 'John',
'code' => new Code('ABCDEF31'),
'etablissement' => 'ETAB',
'site' => 'SITE',
'service' => '101',
'created_at' => CarbonImmutable::now(),
'updated_at' => CarbonImmutable::now(),
]);
$order = Order::forceCreate([
'id' => Uuid::uuid7()->toString(),
'reference' => new OrderReference(Uuid::uuid7()),
'status' => OrderStatus::VALIDATED->value,
'total' => new Money(1000, new Currency('EUR')),
'employee' => new OrderEmployee(new Matricule('1000301'), 'John', 'Doe', new ShopperEstablishmentCode('FAC01'), new ShopperSiteCode('SITE'), new ShopperServiceCode('101')),
'delivery_address' => new DeliveryAddress('Name', 'Addr', '00000', 'City'),
]);
$service = new OrderService();
// WHEN
$result = $service->isOrderOwnedBy($order, $customer);
// THEN
expect($result)->toBeTrue();
});
it('returns false if order is not owned by customer', function () {
// GIVEN
$customer = Customer::forceCreate([
'id' => Uuid::uuid7()->toString(),
'hashcode' => Uuid::uuid4()->toString(),
'email' => new Email('notowner@example.com'),
]);
Employee::forceCreate([
'id' => 302,
'customer_id' => $customer->id,
'matricule' => new Matricule('1000302'),
'nom' => 'Doe',
'prenom' => 'John',
'code' => new Code('ABCDEF32'),
'etablissement' => 'ETAB',
'site' => 'SITE',
'service' => '101',
'created_at' => CarbonImmutable::now(),
'updated_at' => CarbonImmutable::now(),
]);
$order = Order::forceCreate([
'id' => Uuid::uuid7()->toString(),
'reference' => new OrderReference(Uuid::uuid7()),
'status' => OrderStatus::VALIDATED->value,
'total' => new Money(1000, new Currency('EUR')),
'employee' => new OrderEmployee(new Matricule('1000999'), 'Other', 'Person', new ShopperEstablishmentCode('FAC01'), new ShopperSiteCode('SITE'), new ShopperServiceCode('101')),
'delivery_address' => new DeliveryAddress('Name', 'Addr', '00000', 'City'),
]);
$service = new OrderService();
// WHEN
$result = $service->isOrderOwnedBy($order, $customer);
// THEN
expect($result)->toBeFalse();
});
it('returns false if customer has no employee', function () {
// GIVEN
$customer = Customer::forceCreate([
'id' => Uuid::uuid7()->toString(),
'hashcode' => Uuid::uuid4()->toString(),
'email' => new Email('noemp@example.com'),
]);
$order = Order::forceCreate([
'id' => Uuid::uuid7()->toString(),
'reference' => new OrderReference(Uuid::uuid7()),
'status' => OrderStatus::VALIDATED->value,
'total' => new Money(1000, new Currency('EUR')),
'employee' => new OrderEmployee(new Matricule('1000999'), 'Other', 'Person', new ShopperEstablishmentCode('FAC01'), new ShopperSiteCode('SITE'), new ShopperServiceCode('101')),
'delivery_address' => new DeliveryAddress('Name', 'Addr', '00000', 'City'),
]);
$service = new OrderService();
// WHEN
$result = $service->isOrderOwnedBy($order, $customer);
// THEN
expect($result)->toBeFalse();
});
});