From 0c758749e072e7016ce98c82b85c86ac3f57e73a Mon Sep 17 00:00:00 2001 From: lubiana Date: Tue, 10 Jun 2025 19:20:44 +0200 Subject: [PATCH] add test for createneworderitems --- src/Service/DrinkType/CreateNewOrderItems.php | 13 ++- .../DrinkType/CreateNewOrderItemsTest.php | 90 +++++++++++++++++++ 2 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 tests/Feature/Service/DrinkType/CreateNewOrderItemsTest.php diff --git a/src/Service/DrinkType/CreateNewOrderItems.php b/src/Service/DrinkType/CreateNewOrderItems.php index 2c139fb..6dfb4fa 100644 --- a/src/Service/DrinkType/CreateNewOrderItems.php +++ b/src/Service/DrinkType/CreateNewOrderItems.php @@ -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 + } ); } } diff --git a/tests/Feature/Service/DrinkType/CreateNewOrderItemsTest.php b/tests/Feature/Service/DrinkType/CreateNewOrderItemsTest.php new file mode 100644 index 0000000..700591d --- /dev/null +++ b/tests/Feature/Service/DrinkType/CreateNewOrderItemsTest.php @@ -0,0 +1,90 @@ +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'); +});