Compare commits
14 commits
Author | SHA1 | Date | |
---|---|---|---|
|
ee5d515ac1 | ||
80758abd60 | |||
9e35499269 | |||
441568bdb7 | |||
7674b6a6bd | |||
12ff38ecd6 | |||
b1e82037c7 | |||
3f3ede8548 | |||
56206acd8a | |||
34171d6c2b | |||
2a28465626 | |||
6f23c3c1b7 | |||
a4f62868fd | |||
311802be6b |
31 changed files with 1932 additions and 519 deletions
|
@ -9,7 +9,7 @@ jobs:
|
|||
env:
|
||||
REPO: '${{ github.repository }}'
|
||||
TOKEN: '${{ secrets.GITHUB_TOKEN }}'
|
||||
GIT_SERVER: 'hannover.ccc.de/gitlab'
|
||||
GIT_SERVER: 'git.hannover.ccc.de'
|
||||
run: |
|
||||
git clone --branch $GITHUB_HEAD_REF https://${TOKEN}@${GIT_SERVER}/${REPO}.git .
|
||||
git fetch
|
||||
|
@ -23,7 +23,19 @@ jobs:
|
|||
- name: lint
|
||||
run: composer lint
|
||||
- name: test
|
||||
run: composer 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"
|
||||
- name: GIT commit and push all changed files
|
||||
env:
|
||||
CI_COMMIT_MESSAGE: Continuous Integration Fixes
|
||||
|
|
|
@ -13,7 +13,7 @@ jobs:
|
|||
REPO: '${{ github.repository }}'
|
||||
TOKEN: '${{ secrets.GITHUB_TOKEN }}'
|
||||
BRANCH: '${{ env.GITHUB_REF_NAME }}'
|
||||
GIT_SERVER: 'hannover.ccc.de/gitlab'
|
||||
GIT_SERVER: 'git.hannover.ccc.de'
|
||||
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 test
|
||||
run: composer mutation
|
||||
- name: GIT commit and push all changed files
|
||||
env:
|
||||
CI_COMMIT_MESSAGE: Continuous Integration Fixes
|
||||
|
|
|
@ -7,14 +7,14 @@
|
|||
"php": ">=8.3",
|
||||
"ext-ctype": "*",
|
||||
"ext-iconv": "*",
|
||||
"doctrine/dbal": "^4",
|
||||
"doctrine/dbal": "^4.1",
|
||||
"doctrine/doctrine-bundle": "^2.12",
|
||||
"doctrine/doctrine-migrations-bundle": "^3.3",
|
||||
"doctrine/orm": "^3.2",
|
||||
"doctrine/doctrine-migrations-bundle": "^3.3.1",
|
||||
"doctrine/orm": "^3.2.1",
|
||||
"psr/clock": "^1.0",
|
||||
"symfony/console": "7.1.*",
|
||||
"symfony/dotenv": "7.1.*",
|
||||
"symfony/flex": "^2",
|
||||
"symfony/flex": "^2.4.6",
|
||||
"symfony/form": "7.1.*",
|
||||
"symfony/framework-bundle": "7.1.*",
|
||||
"symfony/runtime": "7.1.*",
|
||||
|
@ -25,20 +25,22 @@
|
|||
"symfony/yaml": "7.1.*"
|
||||
},
|
||||
"require-dev": {
|
||||
"lubiana/code-quality": "^1.7",
|
||||
"phpunit/phpunit": "^9.6.19",
|
||||
"infection/infection": "^0.29.6",
|
||||
"lubiana/code-quality": "^1.7.2",
|
||||
"phpunit/phpunit": "^9.6.20",
|
||||
"symfony/browser-kit": "7.1.*",
|
||||
"symfony/css-selector": "7.1.*",
|
||||
"symfony/maker-bundle": "^1.60",
|
||||
"symfony/phpunit-bridge": "^7.1",
|
||||
"symplify/config-transformer": "^12.3"
|
||||
"symfony/phpunit-bridge": "^7.1.3",
|
||||
"symplify/config-transformer": "^12.3.4"
|
||||
},
|
||||
"config": {
|
||||
"allow-plugins": {
|
||||
"php-http/discovery": true,
|
||||
"symfony/flex": true,
|
||||
"symfony/runtime": true,
|
||||
"dealerdirect/phpcodesniffer-composer-installer": true
|
||||
"dealerdirect/phpcodesniffer-composer-installer": true,
|
||||
"infection/extension-installer": true
|
||||
},
|
||||
"sort-packages": true,
|
||||
"platform": {
|
||||
|
@ -81,7 +83,8 @@
|
|||
"rector",
|
||||
"ecs --fix || ecs --fix"
|
||||
],
|
||||
"test": "bin/phpunit"
|
||||
"test": "bin/phpunit",
|
||||
"mutation": "infection --threads=8 --show-mutations"
|
||||
},
|
||||
"conflict": {
|
||||
"symfony/symfony": "*"
|
||||
|
|
1613
composer.lock
generated
1613
composer.lock
generated
File diff suppressed because it is too large
Load diff
20
infection.json5
Normal file
20
infection.json5
Normal file
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"$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.*"
|
||||
]
|
||||
}
|
||||
}
|
35
migrations/Version20240816193410.php
Normal file
35
migrations/Version20240816193410.php
Normal file
|
@ -0,0 +1,35 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
|
@ -6,7 +6,9 @@
|
|||
backupGlobals="false"
|
||||
colors="true"
|
||||
bootstrap="tests/bootstrap.php"
|
||||
convertDeprecationsToExceptions="false"
|
||||
convertDeprecationsToExceptions="true"
|
||||
executionOrder="random"
|
||||
resolveDependencies="true"
|
||||
>
|
||||
<php>
|
||||
<ini name="display_errors" value="1" />
|
||||
|
|
|
@ -1,35 +0,0 @@
|
|||
<?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;
|
||||
}
|
||||
}
|
|
@ -1,66 +0,0 @@
|
|||
<?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;
|
||||
}
|
||||
}
|
|
@ -95,7 +95,8 @@ final class FoodOrderController extends AbstractController
|
|||
#[Route('/{id}/close', name: 'app_food_order_close', methods: ['GET'])]
|
||||
public function close(FoodOrder $foodOrder, FoodOrderRepository $repository): Response
|
||||
{
|
||||
$repository->save($foodOrder->close());
|
||||
$foodOrder->close();
|
||||
$repository->save();
|
||||
return $this->redirectToRoute('app_food_order_show', [
|
||||
'id' => $foodOrder->getId(),
|
||||
], Response::HTTP_SEE_OTHER);
|
||||
|
@ -104,7 +105,8 @@ final class FoodOrderController extends AbstractController
|
|||
#[Route('/{id}/open', name: 'app_food_order_open', methods: ['GET'])]
|
||||
public function open(FoodOrder $foodOrder, FoodOrderRepository $repository): Response
|
||||
{
|
||||
$repository->save($foodOrder->open());
|
||||
$foodOrder->open();
|
||||
$repository->save();
|
||||
return $this->redirectToRoute('app_food_order_show', [
|
||||
'id' => $foodOrder->getId(),
|
||||
], Response::HTTP_SEE_OTHER);
|
||||
|
|
|
@ -30,7 +30,9 @@ final class MenuItemController extends AbstractController
|
|||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
$entityManager->flush();
|
||||
|
||||
return $this->redirectToRoute('app_menu_item_index', [], Response::HTTP_SEE_OTHER);
|
||||
return $this->redirectToRoute('app_menu_item_show', [
|
||||
'id' => $menuItem->getId(),
|
||||
], Response::HTTP_SEE_OTHER);
|
||||
}
|
||||
|
||||
return $this->render('menu_item/edit.html.twig', [
|
||||
|
@ -44,10 +46,12 @@ final class MenuItemController extends AbstractController
|
|||
{
|
||||
if ($this->isCsrfTokenValid('delete' . $menuItem->getId(), $request->getPayload()->getString('_token'))) {
|
||||
$menuItem->delete();
|
||||
$entityManager->persist($menuItem);
|
||||
$entityManager->flush();
|
||||
}
|
||||
|
||||
return $this->redirectToRoute('app_menu_item_index', [], Response::HTTP_SEE_OTHER);
|
||||
return $this->redirectToRoute('app_food_vendor_show', [
|
||||
'id' => $menuItem->getFoodVendor()
|
||||
->getId(),
|
||||
], Response::HTTP_SEE_OTHER);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -56,6 +56,7 @@ final class OrderItemController extends AbstractController
|
|||
}
|
||||
$menuItems = $menuItemRepository->findBy([
|
||||
'foodVendor' => $foodOrder->getFoodVendor(),
|
||||
'deletedAt' => null,
|
||||
]);
|
||||
|
||||
return $this->render('order_item/new.html.twig', [
|
||||
|
|
|
@ -58,7 +58,7 @@ class FoodOrder
|
|||
return $this->closedAt;
|
||||
}
|
||||
|
||||
public function setClosedAt(DateTimeImmutable|null $closedAt): static
|
||||
public function setClosedAt(DateTimeImmutable|null $closedAt = null): static
|
||||
{
|
||||
$this->closedAt = $closedAt;
|
||||
|
||||
|
@ -67,7 +67,10 @@ class FoodOrder
|
|||
|
||||
public function isClosed(): bool
|
||||
{
|
||||
return $this->closedAt instanceof DateTimeImmutable && $this->closedAt->getTimestamp() <= (new DateTimeImmutable)->getTimestamp();
|
||||
if (! $this->closedAt instanceof DateTimeImmutable) {
|
||||
return false;
|
||||
}
|
||||
return $this->closedAt < new DateTimeImmutable;
|
||||
}
|
||||
|
||||
public function close(): static
|
||||
|
@ -131,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) && $orderItem->getFoodOrder() === $this) {
|
||||
if ($this->orderItems->removeElement($orderItem)) {
|
||||
$orderItem->setFoodOrder(null);
|
||||
}
|
||||
|
||||
|
|
|
@ -13,12 +13,6 @@ use Symfony\Component\Uid\Ulid;
|
|||
#[ORM\Entity(repositoryClass: FoodVendorRepository::class)]
|
||||
class FoodVendor
|
||||
{
|
||||
#[ORM\Id]
|
||||
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
|
||||
#[ORM\Column(type: UlidType::NAME, unique: true)]
|
||||
#[ORM\CustomIdGenerator(class: UlidGenerator::class)]
|
||||
private Ulid|null $id = null;
|
||||
|
||||
#[ORM\Column(length: 50)]
|
||||
private string|null $name = null;
|
||||
|
||||
|
@ -34,8 +28,16 @@ class FoodVendor
|
|||
#[ORM\OneToMany(targetEntity: MenuItem::class, mappedBy: 'foodVendor', orphanRemoval: true)]
|
||||
private Collection $menuItems;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
#[ORM\Column(length: 255, nullable: true)]
|
||||
private string|null $menuLink = null;
|
||||
|
||||
public function __construct(
|
||||
#[ORM\Id]
|
||||
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
|
||||
#[ORM\Column(type: UlidType::NAME, unique: true)]
|
||||
#[ORM\CustomIdGenerator(class: UlidGenerator::class)]
|
||||
private Ulid|null $id = new Ulid
|
||||
) {
|
||||
$this->foodOrders = new ArrayCollection;
|
||||
$this->menuItems = new ArrayCollection;
|
||||
}
|
||||
|
@ -78,7 +80,7 @@ class FoodVendor
|
|||
public function removeFoodOrder(FoodOrder $foodOrder): static
|
||||
{
|
||||
// set the owning side to null (unless already changed)
|
||||
if ($this->foodOrders->removeElement($foodOrder) && $foodOrder->getFoodVendor() === $this) {
|
||||
if ($this->foodOrders->removeElement($foodOrder)) {
|
||||
$foodOrder->setFoodVendor(null);
|
||||
}
|
||||
|
||||
|
@ -111,10 +113,22 @@ class FoodVendor
|
|||
public function removeMenuItem(MenuItem $menuItem): static
|
||||
{
|
||||
// set the owning side to null (unless already changed)
|
||||
if ($this->menuItems->removeElement($menuItem) && $menuItem->getFoodVendor() === $this) {
|
||||
if ($this->menuItems->removeElement($menuItem)) {
|
||||
$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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,12 +12,6 @@ use Symfony\Component\Uid\Ulid;
|
|||
#[ORM\Entity(repositoryClass: MenuItemRepository::class)]
|
||||
class MenuItem
|
||||
{
|
||||
#[ORM\Id]
|
||||
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
|
||||
#[ORM\Column(type: UlidType::NAME, unique: true)]
|
||||
#[ORM\CustomIdGenerator(class: UlidGenerator::class)]
|
||||
private Ulid|null $id = null;
|
||||
|
||||
#[ORM\Column(length: 255)]
|
||||
private string|null $name = null;
|
||||
|
||||
|
@ -28,6 +22,14 @@ class MenuItem
|
|||
#[ORM\Column(nullable: true)]
|
||||
private DateTimeImmutable|null $deletedAt = null;
|
||||
|
||||
public function __construct(
|
||||
#[ORM\Id]
|
||||
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
|
||||
#[ORM\Column(type: UlidType::NAME, unique: true)]
|
||||
#[ORM\CustomIdGenerator(class: UlidGenerator::class)]
|
||||
private Ulid|null $id = new Ulid
|
||||
) {}
|
||||
|
||||
public function getId(): Ulid|null
|
||||
{
|
||||
return $this->id;
|
||||
|
@ -64,7 +66,7 @@ class MenuItem
|
|||
|
||||
public function delete(): static
|
||||
{
|
||||
$this->setDeletedAt();
|
||||
$this->setDeletedAt(new DateTimeImmutable);
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,13 +2,11 @@
|
|||
|
||||
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
|
||||
{
|
||||
|
@ -31,12 +29,4 @@ final class FoodOrderType extends AbstractType
|
|||
$builder->setAction($action);
|
||||
}
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefaults([
|
||||
'data_class' => FoodOrder::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ final class FoodVendorType extends AbstractType
|
|||
{
|
||||
$builder
|
||||
->add('name')
|
||||
->add('menuLink')
|
||||
;
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@ 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
|
||||
{
|
||||
|
@ -13,17 +12,7 @@ final class UserNameFormType extends AbstractType
|
|||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
{
|
||||
$builder
|
||||
->add(child: 'username', options: [
|
||||
'required' => false,
|
||||
])
|
||||
->add(child: 'username')
|
||||
;
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefaults([
|
||||
// Configure your form options here
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,10 +19,8 @@ final class FoodOrderRepository extends ServiceEntityRepository
|
|||
parent::__construct($registry, FoodOrder::class);
|
||||
}
|
||||
|
||||
public function save(FoodOrder $order): void
|
||||
public function save(): void
|
||||
{
|
||||
$this->getEntityManager()
|
||||
->persist($order);
|
||||
$this->getEntityManager()
|
||||
->flush();
|
||||
}
|
||||
|
|
|
@ -1,100 +0,0 @@
|
|||
<?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;
|
||||
}
|
||||
}
|
|
@ -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://hannover.ccc.de/gitlab/lubiana/futtern/issues/new"
|
||||
href="https://git.hannover.ccc.de/lubiana/futtern/issues/new"
|
||||
target="_blank"
|
||||
>Create Issue</a>
|
||||
</nav>
|
||||
|
|
|
@ -11,6 +11,10 @@
|
|||
<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>
|
||||
|
||||
|
|
|
@ -7,6 +7,14 @@
|
|||
|
||||
{{ 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>
|
||||
|
|
|
@ -182,6 +182,38 @@ final class FoodOrderControllerTest extends DbWebTest
|
|||
self::assertSame(1, $this->repository->count([]));
|
||||
}
|
||||
|
||||
public function testOpen(): 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()));
|
||||
self::assertResponseRedirects("{$this->path}{$order->getId()}");
|
||||
$openOrder = $this->repository->find($order->getId());
|
||||
$this->assertFalse($openOrder->isClosed());
|
||||
}
|
||||
|
||||
public function testClose(): 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()));
|
||||
self::assertResponseRedirects("{$this->path}{$order->getId()}");
|
||||
$openOrder = $this->repository->find($order->getId());
|
||||
$this->assertTrue($openOrder->isClosed());
|
||||
}
|
||||
|
||||
private function generatePaginatedOrders(): void
|
||||
{
|
||||
foreach (range(1, 35) as $i) {
|
||||
|
|
|
@ -38,6 +38,7 @@ final class FoodVendorControllerTest extends DbWebTest
|
|||
{
|
||||
$fixture = new FoodVendor;
|
||||
$fixture->setName('My Title');
|
||||
$fixture->setMenuLink('https://example.com/');
|
||||
|
||||
$this->manager->persist($fixture);
|
||||
$this->manager->flush();
|
||||
|
@ -45,9 +46,17 @@ final class FoodVendorControllerTest extends DbWebTest
|
|||
$crawler = $this->client->request('GET', sprintf('%s%s', $this->path, $fixture->getId()));
|
||||
|
||||
$this->assertResponseIsSuccessful();
|
||||
|
||||
$nameNode = $crawler->filter('td')
|
||||
->last();
|
||||
$this->assertSame('My Title', $nameNode->text());
|
||||
$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);
|
||||
}
|
||||
|
||||
public function testShowMenuItems(): void
|
||||
|
@ -91,9 +100,10 @@ final class FoodVendorControllerTest extends DbWebTest
|
|||
$crawler = $this->client->request('GET', sprintf('%s%s', $this->path, $fixture->getId()));
|
||||
|
||||
$this->assertResponseIsSuccessful();
|
||||
$nameNode = $crawler->filter('td')
|
||||
->last();
|
||||
$this->assertSame('My Title', $nameNode->text());
|
||||
$nameNode = $crawler->filter(
|
||||
'.table > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)'
|
||||
)->text();
|
||||
$this->assertSame('My Title', $nameNode);
|
||||
|
||||
$itemNodes = $crawler->filter('li');
|
||||
|
||||
|
@ -108,10 +118,17 @@ final class FoodVendorControllerTest extends DbWebTest
|
|||
$this->manager->persist($fixture);
|
||||
$this->manager->flush();
|
||||
|
||||
$this->client->request('GET', sprintf('%s%s/edit', $this->path, $fixture->getId()));
|
||||
$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->submitForm('Update', [
|
||||
'food_vendor[name]' => 'Something New',
|
||||
'food_vendor[menuLink]' => 'https://example.com/',
|
||||
]);
|
||||
|
||||
self::assertResponseRedirects('/food/vendor/');
|
||||
|
@ -119,6 +136,7 @@ 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]
|
||||
|
|
|
@ -34,6 +34,21 @@ 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
|
||||
|
|
113
tests/Controller/MenuItemControllerTest.php
Normal file
113
tests/Controller/MenuItemControllerTest.php
Normal file
|
@ -0,0 +1,113 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Tests\Controller;
|
||||
|
||||
use App\Entity\FoodOrder;
|
||||
use App\Entity\FoodVendor;
|
||||
use App\Entity\MenuItem;
|
||||
use App\Tests\DbWebTest;
|
||||
use Override;
|
||||
|
||||
use function sprintf;
|
||||
|
||||
final class MenuItemControllerTest extends DbWebTest
|
||||
{
|
||||
private string $path = '/menu/item/';
|
||||
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 MenuItem::class;
|
||||
}
|
||||
|
||||
public function testShow(): void
|
||||
{
|
||||
$menuItem = new MenuItem;
|
||||
$menuItem->setName('Testing 1 2');
|
||||
|
||||
$this->vendor->addMenuItem($menuItem);
|
||||
$this->manager->persist($this->vendor);
|
||||
$this->manager->persist($menuItem);
|
||||
$this->manager->flush();
|
||||
|
||||
$crawler = $this->client->request('GET', "{$this->path}{$menuItem->getId()}");
|
||||
$idValue = $crawler->filter(
|
||||
'.table > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(2)'
|
||||
)->text();
|
||||
$nameValue = $crawler->filter(
|
||||
'.table > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2)'
|
||||
)->text();
|
||||
self::assertResponseStatusCodeSame(200);
|
||||
$this->assertEquals($idValue, $menuItem->getId());
|
||||
$this->assertEquals($nameValue, $menuItem->getName());
|
||||
}
|
||||
|
||||
public function testEdit(): void
|
||||
{
|
||||
$menuItem = new MenuItem;
|
||||
$menuItem->setName('Testing 1 2');
|
||||
|
||||
$this->vendor->addMenuItem($menuItem);
|
||||
$this->manager->persist($this->vendor);
|
||||
$this->manager->persist($menuItem);
|
||||
$this->manager->flush();
|
||||
|
||||
$crawler = $this->client->request('GET', sprintf('%s%s/edit', $this->path, $menuItem->getId()));
|
||||
$nameElem = $crawler->filter('#menu_item_name');
|
||||
$this->assertEquals(
|
||||
'Testing 1 2',
|
||||
$nameElem->attr('value')
|
||||
);
|
||||
|
||||
$this->client->submitForm('Update', [
|
||||
'menu_item[name]' => 'Testing-1',
|
||||
]);
|
||||
|
||||
self::assertResponseRedirects(sprintf('/menu/item/%s', $menuItem->getId()));
|
||||
}
|
||||
|
||||
public function testDelete(): void
|
||||
{
|
||||
$menuItem = new MenuItem;
|
||||
$menuItem->setName('Testing 1 2');
|
||||
|
||||
$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());
|
||||
|
||||
$this->client->request('GET', "{$this->path}{$menuItem->getId()}");
|
||||
$this->client->submitForm('Delete', []);
|
||||
|
||||
$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();
|
||||
|
||||
}
|
||||
}
|
|
@ -8,6 +8,7 @@ use App\Entity\MenuItem;
|
|||
use App\Entity\OrderItem;
|
||||
use App\Repository\MenuItemRepository;
|
||||
use App\Tests\DbWebTest;
|
||||
use DateTimeImmutable;
|
||||
use Override;
|
||||
|
||||
use function sprintf;
|
||||
|
@ -37,6 +38,16 @@ 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();
|
||||
|
||||
|
@ -45,11 +56,16 @@ final class OrderItemControllerTest extends DbWebTest
|
|||
|
||||
public function testNew(): void
|
||||
{
|
||||
$this->client->request(
|
||||
$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);
|
||||
|
||||
self::assertResponseStatusCodeSame(200);
|
||||
|
||||
$this->client->submitForm('Save', [
|
||||
|
@ -60,7 +76,26 @@ 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([]));
|
||||
self::assertSame(1, $this->menuItemRepository->count([
|
||||
'foodVendor' => $this->vendor->getId(),
|
||||
]));
|
||||
}
|
||||
|
||||
public function testNewOrderClosed(): 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())
|
||||
);
|
||||
|
||||
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
|
||||
|
||||
self::assertSame(0, $this->repository->count([]));
|
||||
}
|
||||
|
||||
public function testNewCreateMenuItem(): void
|
||||
|
@ -80,7 +115,7 @@ final class OrderItemControllerTest extends DbWebTest
|
|||
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
|
||||
|
||||
self::assertSame(1, $this->repository->count([]));
|
||||
self::assertSame(2, $this->menuItemRepository->count([]));
|
||||
self::assertSame(3, $this->menuItemRepository->count([]));
|
||||
}
|
||||
|
||||
public function testRemove(): void
|
||||
|
@ -101,6 +136,26 @@ final class OrderItemControllerTest extends DbWebTest
|
|||
self::assertSame(0, $this->repository->count([]));
|
||||
}
|
||||
|
||||
public function testOrderClosed(): 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()));
|
||||
|
||||
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
|
||||
self::assertSame(1, $this->repository->count([]));
|
||||
}
|
||||
|
||||
public function testEdit(): void
|
||||
{
|
||||
$orderItem = new OrderItem;
|
||||
|
@ -124,6 +179,35 @@ final class OrderItemControllerTest extends DbWebTest
|
|||
'My Extra',
|
||||
$extrasElem->attr('value')
|
||||
);
|
||||
|
||||
$this->client->submitForm('Update', [
|
||||
'order_item[name]' => 'Testing-1',
|
||||
'order_item[extras]' => 'Testing-1',
|
||||
]);
|
||||
|
||||
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
|
||||
|
||||
self::assertSame(1, $this->repository->count([]));
|
||||
self::assertSame(3, $this->menuItemRepository->count([]));
|
||||
|
||||
}
|
||||
|
||||
public function testEditOrderClosed(): 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()));
|
||||
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
|
||||
}
|
||||
|
||||
public function testCopy(): void
|
||||
|
@ -150,6 +234,28 @@ final class OrderItemControllerTest extends DbWebTest
|
|||
}
|
||||
}
|
||||
|
||||
public function testCopyOrderClosed(): 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()));
|
||||
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
|
||||
|
||||
$result = $this->repository->findBy([
|
||||
'foodOrder' => $this->order->getId(),
|
||||
]);
|
||||
$this->assertCount(1, $result);
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function getEntityClass(): string
|
||||
{
|
||||
|
|
24
tests/Entity/FoodOrderTest.php
Normal file
24
tests/Entity/FoodOrderTest.php
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Tests\Entity;
|
||||
|
||||
use App\Entity\FoodOrder;
|
||||
use App\Entity\OrderItem;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
final class FoodOrderTest extends TestCase
|
||||
{
|
||||
public function testFoodOrder(): void
|
||||
{
|
||||
$order = new FoodOrder;
|
||||
$orderItem = new OrderItem;
|
||||
$this->assertCount(0, $order->getOrderItems());
|
||||
$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());
|
||||
}
|
||||
}
|
63
tests/Entity/FoodVendorTest.php
Normal file
63
tests/Entity/FoodVendorTest.php
Normal file
|
@ -0,0 +1,63 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Tests\Entity;
|
||||
|
||||
use App\Entity\FoodOrder;
|
||||
use App\Entity\FoodVendor;
|
||||
use App\Entity\MenuItem;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Uid\Ulid;
|
||||
|
||||
final class FoodVendorTest extends TestCase
|
||||
{
|
||||
public function testFoodVendor(): void
|
||||
{
|
||||
$vendor = new FoodVendor;
|
||||
$vendor->setName('Test');
|
||||
$this->assertEquals('Test', $vendor->getName());
|
||||
$this->assertInstanceOf(Ulid::class, $vendor->getId());
|
||||
|
||||
$this->assertCount(0, $vendor->getFoodOrders());
|
||||
$order1 = new FoodOrder;
|
||||
$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());
|
||||
$vendor->addMenuItem($menuItem1);
|
||||
$vendor->addMenuItem($menuItem1);
|
||||
$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());
|
||||
}
|
||||
}
|
30
tests/Entity/MenuItemTest.php
Normal file
30
tests/Entity/MenuItemTest.php
Normal file
|
@ -0,0 +1,30 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Tests\Entity;
|
||||
|
||||
use App\Entity\FoodVendor;
|
||||
use App\Entity\MenuItem;
|
||||
use DateTimeImmutable;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
final class MenuItemTest extends TestCase
|
||||
{
|
||||
public function testMenuItem(): void
|
||||
{
|
||||
$item = new MenuItem;
|
||||
$item->setName('Test');
|
||||
$this->assertEquals('Test', $item->getName());
|
||||
|
||||
$vendor = new FoodVendor;
|
||||
$vendor->setName('Test');
|
||||
|
||||
$item->setFoodVendor($vendor);
|
||||
$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());
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue