<?php declare(strict_types=1);

namespace App\Tests\Controller;

use App\Entity\FoodOrder;
use App\Entity\FoodVendor;
use App\Tests\DbWebTest;
use Override;
use Symfony\Component\DomCrawler\Crawler;

use function sprintf;

final class FoodOrderControllerTest extends DbWebTest
{
    private string $path = '/food/order/';
    private FoodVendor $vendor;

    #[Override]
    public function setUp(): void
    {
        parent::setUp();
        $this->vendor = new FoodVendor;
        $this->vendor->setName('Food Vendor');

        $this->manager->persist($this->vendor);
        $this->manager->flush();
    }

    #[Override]
    public function getEntityClass(): string
    {
        return FoodOrder::class;
    }

    public function testIndex(): 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);
        self::assertResponseStatusCodeSame(200);
        self::assertPageTitleContains('FoodOrder index');
        $this->assertCount(
            1,
            $crawler->filter('td')
                ->reduce(fn(Crawler $node, $i): bool => $node->text() === $this->vendor->getName()),
        );
    }

    public function testNew(): void
    {
        $this->client->request('GET', sprintf('%snew', $this->path));

        self::assertResponseStatusCodeSame(200);

        $this->client->submitForm('Save', [
            'food_order[foodVendor]' => $this->vendor->getId(),
        ]);

        self::assertResponseRedirects($this->path);
        self::assertSame(1, $this->repository->count([]));
    }
}