test that carrier email is unique

This commit is contained in:
Yisroel Baum 2025-11-18 09:22:13 +02:00
parent 908baee2a7
commit 2d8bca1a07
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
4 changed files with 60 additions and 0 deletions

View file

@ -5,6 +5,7 @@ namespace FreightQuote\Carrier;
interface CarrierRepository interface CarrierRepository
{ {
public function find(int $id): ?Carrier; public function find(int $id): ?Carrier;
public function findByEmail(string $email): ?Carrier;
public function save(Carrier $carrier): Carrier; public function save(Carrier $carrier): Carrier;
/** /**

View file

@ -4,6 +4,7 @@ namespace FreightQuote\Carrier\UseCases;
use FreightQuote\Carrier\Carrier; use FreightQuote\Carrier\Carrier;
use FreightQuote\Carrier\CarrierRepository; use FreightQuote\Carrier\CarrierRepository;
use InvalidArgumentException;
class CreateCarrier class CreateCarrier
{ {
@ -13,6 +14,9 @@ class CreateCarrier
public function execute(CreateCarrierRequest $dto): Carrier public function execute(CreateCarrierRequest $dto): Carrier
{ {
if ($this->carrierRepo->findByEmail($dto->email) !== null) {
throw new InvalidArgumentException();
}
$carrier = new Carrier( $carrier = new Carrier(
null, null,
$dto->email, $dto->email,

View file

@ -73,4 +73,24 @@ class FakeCarrierRepository implements CarrierRepository
); );
}, $this->existingCarriers); }, $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;
}
} }

View file

@ -3,6 +3,7 @@
namespace Tests\Unit\Carrier\UseCases; namespace Tests\Unit\Carrier\UseCases;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use InvalidArgumentException;
use Tests\Fakes\Carrier\FakeCarrierRepository; use Tests\Fakes\Carrier\FakeCarrierRepository;
use FreightQuote\Carrier\UseCases\CreateCarrier; use FreightQuote\Carrier\UseCases\CreateCarrier;
use FreightQuote\Carrier\UseCases\CreateCarrierRequest; use FreightQuote\Carrier\UseCases\CreateCarrierRequest;
@ -39,4 +40,38 @@ class CreateCarrierTest extends TestCase
$this->assertEquals($loadProfile, $foundCarrier->getLoadProfile()); $this->assertEquals($loadProfile, $foundCarrier->getLoadProfile());
$this->assertEquals($countriesServing, $foundCarrier->getCountriesServing()); $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);
}
} }