add mutation testing #61
22 changed files with 1239 additions and 247 deletions
|
@ -23,7 +23,16 @@ jobs:
|
||||||
- name: lint
|
- name: lint
|
||||||
run: composer lint
|
run: composer lint
|
||||||
- name: test
|
- name: test
|
||||||
run: composer test
|
run: composer mutation
|
||||||
|
- name: Add comment to pull request
|
||||||
|
run: |
|
||||||
|
cat var/log/infection.txt >> /tmp/pull-request-comment
|
||||||
|
cat var/log/summary.log >> /tmp/pull-request-comment
|
||||||
|
curl -X POST \
|
||||||
|
-H "Authorization: token ${GITHUB_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"body": "$(cat /tmp/pull-request-comment)"}' \
|
||||||
|
"${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}/issues/${GITHUB_EVENT_PULL_REQUEST_NUMBER}/comments"
|
||||||
- name: GIT commit and push all changed files
|
- name: GIT commit and push all changed files
|
||||||
env:
|
env:
|
||||||
CI_COMMIT_MESSAGE: Continuous Integration Fixes
|
CI_COMMIT_MESSAGE: Continuous Integration Fixes
|
||||||
|
|
|
@ -27,7 +27,7 @@ jobs:
|
||||||
- name: lint
|
- name: lint
|
||||||
run: composer lint
|
run: composer lint
|
||||||
- name: test
|
- name: test
|
||||||
run: composer test
|
run: composer mutation
|
||||||
- name: GIT commit and push all changed files
|
- name: GIT commit and push all changed files
|
||||||
env:
|
env:
|
||||||
CI_COMMIT_MESSAGE: Continuous Integration Fixes
|
CI_COMMIT_MESSAGE: Continuous Integration Fixes
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
"symfony/yaml": "7.1.*"
|
"symfony/yaml": "7.1.*"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
|
"infection/infection": "^0.29.6",
|
||||||
"lubiana/code-quality": "^1.7.2",
|
"lubiana/code-quality": "^1.7.2",
|
||||||
"phpunit/phpunit": "^9.6.20",
|
"phpunit/phpunit": "^9.6.20",
|
||||||
"symfony/browser-kit": "7.1.*",
|
"symfony/browser-kit": "7.1.*",
|
||||||
|
@ -38,7 +39,8 @@
|
||||||
"php-http/discovery": true,
|
"php-http/discovery": true,
|
||||||
"symfony/flex": true,
|
"symfony/flex": true,
|
||||||
"symfony/runtime": true,
|
"symfony/runtime": true,
|
||||||
"dealerdirect/phpcodesniffer-composer-installer": true
|
"dealerdirect/phpcodesniffer-composer-installer": true,
|
||||||
|
"infection/extension-installer": true
|
||||||
},
|
},
|
||||||
"sort-packages": true,
|
"sort-packages": true,
|
||||||
"platform": {
|
"platform": {
|
||||||
|
@ -81,7 +83,8 @@
|
||||||
"rector",
|
"rector",
|
||||||
"ecs --fix || ecs --fix"
|
"ecs --fix || ecs --fix"
|
||||||
],
|
],
|
||||||
"test": "bin/phpunit"
|
"test": "bin/phpunit",
|
||||||
|
"mutation": "infection --threads=8 --show-mutations"
|
||||||
},
|
},
|
||||||
"conflict": {
|
"conflict": {
|
||||||
"symfony/symfony": "*"
|
"symfony/symfony": "*"
|
||||||
|
|
1126
composer.lock
generated
1126
composer.lock
generated
File diff suppressed because it is too large
Load diff
19
infection.json5
Normal file
19
infection.json5
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"$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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,8 @@
|
||||||
colors="true"
|
colors="true"
|
||||||
bootstrap="tests/bootstrap.php"
|
bootstrap="tests/bootstrap.php"
|
||||||
convertDeprecationsToExceptions="true"
|
convertDeprecationsToExceptions="true"
|
||||||
|
executionOrder="random"
|
||||||
|
resolveDependencies="true"
|
||||||
>
|
>
|
||||||
<php>
|
<php>
|
||||||
<ini name="display_errors" value="1" />
|
<ini name="display_errors" value="1" />
|
||||||
|
@ -28,10 +30,6 @@
|
||||||
<include>
|
<include>
|
||||||
<directory suffix=".php">src</directory>
|
<directory suffix=".php">src</directory>
|
||||||
</include>
|
</include>
|
||||||
<exclude>
|
|
||||||
<directory suffix=".php">src/Command</directory>
|
|
||||||
<file>src/Service/FakeData.php</file>
|
|
||||||
</exclude>
|
|
||||||
</coverage>
|
</coverage>
|
||||||
|
|
||||||
<listeners>
|
<listeners>
|
||||||
|
|
|
@ -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'])]
|
#[Route('/{id}/close', name: 'app_food_order_close', methods: ['GET'])]
|
||||||
public function close(FoodOrder $foodOrder, FoodOrderRepository $repository): Response
|
public function close(FoodOrder $foodOrder, FoodOrderRepository $repository): Response
|
||||||
{
|
{
|
||||||
$repository->save($foodOrder->close());
|
$foodOrder->close();
|
||||||
|
$repository->save();
|
||||||
return $this->redirectToRoute('app_food_order_show', [
|
return $this->redirectToRoute('app_food_order_show', [
|
||||||
'id' => $foodOrder->getId(),
|
'id' => $foodOrder->getId(),
|
||||||
], Response::HTTP_SEE_OTHER);
|
], Response::HTTP_SEE_OTHER);
|
||||||
|
@ -104,7 +105,8 @@ final class FoodOrderController extends AbstractController
|
||||||
#[Route('/{id}/open', name: 'app_food_order_open', methods: ['GET'])]
|
#[Route('/{id}/open', name: 'app_food_order_open', methods: ['GET'])]
|
||||||
public function open(FoodOrder $foodOrder, FoodOrderRepository $repository): Response
|
public function open(FoodOrder $foodOrder, FoodOrderRepository $repository): Response
|
||||||
{
|
{
|
||||||
$repository->save($foodOrder->open());
|
$foodOrder->open();
|
||||||
|
$repository->save();
|
||||||
return $this->redirectToRoute('app_food_order_show', [
|
return $this->redirectToRoute('app_food_order_show', [
|
||||||
'id' => $foodOrder->getId(),
|
'id' => $foodOrder->getId(),
|
||||||
], Response::HTTP_SEE_OTHER);
|
], Response::HTTP_SEE_OTHER);
|
||||||
|
|
|
@ -46,7 +46,6 @@ final class MenuItemController extends AbstractController
|
||||||
{
|
{
|
||||||
if ($this->isCsrfTokenValid('delete' . $menuItem->getId(), $request->getPayload()->getString('_token'))) {
|
if ($this->isCsrfTokenValid('delete' . $menuItem->getId(), $request->getPayload()->getString('_token'))) {
|
||||||
$menuItem->delete();
|
$menuItem->delete();
|
||||||
$entityManager->persist($menuItem);
|
|
||||||
$entityManager->flush();
|
$entityManager->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -134,7 +134,7 @@ class FoodOrder
|
||||||
public function removeOrderItem(OrderItem $orderItem): static
|
public function removeOrderItem(OrderItem $orderItem): static
|
||||||
{
|
{
|
||||||
// set the owning side to null (unless already changed)
|
// 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);
|
$orderItem->setFoodOrder(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ class FoodVendor
|
||||||
public function removeFoodOrder(FoodOrder $foodOrder): static
|
public function removeFoodOrder(FoodOrder $foodOrder): static
|
||||||
{
|
{
|
||||||
// set the owning side to null (unless already changed)
|
// 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);
|
$foodOrder->setFoodVendor(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,7 +113,7 @@ class FoodVendor
|
||||||
public function removeMenuItem(MenuItem $menuItem): static
|
public function removeMenuItem(MenuItem $menuItem): static
|
||||||
{
|
{
|
||||||
// set the owning side to null (unless already changed)
|
// 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);
|
$menuItem->setFoodVendor(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,13 +2,11 @@
|
||||||
|
|
||||||
namespace App\Form;
|
namespace App\Form;
|
||||||
|
|
||||||
use App\Entity\FoodOrder;
|
|
||||||
use App\Entity\FoodVendor;
|
use App\Entity\FoodVendor;
|
||||||
use Override;
|
use Override;
|
||||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||||
use Symfony\Component\Form\AbstractType;
|
use Symfony\Component\Form\AbstractType;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
|
||||||
|
|
||||||
final class FoodOrderType extends AbstractType
|
final class FoodOrderType extends AbstractType
|
||||||
{
|
{
|
||||||
|
@ -31,12 +29,4 @@ final class FoodOrderType extends AbstractType
|
||||||
$builder->setAction($action);
|
$builder->setAction($action);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Override]
|
|
||||||
public function configureOptions(OptionsResolver $resolver): void
|
|
||||||
{
|
|
||||||
$resolver->setDefaults([
|
|
||||||
'data_class' => FoodOrder::class,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ namespace App\Form;
|
||||||
use Override;
|
use Override;
|
||||||
use Symfony\Component\Form\AbstractType;
|
use Symfony\Component\Form\AbstractType;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
|
||||||
|
|
||||||
final class UserNameFormType extends AbstractType
|
final class UserNameFormType extends AbstractType
|
||||||
{
|
{
|
||||||
|
@ -13,17 +12,7 @@ final class UserNameFormType extends AbstractType
|
||||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||||
{
|
{
|
||||||
$builder
|
$builder
|
||||||
->add(child: 'username', options: [
|
->add(child: 'username')
|
||||||
'required' => false,
|
|
||||||
])
|
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[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);
|
parent::__construct($registry, FoodOrder::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function save(FoodOrder $order): void
|
public function save(): void
|
||||||
{
|
{
|
||||||
$this->getEntityManager()
|
|
||||||
->persist($order);
|
|
||||||
$this->getEntityManager()
|
$this->getEntityManager()
|
||||||
->flush();
|
->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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -118,7 +118,13 @@ final class FoodVendorControllerTest extends DbWebTest
|
||||||
$this->manager->persist($fixture);
|
$this->manager->persist($fixture);
|
||||||
$this->manager->flush();
|
$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', [
|
$this->client->submitForm('Update', [
|
||||||
'food_vendor[name]' => 'Something New',
|
'food_vendor[name]' => 'Something New',
|
||||||
|
|
|
@ -34,6 +34,21 @@ final class HomeControllerTest extends DbWebTest
|
||||||
self::assertResponseStatusCodeSame(302);
|
self::assertResponseStatusCodeSame(302);
|
||||||
self::assertResponseHeaderSame('Location', '/food/order/list');
|
self::assertResponseHeaderSame('Location', '/food/order/list');
|
||||||
self::assertResponseCookieValueSame('username', 'Testing-1');
|
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
|
public function testRemoveUsername(): void
|
||||||
|
|
|
@ -38,6 +38,16 @@ final class OrderItemControllerTest extends DbWebTest
|
||||||
$this->menuItem->setName('Testing');
|
$this->menuItem->setName('Testing');
|
||||||
$this->menuItem->setFoodVendor($this->vendor);
|
$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->persist($this->menuItem);
|
||||||
$this->manager->flush();
|
$this->manager->flush();
|
||||||
|
|
||||||
|
@ -46,11 +56,16 @@ final class OrderItemControllerTest extends DbWebTest
|
||||||
|
|
||||||
public function testNew(): void
|
public function testNew(): void
|
||||||
{
|
{
|
||||||
$this->client->request(
|
$crawler = $this->client->request(
|
||||||
'GET',
|
'GET',
|
||||||
sprintf('%snew/%s', $this->path, $this->order->getId())
|
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);
|
self::assertResponseStatusCodeSame(200);
|
||||||
|
|
||||||
$this->client->submitForm('Save', [
|
$this->client->submitForm('Save', [
|
||||||
|
@ -61,7 +76,9 @@ final class OrderItemControllerTest extends DbWebTest
|
||||||
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
|
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
|
||||||
|
|
||||||
self::assertSame(1, $this->repository->count([]));
|
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
|
public function testNewOrderClosed(): void
|
||||||
|
@ -98,7 +115,7 @@ final class OrderItemControllerTest extends DbWebTest
|
||||||
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
|
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
|
||||||
|
|
||||||
self::assertSame(1, $this->repository->count([]));
|
self::assertSame(1, $this->repository->count([]));
|
||||||
self::assertSame(2, $this->menuItemRepository->count([]));
|
self::assertSame(3, $this->menuItemRepository->count([]));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testRemove(): void
|
public function testRemove(): void
|
||||||
|
@ -171,7 +188,7 @@ final class OrderItemControllerTest extends DbWebTest
|
||||||
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
|
self::assertResponseRedirects(sprintf('/food/order/%s', $this->order->getId()));
|
||||||
|
|
||||||
self::assertSame(1, $this->repository->count([]));
|
self::assertSame(1, $this->repository->count([]));
|
||||||
self::assertSame(2, $this->menuItemRepository->count([]));
|
self::assertSame(3, $this->menuItemRepository->count([]));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,9 @@ final class FoodOrderTest extends TestCase
|
||||||
$order->addOrderItem($orderItem);
|
$order->addOrderItem($orderItem);
|
||||||
$order->addOrderItem($orderItem);
|
$order->addOrderItem($orderItem);
|
||||||
$this->assertCount(1, $order->getOrderItems());
|
$this->assertCount(1, $order->getOrderItems());
|
||||||
|
$this->assertSame($order, $orderItem->getFoodOrder());
|
||||||
$order->removeOrderItem($orderItem);
|
$order->removeOrderItem($orderItem);
|
||||||
$this->assertCount(0, $order->getOrderItems());
|
$this->assertCount(0, $order->getOrderItems());
|
||||||
|
$this->assertNull($orderItem->getFoodOrder());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,9 +22,16 @@ final class FoodVendorTest extends TestCase
|
||||||
$vendor->addFoodOrder($order1);
|
$vendor->addFoodOrder($order1);
|
||||||
$vendor->addFoodOrder($order1);
|
$vendor->addFoodOrder($order1);
|
||||||
$this->assertCount(1, $vendor->getFoodOrders());
|
$this->assertCount(1, $vendor->getFoodOrders());
|
||||||
|
$this->assertSame($vendor, $order1->getFoodVendor());
|
||||||
$vendor->removeFoodOrder($order1);
|
$vendor->removeFoodOrder($order1);
|
||||||
$this->assertCount(0, $vendor->getFoodOrders());
|
$this->assertCount(0, $vendor->getFoodOrders());
|
||||||
|
$this->assertNull($order1->getFoodVendor());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testMenuItem(): void
|
||||||
|
{
|
||||||
|
$vendor = new FoodVendor;
|
||||||
$menuItem1 = new MenuItem;
|
$menuItem1 = new MenuItem;
|
||||||
$menuItem2 = new MenuItem;
|
$menuItem2 = new MenuItem;
|
||||||
$this->assertCount(0, $vendor->getMenuItems());
|
$this->assertCount(0, $vendor->getMenuItems());
|
||||||
|
@ -33,11 +40,24 @@ final class FoodVendorTest extends TestCase
|
||||||
$this->assertCount(1, $vendor->getMenuItems());
|
$this->assertCount(1, $vendor->getMenuItems());
|
||||||
$vendor->removeMenuItem($menuItem1);
|
$vendor->removeMenuItem($menuItem1);
|
||||||
$this->assertCount(0, $vendor->getMenuItems());
|
$this->assertCount(0, $vendor->getMenuItems());
|
||||||
|
$this->assertNull($menuItem1->getFoodVendor());
|
||||||
$vendor->addMenuItem($menuItem1);
|
$vendor->addMenuItem($menuItem1);
|
||||||
$menuItem2->delete();
|
$menuItem2->delete();
|
||||||
$vendor->addMenuItem($menuItem2);
|
$vendor->addMenuItem($menuItem2);
|
||||||
$this->assertCount(1, $vendor->getMenuItems());
|
$this->assertCount(1, $vendor->getMenuItems());
|
||||||
$this->assertCount(2, $vendor->getMenuItems(true));
|
$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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ namespace App\Tests\Entity;
|
||||||
|
|
||||||
use App\Entity\FoodVendor;
|
use App\Entity\FoodVendor;
|
||||||
use App\Entity\MenuItem;
|
use App\Entity\MenuItem;
|
||||||
|
use DateTimeImmutable;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
final class MenuItemTest extends TestCase
|
final class MenuItemTest extends TestCase
|
||||||
|
@ -21,7 +22,9 @@ final class MenuItemTest extends TestCase
|
||||||
$this->assertEquals($vendor, $item->getFoodVendor());
|
$this->assertEquals($vendor, $item->getFoodVendor());
|
||||||
|
|
||||||
$this->assertFalse($item->isDeleted());
|
$this->assertFalse($item->isDeleted());
|
||||||
|
$this->assertNull($item->getDeletedAt());
|
||||||
$item->delete();
|
$item->delete();
|
||||||
$this->assertTrue($item->isDeleted());
|
$this->assertTrue($item->isDeleted());
|
||||||
|
$this->assertInstanceOf(DateTimeImmutable::class, $item->getDeletedAt());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue