Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add factories to generate fixtures #994

Draft
wants to merge 1 commit into
base: 2.2.x
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 2 additions & 3 deletions bin/phpunit
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,8 @@ if (PHP_VERSION_ID < 80000) {
(function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
|| (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
) {
include("phpvfscomposer://" . __DIR__ . '/..'.'/vendor/phpunit/phpunit/phpunit');
exit(0);
return include("phpvfscomposer://" . __DIR__ . '/..'.'/vendor/phpunit/phpunit/phpunit');
}
}

include __DIR__ . '/..'.'/vendor/phpunit/phpunit/phpunit';
return include __DIR__ . '/..'.'/vendor/phpunit/phpunit/phpunit';
8 changes: 1 addition & 7 deletions config/packages/doctrine.yaml
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
doctrine:
dbal:
driver: '%env(database_driver)%'
host: '%env(database_host)%'
port: '%env(int:database_port)%'
dbname: '%env(database_name)%'
user: '%env(database_user)%'
password: '%env(database_password)%'
server_version: '%env(database_version)%'
url: '%env(DATABASE_URL)%'
charset: UTF8
types:
uuid: Ramsey\Uuid\Doctrine\UuidType
Expand Down
8 changes: 0 additions & 8 deletions config/services.yaml
Original file line number Diff line number Diff line change
@@ -1,12 +1,4 @@
parameters:
env(database_driver): 'pdo_mysql'
env(database_host): '127.0.0.1'
env(database_port): '3306'
env(database_name): 'solidinvoice'
env(database_user): 'root'
env(database_password): ~
env(database_version): '1.0'

env(mailer_transport): 'sendmail'
env(mailer_host): '127.0.0.1'
env(mailer_user): ~
Expand Down
75 changes: 58 additions & 17 deletions src/ClientBundle/DataFixtures/ORM/LoadData.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,33 +14,74 @@
namespace SolidInvoice\ClientBundle\DataFixtures\ORM;

use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager;
use SolidInvoice\ClientBundle\Entity\Client;
use SolidInvoice\ClientBundle\Entity\Contact;
use SolidInvoice\ClientBundle\Test\Factory\AdditionalContactDetailFactory;
use SolidInvoice\ClientBundle\Test\Factory\ClientFactory;
use SolidInvoice\ClientBundle\Test\Factory\ContactFactory;
use SolidInvoice\CoreBundle\DataFixtures\LoadData as CoreFixture;
use SolidInvoice\CoreBundle\Entity\Company;
use SolidInvoice\CoreBundle\Test\Factory\CompanyFactory;
use Zenstruck\Foundry\Proxy;

/**
* @codeCoverageIgnore
*/
class LoadData extends Fixture
class LoadData extends Fixture implements DependentFixtureInterface
{
public function load(ObjectManager $manager): void
{
$client = new Client();
$client->setName('Test');
$client->setCurrencyCode('USD');
$client->setCompany($manager->getRepository(Company::class)->findOneBy([]));

$contact = new Contact();
$contact->setFirstName('Test');
$contact->setEmail('test@example.com');
$client->addContact($contact);

$this->setReference('client', $client);
$this->setReference('contact', $contact);

$manager->persist($contact);
$manager->persist($client);
$manager->flush();
$clients = ClientFactory::createMany(100, static function () {
$company = CompanyFactory::random();
return [
'company' => $company,
];
});

foreach ($clients as $client) {
self::getContactsFactory($client->getCompany(), $client);
}
}

/**
* @return list<class-string>
*/
public function getDependencies(): array
{
return [
CoreFixture::class
];
}

/**
* @param Proxy<Client> $client
*/
private static function getContactsFactory(Company $company, Proxy $client): void
{
$contacts = ContactFactory::new(static function () use ($company, $client) {
return [
'client' => $client,
'company' => $company,
];
})->many(1, 5);

foreach ($contacts as $contact) {
self::addAdditionalContactDetails($company, $contact->create());
}
}

/**
* @param Proxy<Contact> $contact
*/
private static function addAdditionalContactDetails(Company $company, Proxy $contact): void
{
AdditionalContactDetailFactory::new(static function () use ($company, $contact) {
return [
'contact' => $contact,
'company' => $company,
];
})->many(0, 5);
}
}
2 changes: 1 addition & 1 deletion src/ClientBundle/Entity/AdditionalContactDetail.php
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public function getContact(): ?Contact
return $this->contact;
}

public function setContact(Contact $contact): self
public function setContact(?Contact $contact): self
{
$this->contact = $contact;

Expand Down
2 changes: 1 addition & 1 deletion src/ClientBundle/Entity/Contact.php
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ public function getClient(): ?Client
return $this->client;
}

public function setClient(Client $client): self
public function setClient(?Client $client): self
{
$this->client = $client;

Expand Down
4 changes: 3 additions & 1 deletion src/ClientBundle/Entity/ContactType.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@
use Ramsey\Uuid\UuidInterface;
use SolidInvoice\CoreBundle\Traits\Entity\CompanyAware;
use Stringable;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation as Serialize;
use Symfony\Component\Validator\Constraints as Assert;

/**
* @ORM\Table(name="contact_types")
* @ORM\Entity(repositoryClass="SolidInvoice\ClientBundle\Repository\ContactTypeRepository")
* @UniqueEntity(fields={"name", "company"})
*/
class ContactType implements Stringable
{
Expand All @@ -41,7 +43,7 @@ class ContactType implements Stringable
private ?UuidInterface $id = null;

/**
* @ORM\Column(name="name", type="string", length=45, unique=true)
* @ORM\Column(name="name", type="string", length=45)
* @Assert\NotBlank()
* @Assert\Length(max=45)
* @Serialize\Groups({"client_api", "contact_api"})
Expand Down
27 changes: 27 additions & 0 deletions src/ClientBundle/Repository/AdditionalContactDetailRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

/*
* This file is part of SolidInvoice project.
*
* (c) Pierre du Plessis <open-source@solidworx.co>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/

namespace SolidInvoice\ClientBundle\Repository;

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use SolidInvoice\ClientBundle\Entity\AdditionalContactDetail;

/**
* @extends ServiceEntityRepository<AdditionalContactDetail>
*/
final class AdditionalContactDetailRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, AdditionalContactDetail::class);
}
}
75 changes: 75 additions & 0 deletions src/ClientBundle/Test/Factory/AdditionalContactDetailFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php

/*
* This file is part of SolidInvoice project.
*
* (c) Pierre du Plessis <open-source@solidworx.co>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/

namespace SolidInvoice\ClientBundle\Test\Factory;

use SolidInvoice\ClientBundle\Entity\AdditionalContactDetail;
use SolidInvoice\ClientBundle\Repository\AdditionalContactDetailRepository;
use Zenstruck\Foundry\ModelFactory;
use Zenstruck\Foundry\Proxy;
use Zenstruck\Foundry\RepositoryProxy;

/**
* @extends ModelFactory<AdditionalContactDetail>
*
* @method static AdditionalContactDetail|Proxy createOne(array $attributes = [])
* @method static AdditionalContactDetail[]|Proxy[] createMany(int $number, array|callable $attributes = [])
* @method static AdditionalContactDetail[]|Proxy[] createSequence(array|callable $sequence)
* @method static AdditionalContactDetail|Proxy find(object|array|mixed $criteria)
* @method static AdditionalContactDetail|Proxy findOrCreate(array $attributes)
* @method static AdditionalContactDetail|Proxy first(string $sortedField = 'id')
* @method static AdditionalContactDetail|Proxy last(string $sortedField = 'id')
* @method static AdditionalContactDetail|Proxy random(array $attributes = [])
* @method static AdditionalContactDetail|Proxy randomOrCreate(array $attributes = [])
* @method static AdditionalContactDetail[]|Proxy[] all()
* @method static AdditionalContactDetail[]|Proxy[] findBy(array $attributes)
* @method static AdditionalContactDetail[]|Proxy[] randomSet(int $number, array $attributes = [])
* @method static AdditionalContactDetail[]|Proxy[] randomRange(int $min, int $max, array $attributes = [])
* @method static AdditionalContactDetailRepository|RepositoryProxy repository()
* @method AdditionalContactDetail|Proxy create(array|callable $attributes = [])
*/
final class AdditionalContactDetailFactory extends ModelFactory
{
/**
* @return array<string, mixed>
*/
protected function getDefaults(): array
{
$contactType = ContactTypeFactory::createOne();

switch ($contactType->getName()) {
case 'email':
$value = self::faker()->email();
break;
case 'phone':
case 'mobile':
case 'fax':
$value = self::faker()->phoneNumber();
break;
case 'website':
$value = self::faker()->url();
break;
default:
$value = self::faker()->word();
break;
}

return [
'type' => $contactType,
'value' => $value,
];
}

protected static function getClass(): string
{
return AdditionalContactDetail::class;
}
}
8 changes: 4 additions & 4 deletions src/ClientBundle/Test/Factory/ClientFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,12 @@ final class ClientFactory extends ModelFactory
protected function getDefaults(): array
{
return [
'name' => self::faker()->company(),
'website' => self::faker()->url(),
'status' => self::faker()->word(),
'name' => self::faker()->domainName(),
'website' => self::faker()->boolean() ? self::faker()->url() : '',
'status' => 'active',
'currencyCode' => self::faker()->currencyCode(),
'vatNumber' => self::faker()->word(),
'archived' => self::faker()->boolean(),
'archived' => self::faker()->boolean(10) ? true : null,
'created' => self::faker()->dateTime(),
'updated' => self::faker()->dateTime(),
'company' => CompanyFactory::new(),
Expand Down
61 changes: 61 additions & 0 deletions src/ClientBundle/Test/Factory/ContactFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php

/*
* This file is part of SolidInvoice project.
*
* (c) Pierre du Plessis <open-source@solidworx.co>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/

namespace SolidInvoice\ClientBundle\Test\Factory;

use SolidInvoice\ClientBundle\Entity\Contact;
use SolidInvoice\ClientBundle\Repository\ContactRepository;
use SolidInvoice\CoreBundle\Test\Factory\CompanyFactory;
use Zenstruck\Foundry\ModelFactory;
use Zenstruck\Foundry\Proxy;
use Zenstruck\Foundry\RepositoryProxy;

/**
* @extends ModelFactory<Contact>
*
* @method static Contact|Proxy createOne(array $attributes = [])
* @method static Contact[]|Proxy[] createMany(int $number, array|callable $attributes = [])
* @method static Contact[]|Proxy[] createSequence(array|callable $sequence)
* @method static Contact|Proxy find(object|array|mixed $criteria)
* @method static Contact|Proxy findOrCreate(array $attributes)
* @method static Contact|Proxy first(string $sortedField = 'id')
* @method static Contact|Proxy last(string $sortedField = 'id')
* @method static Contact|Proxy random(array $attributes = [])
* @method static Contact|Proxy randomOrCreate(array $attributes = [])
* @method static Contact[]|Proxy[] all()
* @method static Contact[]|Proxy[] findBy(array $attributes)
* @method static Contact[]|Proxy[] randomSet(int $number, array $attributes = [])
* @method static Contact[]|Proxy[] randomRange(int $min, int $max, array $attributes = [])
* @method static ContactRepository|RepositoryProxy repository()
* @method Contact|Proxy create(array|callable $attributes = [])
*/
final class ContactFactory extends ModelFactory
{
/**
* @return array<string, mixed>
*/
protected function getDefaults(): array
{
return [
'firstName' => self::faker()->firstName(),
'lastName' => self::faker()->lastName(),
'email' => self::faker()->email(),
'company' => CompanyFactory::new(),
//'client' => ClientFactory::random(),
//'additionalContactDetails' => AdditionalContactDetailFactory::new()->many(0, 5),
];
}

protected static function getClass(): string
{
return Contact::class;
}
}