Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
91.38% covered (success)
91.38%
53 / 58
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
TestWithDoctrineEntityDatalayer
91.38% covered (success)
91.38%
53 / 58
0.00% covered (danger)
0.00%
0 / 2
9.05
0.00% covered (danger)
0.00%
0 / 1
 className
n/a
0 / 0
n/a
0 / 0
0
 createExampleObject
80.00% covered (warning)
80.00%
4 / 5
0.00% covered (danger)
0.00%
0 / 1
3.07
 it_can_be_stored_in_a_property_with_doctrine_entity_datalayer
92.45% covered (success)
92.45%
49 / 53
0.00% covered (danger)
0.00%
0 / 1
6.02
1<?php
2namespace Apie\Fixtures\TestHelpers;
3
4use Apie\Core\BoundedContext\BoundedContext;
5use Apie\Core\BoundedContext\BoundedContextHashmap;
6use Apie\Core\FileStorage\FileStorageFactory;
7use Apie\Core\Indexing\Indexer;
8use Apie\Core\Lists\ReflectionClassList;
9use Apie\Core\Lists\ReflectionMethodList;
10use Apie\Core\ValueObjects\ValueObjectInterface;
11use Apie\DoctrineEntityConverter\Factories\PersistenceLayerFactory;
12use Apie\DoctrineEntityConverter\OrmBuilder as DoctrineEntityConverterOrmBuilder;
13use Apie\DoctrineEntityDatalayer\DoctrineEntityDatalayer;
14use Apie\DoctrineEntityDatalayer\EntityReindexer;
15use Apie\DoctrineEntityDatalayer\Factories\DoctrineListFactory;
16use Apie\DoctrineEntityDatalayer\Factories\EntityQueryFilterFactory;
17use Apie\DoctrineEntityDatalayer\IndexStrategy\DirectIndexStrategy;
18use Apie\DoctrineEntityDatalayer\OrmBuilder;
19use Apie\Faker\ApieObjectFaker;
20use Apie\Fixtures\Attributes\DisableDatalayerTest;
21use Apie\StorageMetadata\DomainToStorageConverter;
22use Faker\Factory;
23use PHPUnit\Framework\Attributes\Test;
24use PHPUnit\Framework\TestCase;
25
26/**
27 * @mixin TestCase
28 */
29trait TestWithDoctrineEntityDatalayer
30{
31    /**
32     * @return class-string<ValueObjectInterface>
33     */
34    abstract public static function className(): string;
35
36    public static function createExampleObject(): object
37    {
38        if (!class_exists(Factory::class) || !class_exists(ApieObjectFaker::class)) {
39            throw new \LogicException('The default createExampleObject() requires apie/faker to be available!');
40        }
41        $generator = Factory::create();
42        $generator->addProvider(ApieObjectFaker::createWithDefaultFakers($generator));
43        return $generator->fakeClass(static::className());
44    }
45
46    #[Test]
47    public function it_can_be_stored_in_a_property_with_doctrine_entity_datalayer()
48    {
49        foreach ((new \ReflectionClass(static::class))->getAttributes() as $attribute) {
50            if ($attribute->getName() === DisableDatalayerTest::class) {
51                $this->markTestSkipped('DoctrineEntityDatalayer test disabled for this class');
52            }
53        }
54        if (!class_exists(DoctrineEntityDatalayer::class)) {
55            $this->markTestSkipped('DoctrineEntityDatalayer class not loaded');
56        }
57        $className = static::className();
58        $entityClass = EntityWithPropertyFactory::createEntityWithProperty($className);
59        $tempFolder = sys_get_temp_dir() . DIRECTORY_SEPARATOR . uniqid('doctrine-');
60        if (!@mkdir($tempFolder)) {
61            $this->markTestSkipped('Can not create temp folder ' . $tempFolder);
62        }
63        try {
64            $entityPath = $tempFolder . DIRECTORY_SEPARATOR . 'entities';
65            if (!@mkdir($entityPath)) {
66                $this->markTestSkipped('Can not create entity folder ' . $entityPath);
67            }
68            $ormBuilder = new DoctrineEntityConverterOrmBuilder(
69                new PersistenceLayerFactory(),
70                new BoundedContextHashmap([
71                    'test' => new BoundedContext(
72                        'test',
73                        new ReflectionClassList([$entityClass]),
74                        new ReflectionMethodList()
75                    )
76                ]),
77                true
78            );
79            $ormBuilder = new OrmBuilder(
80                $ormBuilder,
81                buildOnce: false,
82                runMigrations: true,
83                devMode: true,
84                cache: null,
85                path: $entityPath,
86                connectionConfig: [
87                    'driver' => 'pdo_sqlite',
88                    'memory' => true
89                ]
90            );
91            $domainToStorageConverter = DomainToStorageConverter::create(FileStorageFactory::create());
92            $doctrineListFactory = new DoctrineListFactory(
93                $ormBuilder,
94                new EntityQueryFilterFactory(),
95                $domainToStorageConverter
96            );
97            $testItem = new DoctrineEntityDatalayer(
98                $ormBuilder,
99                $domainToStorageConverter,
100                new DirectIndexStrategy(new EntityReindexer($ormBuilder, Indexer::create())),
101                $doctrineListFactory
102            );
103            $entity = $entityClass->newInstance($this->createExampleObject());
104            $idBeforePersist = $entity->getId();
105            $actual = $testItem->persistNew($entity);
106            $this->assertEquals($idBeforePersist, $actual->getId()->toNative());
107        } finally {
108            system('rm -rf '  . escapeshellarg($tempFolder));
109        }
110    }
111}