diff --git a/src/Entity/FoodOrder.php b/src/Entity/FoodOrder.php index fe16eac..c09fe16 100644 --- a/src/Entity/FoodOrder.php +++ b/src/Entity/FoodOrder.php @@ -11,6 +11,8 @@ use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Types\UlidType; use Symfony\Component\Uid\Ulid; +use function iterator_to_array; + #[ORM\Entity(repositoryClass: FoodOrderRepository::class)] class FoodOrder { @@ -99,6 +101,23 @@ class FoodOrder return $this->orderItems; } + /** + * @return Collection + */ + public function getOrderItemsSortedByName(): Collection + { + $iterator = $this->getOrderItems() + ->getIterator(); + $iterator->uasort( + static fn(OrderItem $a, OrderItem $b): int => $a->getName() <=> $b->getName() + ); + return new ArrayCollection( + iterator_to_array( + $iterator + ) + ); + } + public function addOrderItem(OrderItem $orderItem): static { if (! $this->orderItems->contains($orderItem)) { diff --git a/templates/food_order/show.html.twig b/templates/food_order/show.html.twig index 1e05313..48f4b01 100644 --- a/templates/food_order/show.html.twig +++ b/templates/food_order/show.html.twig @@ -43,7 +43,7 @@ - {% for item in food_order.orderItems %} + {% for item in food_order.orderItemsSortedByName %} {{ item.createdBy }} {{ item.name }} diff --git a/tests/Controller/FoodOrderControllerTest.php b/tests/Controller/FoodOrderControllerTest.php index 6eda822..e262ccf 100644 --- a/tests/Controller/FoodOrderControllerTest.php +++ b/tests/Controller/FoodOrderControllerTest.php @@ -4,6 +4,8 @@ namespace App\Tests\Controller; use App\Entity\FoodOrder; use App\Entity\FoodVendor; +use App\Entity\MenuItem; +use App\Entity\OrderItem; use App\Tests\DbWebTest; use Override; use Symfony\Component\DomCrawler\Crawler; @@ -52,6 +54,68 @@ final class FoodOrderControllerTest extends DbWebTest ); } + public function testOrderedItems(): void + { + $order = new FoodOrder; + $order->setFoodVendor($this->vendor); + + $this->manager->persist($order); + $this->manager->persist($this->vendor); + + $menuItemA = new MenuItem; + $menuItemA->setName('A'); + $menuItemA->setFoodVendor($this->vendor); + + $this->manager->persist($menuItemA); + $itemA = new OrderItem; + $itemA->setMenuItem($menuItemA); + $itemA->setName($menuItemA->getName()); + + $order->addOrderItem($itemA); + $this->manager->persist($itemA); + + $menuItemC = new MenuItem; + $menuItemC->setName('C'); + $menuItemC->setFoodVendor($this->vendor); + + $this->manager->persist($menuItemC); + $itemC = new OrderItem; + $itemC->setMenuItem($menuItemC); + $itemC->setName($menuItemC->getName()); + + $order->addOrderItem($itemC); + $this->manager->persist($itemC); + + $menuItemB = new MenuItem; + $menuItemB->setName('B'); + $menuItemB->setFoodVendor($this->vendor); + + $this->manager->persist($menuItemB); + $itemB = new OrderItem; + $itemB->setMenuItem($menuItemB); + $itemB->setName($menuItemB->getName()); + + $order->addOrderItem($itemB); + $this->manager->persist($itemB); + + $this->manager->flush(); + + $crawler = $this->client->request('GET', "{$this->path}{$order->getId()}"); + self::assertResponseIsSuccessful(); + $tdContent = $crawler->filter( + 'table.table:nth-child(6) > tbody:nth-child(2) > tr:nth-child(1) > td:nth-child(2)' + )->text(); + $this->assertEquals('A', $tdContent); + $tdContent = $crawler->filter( + 'table.table:nth-child(6) > tbody:nth-child(2) > tr:nth-child(2) > td:nth-child(2)' + )->text(); + $this->assertEquals('B', $tdContent); + $tdContent = $crawler->filter( + 'table.table:nth-child(6) > tbody:nth-child(2) > tr:nth-child(3) > td:nth-child(2)' + )->text(); + $this->assertEquals('C', $tdContent); + } + public function testPaginatedIndex(): void { $this->generatePaginatedOrders();