beforeEach(function (): void { $this->setEntityClass(OrderItem::class); $this->setPath('/order/item/'); $this->repository = $this->manager->getRepository($this->entityClass); $this->vendor = new FoodVendor; $this->vendor->setName('Food Vendor'); $this->manager->persist($this->vendor); $this->order = new FoodOrder; $this->order->setFoodVendor($this->vendor); $this->manager->persist($this->order); $this->menuItem = new MenuItem; $this->menuItem->setName('Testing'); $this->menuItem->setFoodVendor($this->vendor); $vendor2 = new FoodVendor; $vendor2->setName('Vendor 2'); $menuItem2 = new MenuItem; $menuItem2->setName('Testing2'); $menuItem2->setFoodVendor($vendor2); $this->manager->persist($vendor2); $this->manager->persist($menuItem2); $this->manager->persist($this->menuItem); $this->manager->flush(); $this->menuItemRepository = $this::getContainer()->get(MenuItemRepository::class); }); describe(OrderItemController::class, function (): void { test('new', function (): void { $crawler = $this->client->request( 'GET', sprintf('%snew/%s', $this->path, $this->order->getId()) ); $children = $crawler->filter('body > main:nth-child(2) > div:nth-child(5)') ->children(); $this->assertCount(1, $children); $this->assertResponseStatusCodeSame(200); $this->client->submitForm('Save', [ 'order_item[name]' => 'Testing', 'order_item[extras]' => 'Testing', ]); $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); $this->assertSame(1, $this->repository->count([])); $this->assertSame(1, $this->menuItemRepository->count([ 'foodVendor' => $this->vendor->getId(), ])); }); test('new order closed', function (): void { $this->order->setClosedAt(new DateTimeImmutable('-1 Hour')); $this->manager->persist($this->order); $this->manager->flush(); $this->client->request( 'GET', sprintf('%snew/%s', $this->path, $this->order->getId()) ); $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); $this->assertSame(0, $this->repository->count([])); }); test('new create menu item', function (): void { $this->client->request( 'GET', sprintf('%snew/%s', $this->path, $this->order->getId()) ); $this->assertResponseStatusCodeSame(200); $this->client->submitForm('Save', [ 'order_item[name]' => 'Testing-1', 'order_item[extras]' => 'Testing-1', ]); $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); $this->assertSame(1, $this->repository->count([])); $this->assertSame(3, $this->menuItemRepository->count([])); }); test('remove', function (): void { $fixture = new OrderItem; $fixture->setName('Testing'); $fixture->setExtras('Value'); $fixture->setMenuItem($this->menuItem); $fixture->setFoodOrder($this->order); $this->manager->persist($fixture); $this->manager->flush(); $this->client->request('GET', sprintf('%sdelete/%s', $this->path, $fixture->getId())); $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); $this->assertSame(0, $this->repository->count([])); }); test('order closed', function (): void { $fixture = new OrderItem; $fixture->setName('Testing'); $fixture->setExtras('Value'); $fixture->setMenuItem($this->menuItem); $fixture->setFoodOrder($this->order); $this->order->close(); $this->manager->persist($this->order); $this->manager->persist($fixture); $this->manager->flush(); $this->client->request('GET', sprintf('%sdelete/%s', $this->path, $fixture->getId())); $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); $this->assertSame(1, $this->repository->count([])); }); test('edit', function (): void { $orderItem = new OrderItem; $orderItem->setName('Testing'); $orderItem->setExtras('My Extra'); $orderItem->setFoodOrder($this->order); $orderItem->setMenuItem($this->menuItem); $this->manager->persist($orderItem); $this->manager->flush(); $crawler = $this->client->request('GET', sprintf('%s%s/edit', $this->path, $orderItem->getId())); $nameElem = $crawler->filter('#order_item_name'); $extrasElem = $crawler->filter('#order_item_extras'); $this->assertEquals( 'Testing', $nameElem->attr('value') ); $this->assertEquals( 'My Extra', $extrasElem->attr('value') ); $this->client->submitForm('Update', [ 'order_item[name]' => 'Testing-1', 'order_item[extras]' => 'Testing-1', ]); $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); $this->assertSame(1, $this->repository->count([])); $this->assertSame(3, $this->menuItemRepository->count([])); }); test('edit order closed', function (): void { $orderItem = new OrderItem; $orderItem->setName('Testing'); $orderItem->setExtras('My Extra'); $orderItem->setFoodOrder($this->order); $orderItem->setMenuItem($this->menuItem); $this->order->close(); $this->manager->persist($orderItem); $this->manager->persist($this->order); $this->manager->flush(); $this->client->request('GET', sprintf('%s%s/edit', $this->path, $orderItem->getId())); $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); }); test('copy', function (): void { $orderItem = new OrderItem; $orderItem->setName('My Title'); $orderItem->setExtras('My Title'); $orderItem->setFoodOrder($this->order); $orderItem->setMenuItem($this->menuItem); $this->manager->persist($orderItem); $this->manager->flush(); $this->client->request('GET', sprintf('%s%s/copy', $this->path, $orderItem->getId())); $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); $result = $this->repository->findBy([ 'foodOrder' => $this->order->getId(), ]); $this->assertCount(2, $result); foreach ($result as $item) { $this->assertSame($orderItem->getName(), $item->getName()); $this->assertSame($orderItem->getExtras(), $item->getExtras()); } }); test('copy order closed', function (): void { $orderItem = new OrderItem; $orderItem->setName('My Title'); $orderItem->setExtras('My Title'); $orderItem->setFoodOrder($this->order); $orderItem->setMenuItem($this->menuItem); $this->order->close(); $this->manager->persist($this->order); $this->manager->persist($orderItem); $this->manager->flush(); $this->client->request('GET', sprintf('%s%s/copy', $this->path, $orderItem->getId())); $this->assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId())); $result = $this->repository->findBy([ 'foodOrder' => $this->order->getId(), ]); $this->assertCount(1, $result); }); }) ->covers( OrderItemController::class, MenuItemRepository::class, OrderItemRepository::class, OrderItemType::class, FoodOrder::class, FoodVendor::class, MenuItem::class, OrderItem::class, FoodOrderRepository::class, );