test bid is created with a freight order

This commit is contained in:
Yisroel Baum 2025-11-17 22:33:53 +02:00
parent d6b3b4b59e
commit 773f438cc1
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
3 changed files with 76 additions and 5 deletions

View file

@ -2,6 +2,8 @@
namespace FreightQuote\FreightOrder\UseCases; namespace FreightQuote\FreightOrder\UseCases;
use FreightQuote\Bid\Bid;
use FreightQuote\Bid\BidRepository;
use FreightQuote\Carrier\Carrier; use FreightQuote\Carrier\Carrier;
use FreightQuote\Carrier\CarrierRepository; use FreightQuote\Carrier\CarrierRepository;
use FreightQuote\Email\Email; use FreightQuote\Email\Email;
@ -14,6 +16,7 @@ class CreateFreightOrder
public function __construct( public function __construct(
private FreightOrderRepository $freightOrderRepo, private FreightOrderRepository $freightOrderRepo,
private CarrierRepository $carrierRepo, private CarrierRepository $carrierRepo,
private BidRepository $bidRepo,
private Emailer $emailer, private Emailer $emailer,
) {} ) {}
@ -21,26 +24,51 @@ class CreateFreightOrder
CreateFreightOrderRequestDTO $dto, CreateFreightOrderRequestDTO $dto,
): CreateFreightOrderResponseDTO { ): CreateFreightOrderResponseDTO {
$savedFreightOrder = $this->saveFreightOrder($dto); $savedFreightOrder = $this->saveFreightOrder($dto);
$this->handleCarrierActions( $bidsCreated = $this->handleCarrierActions(
$dto->carrierIds, $dto->carrierIds,
$savedFreightOrder, $savedFreightOrder,
); );
return new CreateFreightOrderResponseDTO($savedFreightOrder); return new CreateFreightOrderResponseDTO(
$savedFreightOrder,
$bidsCreated
);
} }
/** /**
* @param int[] $carrierIds * @param int[] $carrierIds
* @return Bid[]
*/ */
private function handleCarrierActions( private function handleCarrierActions(
array $carrierIds, array $carrierIds,
FreightOrder $freightOrder FreightOrder $freightOrder,
): void { ): array {
$bidsCreated = [];
foreach ($carrierIds as $carrierId) { foreach ($carrierIds as $carrierId) {
$carrier = $this->carrierRepo->find($carrierId); $carrier = $this->carrierRepo->find($carrierId);
$this->updateCarrierOrderIds($carrier, $freightOrder->getId()); $freightOrderId = $freightOrder->getId();
$this->updateCarrierOrderIds($carrier, $freightOrderId);
$this->sendEmail($carrier->getEmail(), $freightOrder); $this->sendEmail($carrier->getEmail(), $freightOrder);
$bidsCreated[] = $this->createBid(
$freightOrderId,
$carrier->getId(),
);
} }
return $bidsCreated;
}
private function createBid(
int $freightOrderId,
int $carrierId
): Bid {
return $this->bidRepo->save(
new Bid(
id: null,
freightOrderId: $freightOrderId,
carrierId: $carrierId,
)
);
} }
private function sendEmail(string $emailAddress, FreightOrder $freightOrder): void private function sendEmail(string $emailAddress, FreightOrder $freightOrder): void

View file

@ -6,7 +6,11 @@ use FreightQuote\FreightOrder\FreightOrder;
class CreateFreightOrderResponseDTO class CreateFreightOrderResponseDTO
{ {
/**
* @param Bid[] $bidsCreated
*/
public function __construct( public function __construct(
public FreightOrder $freightOrder, public FreightOrder $freightOrder,
public array $bidsCreated,
) {} ) {}
} }

View file

@ -2,6 +2,7 @@
namespace Tests\Unit\FreightOrder\UseCases; namespace Tests\Unit\FreightOrder\UseCases;
use FreightQuote\Bid\Bid;
use Tests\Fakes\Email\FakeEmailer; use Tests\Fakes\Email\FakeEmailer;
use FreightQuote\Carrier\Carrier; use FreightQuote\Carrier\Carrier;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
@ -9,6 +10,7 @@ use FreightQuote\FreightOrder\UseCases\CreateFreightOrder;
use FreightQuote\FreightOrder\UseCases\CreateFreightOrderRequestDTO; use FreightQuote\FreightOrder\UseCases\CreateFreightOrderRequestDTO;
use Tests\Fakes\Carrier\FakeCarrierRepository; use Tests\Fakes\Carrier\FakeCarrierRepository;
use Tests\Fakes\FreightOrder\FakeFreightOrderRepository; use Tests\Fakes\FreightOrder\FakeFreightOrderRepository;
use Tests\Fakes\Bid\FakeBidRepository;
use DateTime; use DateTime;
class CreateFreightOrderTest extends TestCase class CreateFreightOrderTest extends TestCase
@ -16,6 +18,7 @@ class CreateFreightOrderTest extends TestCase
private FakeEmailer $emailer; private FakeEmailer $emailer;
private FakeFreightOrderRepository $freightOrderRepo; private FakeFreightOrderRepository $freightOrderRepo;
private FakeCarrierRepository $carrierRepo; private FakeCarrierRepository $carrierRepo;
private FakeBidRepository $bidRepo;
private CreateFreightOrder $useCase; private CreateFreightOrder $useCase;
public function setUp(): void public function setUp(): void
@ -23,9 +26,11 @@ class CreateFreightOrderTest extends TestCase
$this->emailer = new FakeEmailer(); $this->emailer = new FakeEmailer();
$this->freightOrderRepo = new FakeFreightOrderRepository(); $this->freightOrderRepo = new FakeFreightOrderRepository();
$this->carrierRepo = new FakeCarrierRepository(); $this->carrierRepo = new FakeCarrierRepository();
$this->bidRepo = new FakeBidRepository();
$this->useCase = new CreateFreightOrder( $this->useCase = new CreateFreightOrder(
$this->freightOrderRepo, $this->freightOrderRepo,
$this->carrierRepo, $this->carrierRepo,
$this->bidRepo,
$this->emailer, $this->emailer,
); );
} }
@ -118,4 +123,38 @@ class CreateFreightOrderTest extends TestCase
$this->useCase->execute($dto); $this->useCase->execute($dto);
$this->assertEquals(1, $this->emailer->getSentEmailCount()); $this->assertEquals(1, $this->emailer->getSentEmailCount());
} }
public function test_bid_is_created(): void
{
$carrierId = 0;
$this->carrierRepo->save(new Carrier(
id: $carrierId,
email: 'test@email.com',
companyName: 'company name',
contactPerson: 'person',
phoneNumber: '123456798',
notes: 'some notes',
loadProfile: 'LTL/FTL',
countriesServing: ['USA'],
freightOrderIds: [],
));
$dto = new CreateFreightOrderRequestDTO(
shipFrom: 'ny',
shipTo: 'nj',
pickupDate: new DateTime('+5 days'),
deliveryDeadline: new DateTime('+10 days'),
loadDetails: 'some details',
notes: 'some notes',
fileAttachments: ['path/to/file', 'another/path/file'],
carrierIds: [$carrierId],
);
$response = $this->useCase->execute($dto);
$bid = $response->bidsCreated[0];
$this->assertInstanceOf(Bid::class, $bid);
$this->assertEquals(
$response->freightOrder->getId(),
$bid->getFreightOrderId()
);
$this->assertEquals($carrierId, $bid->getCarrierId());
}
} }