Compare commits

..

No commits in common. "main" and "0.1.0" have entirely different histories.
main ... 0.1.0

29 changed files with 506 additions and 1594 deletions

View file

@ -9,7 +9,7 @@ jobs:
env:
REPO: '${{ github.repository }}'
TOKEN: '${{ secrets.GITHUB_TOKEN }}'
GIT_SERVER: 'git.hannover.ccc.de'
GIT_SERVER: 'hannover.ccc.de/gitlab'
run: |
git clone --branch $GITHUB_HEAD_REF https://${TOKEN}@${GIT_SERVER}/${REPO}.git .
git fetch
@ -23,19 +23,7 @@ jobs:
- name: lint
run: composer lint
- name: test
run: composer mutation
- name: Add comment to pull request
run: |
echo '```' >> /tmp/pull-request-comment
cat var/log/infection.txt >> /tmp/pull-request-comment
cat var/log/summary.log >> /tmp/pull-request-comment
echo '```' >> /tmp/pull-request-comment
jq -n --arg msg "$(cat /tmp/pull-request-comment)" '{"body": $msg}' > /tmp/git-msg
curl -X POST \
-H "Authorization: token ${GITHUB_TOKEN}" \
-H "Content-Type: application/json" \
-d @/tmp/git-msg \
"${{ env.GITHUB_SERVER_URL }}/api/v1/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments"
run: composer test
- name: GIT commit and push all changed files
env:
CI_COMMIT_MESSAGE: Continuous Integration Fixes

View file

@ -13,7 +13,7 @@ jobs:
REPO: '${{ github.repository }}'
TOKEN: '${{ secrets.GITHUB_TOKEN }}'
BRANCH: '${{ env.GITHUB_REF_NAME }}'
GIT_SERVER: 'git.hannover.ccc.de'
GIT_SERVER: 'hannover.ccc.de/gitlab'
run: |
git clone --branch $GITHUB_REF_NAME https://${TOKEN}@${GIT_SERVER}/${REPO}.git .
git fetch
@ -27,7 +27,7 @@ jobs:
- name: lint
run: composer lint
- name: test
run: composer mutation
run: composer test
- name: GIT commit and push all changed files
env:
CI_COMMIT_MESSAGE: Continuous Integration Fixes

View file

@ -7,14 +7,14 @@
"php": ">=8.3",
"ext-ctype": "*",
"ext-iconv": "*",
"doctrine/dbal": "^4.1",
"doctrine/dbal": "^4",
"doctrine/doctrine-bundle": "^2.12",
"doctrine/doctrine-migrations-bundle": "^3.3.1",
"doctrine/orm": "^3.2.1",
"doctrine/doctrine-migrations-bundle": "^3.3",
"doctrine/orm": "^3.2",
"psr/clock": "^1.0",
"symfony/console": "7.1.*",
"symfony/dotenv": "7.1.*",
"symfony/flex": "^2.4.6",
"symfony/flex": "^2",
"symfony/form": "7.1.*",
"symfony/framework-bundle": "7.1.*",
"symfony/runtime": "7.1.*",
@ -25,22 +25,20 @@
"symfony/yaml": "7.1.*"
},
"require-dev": {
"infection/infection": "^0.29.6",
"lubiana/code-quality": "^1.7.2",
"phpunit/phpunit": "^9.6.20",
"lubiana/code-quality": "^1.7",
"phpunit/phpunit": "^9.6.19",
"symfony/browser-kit": "7.1.*",
"symfony/css-selector": "7.1.*",
"symfony/maker-bundle": "^1.60",
"symfony/phpunit-bridge": "^7.1.3",
"symplify/config-transformer": "^12.3.4"
"symfony/phpunit-bridge": "^7.1",
"symplify/config-transformer": "^12.3"
},
"config": {
"allow-plugins": {
"php-http/discovery": true,
"symfony/flex": true,
"symfony/runtime": true,
"dealerdirect/phpcodesniffer-composer-installer": true,
"infection/extension-installer": true
"dealerdirect/phpcodesniffer-composer-installer": true
},
"sort-packages": true,
"platform": {
@ -83,8 +81,7 @@
"rector",
"ecs --fix || ecs --fix"
],
"test": "bin/phpunit",
"mutation": "infection --threads=8 --show-mutations"
"test": "bin/phpunit"
},
"conflict": {
"symfony/symfony": "*"

1613
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,20 +0,0 @@
{
"$schema": "vendor/infection/infection/resources/schema.json",
"source": {
"directories": [
"src"
]
},
"timeout": 30,
"logs": {
"text": "var/log/infection.txt",
"summary": "var/log/summary.log",
},
"mutators": {
"@default": true,
"global-ignore": [
"App\\Service\\Favicon::__toString",
"ORM\\Column.*"
]
}
}

View file

@ -1,35 +0,0 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20240816193410 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE food_vendor ADD COLUMN menu_link VARCHAR(255) DEFAULT NULL');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TEMPORARY TABLE __temp__food_vendor AS SELECT name, id FROM food_vendor');
$this->addSql('DROP TABLE food_vendor');
$this->addSql('CREATE TABLE food_vendor (name VARCHAR(50) NOT NULL, id BLOB NOT NULL, PRIMARY KEY(id))');
$this->addSql('INSERT INTO food_vendor (name, id) SELECT name, id FROM __temp__food_vendor');
$this->addSql('DROP TABLE __temp__food_vendor');
}
}

View file

@ -6,9 +6,7 @@
backupGlobals="false"
colors="true"
bootstrap="tests/bootstrap.php"
convertDeprecationsToExceptions="true"
executionOrder="random"
resolveDependencies="true"
convertDeprecationsToExceptions="false"
>
<php>
<ini name="display_errors" value="1" />
@ -30,6 +28,10 @@
<include>
<directory suffix=".php">src</directory>
</include>
<exclude>
<directory suffix=".php">src/Command</directory>
<file>src/Service/FakeData.php</file>
</exclude>
</coverage>
<listeners>

View file

@ -0,0 +1,35 @@
<?php declare(strict_types=1);
namespace App\Command;
use App\Service\FakeData;
use Override;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
#[AsCommand(
name: 'app:fake-data',
description: 'add some fake data to database',
)]
final class FakeDataCommand extends Command
{
public function __construct(
private readonly FakeData $fakeData,
) {
parent::__construct();
}
#[Override]
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$this->fakeData->resetDb();
$this->fakeData->generate();
$io->success('Added some fake data to database');
return Command::SUCCESS;
}
}

View file

@ -0,0 +1,66 @@
<?php declare(strict_types=1);
namespace App\Command;
use App\Entity\MenuItem;
use App\Repository\MenuItemRepository;
use App\Repository\OrderItemRepository;
use Doctrine\ORM\EntityManagerInterface;
use Override;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use function sprintf;
#[AsCommand(
name: 'app:migrate-orderitems-menuitems',
description: 'Migrate orderitems to menu items',
)]
final class MigrateOrderitemsMenuitemsCommand extends Command
{
public function __construct(
private readonly EntityManagerInterface $entityManager,
private readonly OrderItemRepository $orderItemRepository,
private readonly MenuItemRepository $menuItemRepository,
) {
parent::__construct();
}
#[Override]
protected function configure(): void {}
#[Override]
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$orderItems = $this->orderItemRepository->findAll();
foreach ($orderItems as $orderItem) {
$menuItem = $this->menuItemRepository->findOneBy([
'name' => $orderItem->getName(),
'foodVendor' => $orderItem->getFoodOrder()
->getFoodVendor(),
]);
if ($menuItem === null) {
$menuItem = new MenuItem;
$menuItem->setName($orderItem->getName());
$menuItem->setFoodVendor($orderItem->getFoodOrder()->getFoodVendor());
$this->entityManager->persist($menuItem);
$this->entityManager->flush();
$output->writeln(sprintf('Menu item %s added', $menuItem->getName()));
}
$orderItem->setMenuItem($menuItem);
$this->entityManager->persist($orderItem);
}
$this->entityManager->flush();
$io->success('You have a new command! Now make it your own! Pass --help to see your options.');
return Command::SUCCESS;
}
}

View file

@ -95,8 +95,7 @@ final class FoodOrderController extends AbstractController
#[Route('/{id}/close', name: 'app_food_order_close', methods: ['GET'])]
public function close(FoodOrder $foodOrder, FoodOrderRepository $repository): Response
{
$foodOrder->close();
$repository->save();
$repository->save($foodOrder->close());
return $this->redirectToRoute('app_food_order_show', [
'id' => $foodOrder->getId(),
], Response::HTTP_SEE_OTHER);
@ -105,8 +104,7 @@ final class FoodOrderController extends AbstractController
#[Route('/{id}/open', name: 'app_food_order_open', methods: ['GET'])]
public function open(FoodOrder $foodOrder, FoodOrderRepository $repository): Response
{
$foodOrder->open();
$repository->save();
$repository->save($foodOrder->open());
return $this->redirectToRoute('app_food_order_show', [
'id' => $foodOrder->getId(),
], Response::HTTP_SEE_OTHER);

View file

@ -46,6 +46,7 @@ final class MenuItemController extends AbstractController
{
if ($this->isCsrfTokenValid('delete' . $menuItem->getId(), $request->getPayload()->getString('_token'))) {
$menuItem->delete();
$entityManager->persist($menuItem);
$entityManager->flush();
}

View file

@ -56,7 +56,6 @@ final class OrderItemController extends AbstractController
}
$menuItems = $menuItemRepository->findBy([
'foodVendor' => $foodOrder->getFoodVendor(),
'deletedAt' => null,
]);
return $this->render('order_item/new.html.twig', [

View file

@ -134,7 +134,7 @@ class FoodOrder
public function removeOrderItem(OrderItem $orderItem): static
{
// set the owning side to null (unless already changed)
if ($this->orderItems->removeElement($orderItem)) {
if ($this->orderItems->removeElement($orderItem) && $orderItem->getFoodOrder() === $this) {
$orderItem->setFoodOrder(null);
}

View file

@ -28,9 +28,6 @@ class FoodVendor
#[ORM\OneToMany(targetEntity: MenuItem::class, mappedBy: 'foodVendor', orphanRemoval: true)]
private Collection $menuItems;
#[ORM\Column(length: 255, nullable: true)]
private string|null $menuLink = null;
public function __construct(
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
@ -80,7 +77,7 @@ class FoodVendor
public function removeFoodOrder(FoodOrder $foodOrder): static
{
// set the owning side to null (unless already changed)
if ($this->foodOrders->removeElement($foodOrder)) {
if ($this->foodOrders->removeElement($foodOrder) && $foodOrder->getFoodVendor() === $this) {
$foodOrder->setFoodVendor(null);
}
@ -113,22 +110,10 @@ class FoodVendor
public function removeMenuItem(MenuItem $menuItem): static
{
// set the owning side to null (unless already changed)
if ($this->menuItems->removeElement($menuItem)) {
if ($this->menuItems->removeElement($menuItem) && $menuItem->getFoodVendor() === $this) {
$menuItem->setFoodVendor(null);
}
return $this;
}
public function getMenuLink(): string|null
{
return $this->menuLink;
}
public function setMenuLink(string|null $menuLink): static
{
$this->menuLink = $menuLink;
return $this;
}
}

View file

@ -2,11 +2,13 @@
namespace App\Form;
use App\Entity\FoodOrder;
use App\Entity\FoodVendor;
use Override;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
final class FoodOrderType extends AbstractType
{
@ -29,4 +31,12 @@ final class FoodOrderType extends AbstractType
$builder->setAction($action);
}
}
#[Override]
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => FoodOrder::class,
]);
}
}

View file

@ -15,7 +15,6 @@ final class FoodVendorType extends AbstractType
{
$builder
->add('name')
->add('menuLink')
;
}

View file

@ -5,6 +5,7 @@ namespace App\Form;
use Override;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
final class UserNameFormType extends AbstractType
{
@ -12,7 +13,17 @@ final class UserNameFormType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add(child: 'username')
->add(child: 'username', options: [
'required' => false,
])
;
}
#[Override]
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
// Configure your form options here
]);
}
}

View file

@ -19,8 +19,10 @@ final class FoodOrderRepository extends ServiceEntityRepository
parent::__construct($registry, FoodOrder::class);
}
public function save(): void
public function save(FoodOrder $order): void
{
$this->getEntityManager()
->persist($order);
$this->getEntityManager()
->flush();
}

100
src/Service/FakeData.php Normal file
View file

@ -0,0 +1,100 @@
<?php declare(strict_types=1);
namespace App\Service;
use App\Entity\FoodOrder;
use App\Entity\FoodVendor;
use App\Entity\OrderItem;
use App\Repository\FoodOrderRepository;
use App\Repository\FoodVendorRepository;
use App\Repository\OrderItemRepository;
use Doctrine\ORM\EntityManagerInterface;
use function range;
final readonly class FakeData
{
public function __construct(
private EntityManagerInterface $entityManager,
private FoodVendorRepository $foodVendorRepository,
private FoodOrderRepository $foodOrderRepository,
private OrderItemRepository $orderItemRepository,
) {}
public function resetDb(): void
{
foreach ($this->orderItemRepository->findAll() as $item) {
$this->entityManager->remove($item);
}
foreach ($this->foodOrderRepository->findAll() as $item) {
$this->entityManager->remove($item);
}
foreach ($this->foodVendorRepository->findAll() as $item) {
$this->entityManager->remove($item);
}
}
public function generate(int $vendorAmount = 3, int $orderAmount = 4, int $itemAmount = 10): void
{
$vendors = $this->generateVendors($vendorAmount);
foreach ($vendors as $vendor) {
$orders = $this->generateOrdersForVendor($vendor, $orderAmount);
foreach ($orders as $order) {
$this->generateItemsForOrder($order, $itemAmount);
}
}
$this->entityManager->flush();
}
/**
* @return FoodVendor[]
*/
public function generateVendors(int $amount = 10): array
{
$vendors = [];
foreach (range(1, $amount) as $i) {
$vendor = new FoodVendor;
$vendor->setName('Food Vendor ' . $i);
$this->entityManager->persist($vendor);
$vendors[] = $vendor;
}
return $vendors;
}
/**
* @return FoodOrder[]
*/
public function generateOrdersForVendor(FoodVendor $vendor, int $amount = 10): array
{
$orders = [];
foreach (range(1, $amount) as $i) {
$order = new FoodOrder;
$order->setFoodVendor($vendor);
if ($i % 2 === 0) {
$order->close();
}
$this->entityManager->persist($order);
$orders[] = $order;
}
return $orders;
}
/**
* @return OrderItem[]
*/
public function generateItemsForOrder(FoodOrder $order, int $amount = 10): array
{
$items = [];
foreach (range(1, $amount) as $i) {
$item = new OrderItem;
$item->setName('Item ' . $i);
$item->setFoodOrder($order);
if ($i % 2 === 0) {
$item->setExtras('Extra ' . $i);
}
$this->entityManager->persist($item);
$items[] = $item;
}
return $items;
}
}

View file

@ -27,7 +27,7 @@
<a href="{{ path('app_food_order_index') }}">Orders</a> /
<a href="{{ path('app_food_vendor_index') }}">Vendors</a> /
<a
href="https://git.hannover.ccc.de/lubiana/futtern/issues/new"
href="https://hannover.ccc.de/gitlab/lubiana/futtern/issues/new"
target="_blank"
>Create Issue</a>
</nav>

View file

@ -11,10 +11,6 @@
<th>Name</th>
<td>{{ food_vendor.name }}</td>
</tr>
<tr>
<th>Menu</th>
<td><a href="{{ food_vendor.menuLink }}" target="_blank">{{ food_vendor.menuLink }}</a></td>
</tr>
</tbody>
</table>

View file

@ -7,14 +7,6 @@
{{ include('order_item/_form.html.twig') }}
<hr />
{% if food_order.foodVendor.menuLink != '' %}
<a href="{{ food_order.foodVendor.menuLink }}" target="_blank">
External link to Menu
</a>
{% endif %}
<div>
<b>click a button to select a given menuitem</b>
</div>

View file

@ -38,7 +38,6 @@ final class FoodVendorControllerTest extends DbWebTest
{
$fixture = new FoodVendor;
$fixture->setName('My Title');
$fixture->setMenuLink('https://example.com/');
$this->manager->persist($fixture);
$this->manager->flush();
@ -46,17 +45,9 @@ final class FoodVendorControllerTest extends DbWebTest
$crawler = $this->client->request('GET', sprintf('%s%s', $this->path, $fixture->getId()));
$this->assertResponseIsSuccessful();
$nameNode = $crawler->filter('td')
->last();
$nameNode = $crawler->filter(
'.table > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)'
)->text();
$menuLinkNode = $crawler->filter(
'.table > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2) > a:nth-child(1)'
)->text();
$this->assertSame('My Title', $nameNode);
$this->assertSame('https://example.com/', $menuLinkNode);
$this->assertSame('My Title', $nameNode->text());
}
public function testShowMenuItems(): void
@ -100,10 +91,9 @@ final class FoodVendorControllerTest extends DbWebTest
$crawler = $this->client->request('GET', sprintf('%s%s', $this->path, $fixture->getId()));
$this->assertResponseIsSuccessful();
$nameNode = $crawler->filter(
'.table > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)'
)->text();
$this->assertSame('My Title', $nameNode);
$nameNode = $crawler->filter('td')
->last();
$this->assertSame('My Title', $nameNode->text());
$itemNodes = $crawler->filter('li');
@ -118,17 +108,10 @@ final class FoodVendorControllerTest extends DbWebTest
$this->manager->persist($fixture);
$this->manager->flush();
$crawler = $this->client->request('GET', sprintf('%s%s/edit', $this->path, $fixture->getId()));
$this->assertSame(
$crawler->filter('#food_vendor_name')
->last()
->attr('value', ''),
'Value'
);
$this->client->request('GET', sprintf('%s%s/edit', $this->path, $fixture->getId()));
$this->client->submitForm('Update', [
'food_vendor[name]' => 'Something New',
'food_vendor[menuLink]' => 'https://example.com/',
]);
self::assertResponseRedirects('/food/vendor/');
@ -136,7 +119,6 @@ final class FoodVendorControllerTest extends DbWebTest
$fixture = $this->repository->findAll();
self::assertSame('Something New', $fixture[0]->getName());
self::assertSame('https://example.com/', $fixture[0]->getMenuLink());
}
#[Override]

View file

@ -34,21 +34,6 @@ final class HomeControllerTest extends DbWebTest
self::assertResponseStatusCodeSame(302);
self::assertResponseHeaderSame('Location', '/food/order/list');
self::assertResponseCookieValueSame('username', 'Testing-1');
$crawler = $this->client->request(
'GET',
'/username',
);
self::assertResponseStatusCodeSame(200);
$this->assertSame(
$crawler->filter('#user_name_form_username')
->last()
->attr('value', ''),
'Testing-1'
);
}
public function testRemoveUsername(): void

View file

@ -2,7 +2,6 @@
namespace App\Tests\Controller;
use App\Entity\FoodOrder;
use App\Entity\FoodVendor;
use App\Entity\MenuItem;
use App\Tests\DbWebTest;
@ -86,11 +85,6 @@ final class MenuItemControllerTest extends DbWebTest
$this->vendor->addMenuItem($menuItem);
$this->manager->persist($this->vendor);
$this->manager->persist($menuItem);
$order = new FoodOrder;
$order->setFoodVendor($this->vendor);
$this->manager->persist($order);
$this->manager->flush();
$this->assertFalse($menuItem->isDeleted());
@ -100,14 +94,5 @@ final class MenuItemControllerTest extends DbWebTest
$menuItem = $this->repository->find($menuItem->getId());
$this->assertTrue($menuItem->isDeleted());
$crawler = $this->client->request('GET', '/order/item/new/' . $order->getId());
$count = $crawler->filter('body > main:nth-child(2) > div:nth-child(5)')
->children()
->count();
$this->assertSame(0, $count);
$this->assertResponseIsSuccessful();
}
}

View file

@ -38,16 +38,6 @@ final class OrderItemControllerTest extends DbWebTest
$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();
@ -56,16 +46,11 @@ final class OrderItemControllerTest extends DbWebTest
public function testNew(): void
{
$crawler = $this->client->request(
$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);
self::assertResponseStatusCodeSame(200);
$this->client->submitForm('Save', [
@ -76,9 +61,7 @@ final class OrderItemControllerTest extends DbWebTest
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
self::assertSame(1, $this->repository->count([]));
self::assertSame(1, $this->menuItemRepository->count([
'foodVendor' => $this->vendor->getId(),
]));
self::assertSame(1, $this->menuItemRepository->count([]));
}
public function testNewOrderClosed(): void
@ -115,7 +98,7 @@ final class OrderItemControllerTest extends DbWebTest
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
self::assertSame(1, $this->repository->count([]));
self::assertSame(3, $this->menuItemRepository->count([]));
self::assertSame(2, $this->menuItemRepository->count([]));
}
public function testRemove(): void
@ -188,7 +171,7 @@ final class OrderItemControllerTest extends DbWebTest
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
self::assertSame(1, $this->repository->count([]));
self::assertSame(3, $this->menuItemRepository->count([]));
self::assertSame(2, $this->menuItemRepository->count([]));
}

View file

@ -16,9 +16,8 @@ final class FoodOrderTest extends TestCase
$order->addOrderItem($orderItem);
$order->addOrderItem($orderItem);
$this->assertCount(1, $order->getOrderItems());
$this->assertSame($order, $orderItem->getFoodOrder());
$order->removeOrderItem($orderItem);
$this->assertCount(0, $order->getOrderItems());
$this->assertNull($orderItem->getFoodOrder());
}
}

View file

@ -22,16 +22,9 @@ final class FoodVendorTest extends TestCase
$vendor->addFoodOrder($order1);
$vendor->addFoodOrder($order1);
$this->assertCount(1, $vendor->getFoodOrders());
$this->assertSame($vendor, $order1->getFoodVendor());
$vendor->removeFoodOrder($order1);
$this->assertCount(0, $vendor->getFoodOrders());
$this->assertNull($order1->getFoodVendor());
}
public function testMenuItem(): void
{
$vendor = new FoodVendor;
$menuItem1 = new MenuItem;
$menuItem2 = new MenuItem;
$this->assertCount(0, $vendor->getMenuItems());
@ -40,24 +33,11 @@ final class FoodVendorTest extends TestCase
$this->assertCount(1, $vendor->getMenuItems());
$vendor->removeMenuItem($menuItem1);
$this->assertCount(0, $vendor->getMenuItems());
$this->assertNull($menuItem1->getFoodVendor());
$vendor->addMenuItem($menuItem1);
$menuItem2->delete();
$vendor->addMenuItem($menuItem2);
$this->assertCount(1, $vendor->getMenuItems());
$this->assertCount(2, $vendor->getMenuItems(true));
}
public function testRemoveForeignMenuItem(): void
{
$vendor1 = new FoodVendor;
$vendor2 = new FoodVendor;
$item1 = new MenuItem;
$vendor1->addMenuItem($item1);
$this->assertCount(1, $vendor1->getMenuItems());
$vendor2->removeMenuItem($item1);
$this->assertCount(1, $vendor1->getMenuItems());
$this->assertSame($vendor1, $item1->getFoodVendor());
}
}

View file

@ -4,7 +4,6 @@ namespace App\Tests\Entity;
use App\Entity\FoodVendor;
use App\Entity\MenuItem;
use DateTimeImmutable;
use PHPUnit\Framework\TestCase;
final class MenuItemTest extends TestCase
@ -22,9 +21,7 @@ final class MenuItemTest extends TestCase
$this->assertEquals($vendor, $item->getFoodVendor());
$this->assertFalse($item->isDeleted());
$this->assertNull($item->getDeletedAt());
$item->delete();
$this->assertTrue($item->isDeleted());
$this->assertInstanceOf(DateTimeImmutable::class, $item->getDeletedAt());
}
}