feat(db): add entities

This commit is contained in:
2024-08-02 14:13:25 +02:00
parent 07d7a3025a
commit 857507abe5
17 changed files with 652 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
<?php
declare(strict_types=1);
namespace App\Tests\Common;
use Doctrine\ORM\EntityManagerInterface;
trait DatabaseTestTrait
{
protected ?EntityManagerInterface $em;
protected function bootDatabase(): void
{
/**
* @var EntityManagerInterface $em
*/
$em = $this->getContainer()->get(EntityManagerInterface::class);
$this->em = $em;
$this->em->getConnection()->executeQuery(<<<EOSQL
DO $$
DECLARE row RECORD;
BEGIN
FOR row IN SELECT table_name
FROM information_schema.tables
WHERE table_type='BASE TABLE'
AND table_schema='public'
LOOP
EXECUTE format('TRUNCATE TABLE %I CASCADE;',row.table_name);
END LOOP;
END;
$$;
EOSQL);
}
protected function getEntityManager(): EntityManagerInterface
{
if ($this->em === null) {
throw new \LogicException('Database has not been booted yet.');
}
return $this->em;
}
protected function getEntityCount(string $entityClass): int
{
return (int) $this->getEntityManager()->createQuery('SELECT COUNT(e) FROM ' . $entityClass . ' e')->getSingleScalarResult();
}
}

View File

@@ -0,0 +1,27 @@
<?php
declare(strict_types=1);
namespace App\Tests\Common;
use Faker\Factory;
use Faker\Generator;
trait FakerTrait
{
private ?Generator $faker;
protected function bootFaker(): void
{
$this->faker = Factory::create();
}
protected function getFaker(): Generator
{
if ($this->faker === null) {
throw new \LogicException('Faker has not been booted yet.');
}
return $this->faker;
}
}

View File

@@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace App\Tests\Common\Generators;
use App\Entity\Database\Comments\Comment;
use App\Entity\Database\Posts\Post;
use App\Tests\Common\DatabaseTestTrait;
use App\Tests\Common\FakerTrait;
trait CommentGeneratorTrait
{
use FakerTrait;
use DatabaseTestTrait;
private function createComment(int $id, Post $post): Comment
{
$comment = new Comment(
$id,
$post,
$this->getFaker()->name(),
$this->getFaker()->email(),
$this->getFaker()->text(500)
);
$this->getEntityManager()->persist($comment);
$this->getEntityManager()->flush();
$this->getEntityManager()->refresh($post);
return $comment;
}
}

View File

@@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
namespace App\Tests\Common\Generators;
use App\Entity\Database\Posts\Post;
use App\Tests\Common\DatabaseTestTrait;
use App\Tests\Common\FakerTrait;
use Doctrine\Common\Collections\ArrayCollection;
trait PostGeneratorTrait
{
use UserGeneratorTrait;
use FakerTrait;
use DatabaseTestTrait;
private const int POST_GENERATOR_SYSTEM_POST_USER = 1000;
private function createPost(int $id): Post
{
$user = $this->createUser($id + self::POST_GENERATOR_SYSTEM_POST_USER);
$post = new Post(
$id,
$user,
$this->getFaker()->text(500),
$this->getFaker()->text(5000),
new ArrayCollection(),
);
$this->getEntityManager()->persist($post);
$this->getEntityManager()->flush();
return $post;
}
}

View File

@@ -0,0 +1,55 @@
<?php
declare(strict_types=1);
namespace App\Tests\Common\Generators;
use App\Entity\Database\Users\Address;
use App\Entity\Database\Users\Company;
use App\Entity\Database\Users\User;
use App\Tests\Common\DatabaseTestTrait;
use App\Tests\Common\FakerTrait;
use Doctrine\Common\Collections\ArrayCollection;
trait UserGeneratorTrait
{
use FakerTrait;
use DatabaseTestTrait;
private function createUser(int $id): User
{
$user = new User(
$id,
$this->getFaker()->name(),
$this->getFaker()->userName(),
$this->getFaker()->email(),
$this->getFaker()->phoneNumber(),
$this->getFaker()->url(),
new Address(
1,
null,
$this->getFaker()->streetAddress(),
(string) $this->getFaker()->randomNumber(),
$this->getFaker()->city(),
$this->getFaker()->postcode(),
$this->getFaker()->randomNumber(),
$this->getFaker()->randomNumber(),
),
new Company(
1,
new ArrayCollection(),
$this->getFaker()->company(),
$this->getFaker()->text(10),
$this->getFaker()->text(100)
)
);
$this->getEntityManager()->persist($user->address);
$this->getEntityManager()->persist($user->company);
$this->getEntityManager()->persist($user);
$this->getEntityManager()->refresh($user->address);
$this->getEntityManager()->refresh($user->company);
$this->getEntityManager()->flush();
return $user;
}
}