beforeEach(function (): void { $this->setEntityClass(FoodOrder::class); $this->setPath('/food/order/'); $this->repository = $this->manager->getRepository($this->entityClass); $this->vendor = new FoodVendor; $this->vendor->setName('Food Vendor'); $this->manager->persist($this->vendor); $this->manager->flush(); }); describe(FoodOrderController::class, function (): void { test('index', function (): void { $order = new FoodOrder; $order->setFoodVendor($this->vendor); $this->manager->persist($order); $this->manager->persist($this->vendor); $this->manager->flush(); $crawler = $this->client->request('GET', "{$this->path}list"); $this->assertResponseStatusCodeSame(200); $this->assertPageTitleContains('FoodOrder index'); $this->assertCount( 1, $crawler->filter('td') ->reduce(fn(Crawler $node, $i): bool => $node->text() === $this->vendor->getName()), ); }); test('orderedItems', function (): 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()}"); $this->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); }); test('paginatedIndex', function (): void { foreach (range(1, 35) as $i) { $order = new FoodOrder($this->generateOldUlid()); $order->setFoodVendor($this->vendor); $order->close(); $this->manager->persist($order); } $this->manager->flush(); $crawler = $this->client->request('GET', "{$this->path}list"); $this->assertResponseStatusCodeSame(200); $this->assertPageTitleContains('FoodOrder index'); $this->assertElementContainsCount( $crawler, 'td', 1, 'older orders' ); $this->assertElementContainsCount( $crawler, 'td', 0, 'next page' ); }); test('paginatedFirstPage', function (int $page, int $prevPage, int $nextPage, int $items = 10): void { foreach (range(1, 35) as $i) { $order = new FoodOrder($this->generateOldUlid()); $order->setFoodVendor($this->vendor); $order->close(); $this->manager->persist($order); } $this->manager->flush(); $crawler = $this->client->request('GET', "{$this->path}list/archive/{$page}"); $this->assertResponseStatusCodeSame(200); $this->assertPageTitleContains('FoodOrder index'); $this->assertElementContainsCount( $crawler, 'td', $items, 'nobody' ); if ($prevPage > 0) { $prevPage = $prevPage === 1 ? '' : "/{$prevPage}"; $node = $crawler->filter('a') ->reduce(static fn(Crawler $node, $i): bool => $node->text() === 'previous page') ->first(); $target = $node->attr('href'); $this->assertTrue(str_ends_with((string) $target, $prevPage)); } if ($prevPage > 3) { $node = $crawler->filter('a') ->reduce(static fn(Crawler $node, $i): bool => $node->text() === 'next page') ->first(); $target = $node->attr('href'); $this->assertTrue(str_ends_with((string) $target, "/{$nextPage}")); } }) ->with( [ [1, 0, 2], [2, 1, 3], [3, 2, 4], [4, 3, 0, 5], ] ); test('new', function (): void { $this->client->getCookieJar() ->set(new Cookie('username', 'Testing-1')); $this->client->request('GET', sprintf('%snew', $this->path)); $this->assertResponseStatusCodeSame(200); $this->client->submitForm('Save', [ 'food_order[foodVendor]' => $this->vendor->getId(), ]); $this->assertResponseRedirects("{$this->path}list"); $this->assertSame(1, $this->repository->count([])); $order = $this->repository->findOneBy([ 'createdBy' => 'Testing-1', ]); assert($order instanceof FoodOrder); }); test('open', function (): void { $order = new FoodOrder; $order->setFoodVendor($this->vendor); $order->close(); $this->assertTrue($order->isClosed()); $this->manager->persist($order); $this->manager->flush(); $this->client->request('GET', sprintf('%s%s/open', $this->path, $order->getId())); $this->assertResponseRedirects("{$this->path}{$order->getId()}"); $openOrder = $this->repository->find($order->getId()); $this->assertFalse($openOrder->isClosed()); }); test('close', function (): void { $order = new FoodOrder; $order->setClosedAt(); $order->setFoodVendor($this->vendor); $this->assertFalse($order->isClosed()); $this->manager->persist($order); $this->manager->flush(); $this->client->request('GET', sprintf('%s%s/close', $this->path, $order->getId())); $this->assertResponseRedirects("{$this->path}{$order->getId()}"); $openOrder = $this->repository->find($order->getId()); $this->assertTrue($openOrder->isClosed()); }); }) ->covers( FoodOrderController::class, FoodOrder::class, FoodVendor::class, FoodOrderRepository::class, MenuItem::class, OrderItem::class, FoodOrderType::class, FoodVendorRepository::class );