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
|
||||
{
|
||||
new ArrayCollection($this->drinkTypeRepository->findWanted())->forAll(
|
||||
fn (DrinkType $drinkType) => $order
|
||||
->addOrderItem(
|
||||
function (int $index, DrinkType $drinkType) use ($order) {
|
||||
$quantity = $drinkType->getWantedStock() - $drinkType->getCurrentStock();
|
||||
if ($quantity > 0) {
|
||||
$order->addOrderItem(
|
||||
new OrderItem()
|
||||
->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