add test for createneworderitems
This commit is contained in:
parent
8063e7bec9
commit
0c758749e0
2 changed files with 99 additions and 4 deletions
|
@ -19,12 +19,17 @@ final readonly class CreateNewOrderItems
|
||||||
public function __invoke(Order $order): void
|
public function __invoke(Order $order): void
|
||||||
{
|
{
|
||||||
new ArrayCollection($this->drinkTypeRepository->findWanted())->forAll(
|
new ArrayCollection($this->drinkTypeRepository->findWanted())->forAll(
|
||||||
fn (DrinkType $drinkType) => $order
|
function (int $index, DrinkType $drinkType) use ($order) {
|
||||||
->addOrderItem(
|
$quantity = $drinkType->getWantedStock() - $drinkType->getCurrentStock();
|
||||||
|
if ($quantity > 0) {
|
||||||
|
$order->addOrderItem(
|
||||||
new OrderItem()
|
new OrderItem()
|
||||||
->setDrinkType($drinkType)
|
->setDrinkType($drinkType)
|
||||||
->setQuantity($drinkType->getWantedStock() - $drinkType->getCurrentStock())
|
->setQuantity($quantity)
|
||||||
),
|
);
|
||||||
|
}
|
||||||
|
return true; // Required for forAll to continue iterating
|
||||||
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
90
tests/Feature/Service/DrinkType/CreateNewOrderItemsTest.php
Normal file
90
tests/Feature/Service/DrinkType/CreateNewOrderItemsTest.php
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use App\Entity\DrinkType;
|
||||||
|
use App\Entity\Order;
|
||||||
|
use App\Repository\DrinkTypeRepository;
|
||||||
|
use App\Service\DrinkType\CreateNewOrderItems;
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
|
||||||
|
test('CreateNewOrderItems adds order items for wanted drink types', function (): void {
|
||||||
|
// Arrange
|
||||||
|
$em = $this->getContainer()->get(EntityManagerInterface::class);
|
||||||
|
$repository = $this->getContainer()->get(DrinkTypeRepository::class);
|
||||||
|
$createNewOrderItems = $this->getContainer()->get(CreateNewOrderItems::class);
|
||||||
|
|
||||||
|
// Clear existing drink types
|
||||||
|
$existingDrinkTypes = $repository->findAll();
|
||||||
|
foreach ($existingDrinkTypes as $drinkType) {
|
||||||
|
$em->remove($drinkType);
|
||||||
|
}
|
||||||
|
$em->flush();
|
||||||
|
|
||||||
|
// Create test drink types with different wantedStock and currentStock values
|
||||||
|
$drinkType1 = new DrinkType();
|
||||||
|
$drinkType1->setName('Drink Type 1');
|
||||||
|
$drinkType1->setWantedStock(10);
|
||||||
|
$drinkType1->setCurrentStock(5); // Need to order 5 more
|
||||||
|
|
||||||
|
$drinkType2 = new DrinkType();
|
||||||
|
$drinkType2->setName('Drink Type 2');
|
||||||
|
$drinkType2->setWantedStock(8);
|
||||||
|
$drinkType2->setCurrentStock(2); // Need to order 6 more
|
||||||
|
|
||||||
|
$drinkType3 = new DrinkType();
|
||||||
|
$drinkType3->setName('Drink Type 3');
|
||||||
|
$drinkType3->setWantedStock(0); // Not wanted, should not be ordered
|
||||||
|
$drinkType3->setCurrentStock(0);
|
||||||
|
|
||||||
|
$drinkType4 = new DrinkType();
|
||||||
|
$drinkType4->setName('Drink Type 4');
|
||||||
|
$drinkType4->setWantedStock(5);
|
||||||
|
$drinkType4->setCurrentStock(5); // Already at wanted stock, no need to order
|
||||||
|
|
||||||
|
// Persist the drink types
|
||||||
|
$em->persist($drinkType1);
|
||||||
|
$em->persist($drinkType2);
|
||||||
|
$em->persist($drinkType3);
|
||||||
|
$em->persist($drinkType4);
|
||||||
|
$em->flush();
|
||||||
|
|
||||||
|
// Create a new order
|
||||||
|
$order = new Order();
|
||||||
|
$em->persist($order);
|
||||||
|
$em->flush();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
$createNewOrderItems($order);
|
||||||
|
$em->flush();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
$orderItems = $order->getOrderItems();
|
||||||
|
|
||||||
|
// Should have 2 order items (for drink types 1 and 2)
|
||||||
|
expect($orderItems)->toHaveCount(2);
|
||||||
|
|
||||||
|
// Find order item for drink type 1
|
||||||
|
$orderItem1 = null;
|
||||||
|
$orderItem2 = null;
|
||||||
|
foreach ($orderItems as $item) {
|
||||||
|
if ($item->getDrinkType()->getName() === 'Drink Type 1') {
|
||||||
|
$orderItem1 = $item;
|
||||||
|
} elseif ($item->getDrinkType()->getName() === 'Drink Type 2') {
|
||||||
|
$orderItem2 = $item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify order item for drink type 1
|
||||||
|
expect($orderItem1)->not->toBeNull();
|
||||||
|
expect($orderItem1->getQuantity())->toBe(5); // 10 wanted - 5 current = 5 to order
|
||||||
|
|
||||||
|
// Verify order item for drink type 2
|
||||||
|
expect($orderItem2)->not->toBeNull();
|
||||||
|
expect($orderItem2->getQuantity())->toBe(6); // 8 wanted - 2 current = 6 to order
|
||||||
|
|
||||||
|
// Verify that drink types 3 and 4 don't have order items
|
||||||
|
$drinkType3Names = array_map(fn($item) => $item->getDrinkType()->getName(), $orderItems->toArray());
|
||||||
|
expect($drinkType3Names)->not->toContain('Drink Type 3');
|
||||||
|
expect($drinkType3Names)->not->toContain('Drink Type 4');
|
||||||
|
});
|
Loading…
Add table
Add a link
Reference in a new issue