test(casts): add tests for ShopperEstablishmentCodeCast functionality test(casts): add tests for ShopperServiceCodeCast functionality test(casts): add tests for ShopperSiteCodeCast functionality test(dto): update ProductDtoTest to include additional fields test(dto): update SettingDtoTest to remove arcadiaSites assertions test(events): update AnOrderHasBeenPlacedTest to use value objects test(entities): update OrderTest to use value objects for employee details test(value-objects): update EmployeeUpsertDataTest to use value objects test(pagination): update PaginationTest to access value properties test(services): update AppCustomerAuthServiceTest to use CrmHashcode test(services): update CrmServiceTest to use CrmHashcode for customer retrieval
135 lines
5.2 KiB
PHP
135 lines
5.2 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(\Symfony\Component\Uid\Uuid::v7()->toBase58()),
|
|
'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(\Symfony\Component\Uid\Uuid::v7()->toBase58()),
|
|
'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(\Symfony\Component\Uid\Uuid::v7()->toBase58()),
|
|
'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();
|
|
});
|
|
});
|