add test for createneworderitems

This commit is contained in:
lubiana 2025-06-10 19:20:44 +02:00
parent 8063e7bec9
commit 0c758749e0
Signed by: lubiana
SSH key fingerprint: SHA256:vW1EA0fRR3Fw+dD/sM0K+x3Il2gSry6YRYHqOeQwrfk
2 changed files with 99 additions and 4 deletions

View file

@ -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
}
); );
} }
} }

View 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');
});