From 2d8bca1a078e6780367766212b2a538c25c96ecc Mon Sep 17 00:00:00 2001 From: Yisroel Baum Date: Tue, 18 Nov 2025 09:22:13 +0200 Subject: [PATCH] test that carrier email is unique --- src/Carrier/CarrierRepository.php | 1 + src/Carrier/UseCases/CreateCarrier.php | 4 +++ tests/Fakes/Carrier/FakeCarrierRepository.php | 20 +++++++++++ .../Carrier/UseCases/CreateCarrierTest.php | 35 +++++++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/src/Carrier/CarrierRepository.php b/src/Carrier/CarrierRepository.php index 6361c33..308c519 100644 --- a/src/Carrier/CarrierRepository.php +++ b/src/Carrier/CarrierRepository.php @@ -5,6 +5,7 @@ namespace FreightQuote\Carrier; interface CarrierRepository { public function find(int $id): ?Carrier; + public function findByEmail(string $email): ?Carrier; public function save(Carrier $carrier): Carrier; /** diff --git a/src/Carrier/UseCases/CreateCarrier.php b/src/Carrier/UseCases/CreateCarrier.php index c40a6d7..b4ff1ed 100644 --- a/src/Carrier/UseCases/CreateCarrier.php +++ b/src/Carrier/UseCases/CreateCarrier.php @@ -4,6 +4,7 @@ namespace FreightQuote\Carrier\UseCases; use FreightQuote\Carrier\Carrier; use FreightQuote\Carrier\CarrierRepository; +use InvalidArgumentException; class CreateCarrier { @@ -13,6 +14,9 @@ class CreateCarrier public function execute(CreateCarrierRequest $dto): Carrier { + if ($this->carrierRepo->findByEmail($dto->email) !== null) { + throw new InvalidArgumentException(); + } $carrier = new Carrier( null, $dto->email, diff --git a/tests/Fakes/Carrier/FakeCarrierRepository.php b/tests/Fakes/Carrier/FakeCarrierRepository.php index 04ebbd3..2601f12 100644 --- a/tests/Fakes/Carrier/FakeCarrierRepository.php +++ b/tests/Fakes/Carrier/FakeCarrierRepository.php @@ -73,4 +73,24 @@ class FakeCarrierRepository implements CarrierRepository ); }, $this->existingCarriers); } + + public function findByEmail(string $email): ?Carrier + { + foreach ($this->existingCarriers as $carrier) { + if ($carrier->getEmail() === $email) { + return new Carrier( + $carrier->getId(), + $email, + $carrier->getCompanyName(), + $carrier->getContactPerson(), + $carrier->getPhoneNumber(), + $carrier->getNotes(), + $carrier->getLoadProfile(), + $carrier->getCountriesServing(), + ); + } + } + + return null; + } } diff --git a/tests/Unit/Carrier/UseCases/CreateCarrierTest.php b/tests/Unit/Carrier/UseCases/CreateCarrierTest.php index 34f8526..ccd60b9 100644 --- a/tests/Unit/Carrier/UseCases/CreateCarrierTest.php +++ b/tests/Unit/Carrier/UseCases/CreateCarrierTest.php @@ -3,6 +3,7 @@ namespace Tests\Unit\Carrier\UseCases; use PHPUnit\Framework\TestCase; +use InvalidArgumentException; use Tests\Fakes\Carrier\FakeCarrierRepository; use FreightQuote\Carrier\UseCases\CreateCarrier; use FreightQuote\Carrier\UseCases\CreateCarrierRequest; @@ -39,4 +40,38 @@ class CreateCarrierTest extends TestCase $this->assertEquals($loadProfile, $foundCarrier->getLoadProfile()); $this->assertEquals($countriesServing, $foundCarrier->getCountriesServing()); } + + public function test_email_is_unique(): void + { + $this->expectException(InvalidArgumentException::class); + $email = 'joe@shmoe.com'; + $company = 'test company'; + $contactPerson = 'Joe Shmoe'; + $phoneNumber = '132456798'; + $notes = 'some notes'; + $loadProfile = 'LTL/FTL'; // Less than full trailer load and full trailer load + $countriesServing = ['USA', 'FRA', 'UK']; + $carrierRepo = new FakeCarrierRepository(); + $dto1 = new CreateCarrierRequest( + $email, + $company, + $contactPerson, + $phoneNumber, + $notes, + $loadProfile, + $countriesServing, + ); + $dto2 = new CreateCarrierRequest( + $email, + $company, + $contactPerson, + $phoneNumber, + $notes, + $loadProfile, + $countriesServing, + ); + $useCase = new CreateCarrier($carrierRepo); + $useCase->execute($dto1); + $useCase->execute($dto2); + } }