From 9052262a008f2e3fc0cdb6aaa1eb33c58aa4d1fa Mon Sep 17 00:00:00 2001 From: cmorenov1402 Date: Fri, 28 Mar 2025 11:30:32 +0100 Subject: [PATCH] Create Factories --- src/Factory/Project/ProjectFactory.php | 12 ++++++----- src/Factory/User/UserFactory.php | 30 ++++++++------------------ tests/Entity/ProjectApi/BaseTest.php | 15 +++++++------ 3 files changed, 25 insertions(+), 32 deletions(-) diff --git a/src/Factory/Project/ProjectFactory.php b/src/Factory/Project/ProjectFactory.php index 7d6fdfc..efdb28c 100644 --- a/src/Factory/Project/ProjectFactory.php +++ b/src/Factory/Project/ProjectFactory.php @@ -6,6 +6,7 @@ use App\Entity\Project\Category; use App\Entity\Project\Project; use App\Entity\Project\ProjectDeadline; use App\Entity\Project\ProjectStatus; +use App\Entity\Project\ProjectTerritory; use App\Factory\User\UserFactory; use Zenstruck\Foundry\Persistence\PersistentProxyObjectFactory; @@ -35,13 +36,14 @@ final class ProjectFactory extends PersistentProxyObjectFactory { return [ 'category' => self::faker()->randomElement(Category::cases()), - 'dateCreated' => self::faker()->dateTime(), - 'dateUpdated' => self::faker()->dateTime(), + // 'dateCreated' => self::faker()->dateTime(), + // 'dateUpdated' => self::faker()->dateTime(), 'deadline' => self::faker()->randomElement(ProjectDeadline::cases()), 'description' => self::faker()->text(), - 'locales' => [], - 'migrated' => self::faker()->boolean(), - 'owner' => UserFactory::new(), + 'territory' => new ProjectTerritory('ES'), + // 'locales' => [], + // 'migrated' => self::faker()->boolean(), + 'owner' => UserFactory::createOne(), 'status' => self::faker()->randomElement(ProjectStatus::cases()), 'subtitle' => self::faker()->text(255), 'title' => self::faker()->text(255), diff --git a/src/Factory/User/UserFactory.php b/src/Factory/User/UserFactory.php index 34131d6..461f07e 100644 --- a/src/Factory/User/UserFactory.php +++ b/src/Factory/User/UserFactory.php @@ -4,6 +4,7 @@ namespace App\Factory\User; use App\Entity\User\User; use App\Entity\User\UserType; +use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; use Zenstruck\Foundry\Persistence\PersistentProxyObjectFactory; /** @@ -11,46 +12,33 @@ use Zenstruck\Foundry\Persistence\PersistentProxyObjectFactory; */ final class UserFactory extends PersistentProxyObjectFactory { - /** - * @see https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#factories-as-services - * - * @todo inject services if required - */ - public function __construct() {} + public function __construct(private UserPasswordHasherInterface $passwordHasher) {} public static function class(): string { return User::class; } - /** - * @see https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#model-factories - * - * @todo add your default values here - */ protected function defaults(): array|callable { return [ 'active' => self::faker()->boolean(), 'dateCreated' => self::faker()->dateTime(), 'dateUpdated' => self::faker()->dateTime(), - 'email' => self::faker()->text(255), + 'email' => self::faker()->email(), 'emailConfirmed' => self::faker()->boolean(), - 'handle' => self::faker()->text(255), + 'handle' => self::faker()->userName(), 'migrated' => self::faker()->boolean(), - 'password' => self::faker()->text(), + 'password' => self::faker()->password(), 'roles' => [], - 'type' => self::faker()->randomElement(UserType::cases()), + 'type' => UserType::Individual, ]; } - /** - * @see https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#initialization - */ protected function initialize(): static { - return $this - // ->afterInstantiate(function(User $user): void {}) - ; + return $this->afterInstantiate(function (User $user) { + $user->setPassword($this->passwordHasher->hashPassword($user, $user->getPassword())); + }); } } diff --git a/tests/Entity/ProjectApi/BaseTest.php b/tests/Entity/ProjectApi/BaseTest.php index a99a983..915f080 100644 --- a/tests/Entity/ProjectApi/BaseTest.php +++ b/tests/Entity/ProjectApi/BaseTest.php @@ -12,11 +12,13 @@ use App\Entity\Project\ProjectTerritory; use App\Entity\User\User; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\HttpFoundation\Response; +use Zenstruck\Foundry\Test\Factories; use Zenstruck\Foundry\Test\ResetDatabase; abstract class BaseTest extends ApiTestCase { use ResetDatabase; + use Factories; protected EntityManagerInterface $entityManager; private const USER_EMAIL = 'testuser@example.com'; @@ -47,11 +49,13 @@ abstract class BaseTest extends ApiTestCase return self::BASE_URI.$param; } - protected function createTestUser(): User - { + protected function createTestUser( + string $handle = 'test_user', + string $email = self::USER_EMAIL, + ): User { $user = new User(); - $user->setHandle('test_user'); - $user->setEmail(self::USER_EMAIL); + $user->setHandle($handle); + $user->setEmail($email); $passwordHasher = static::getContainer()->get('security.user_password_hasher'); $user->setPassword($passwordHasher->hashPassword($user, self::USER_PASSWORD)); @@ -179,8 +183,7 @@ abstract class BaseTest extends ApiTestCase protected function testForbidden(): void { - $otherUser = $this->createTestUser() - ->setHandle('other_user')->setEmail('otheruser@example.com'); + $otherUser = $this->createTestUser('other_user', 'otheruser@example.com'); $otherProject = $this->createTestProject()->setOwner($otherUser); $this->entityManager->persist($otherProject); $this->prepareTestUser();