GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( 647edc...edf045 )
by joseph
18s queued 16s
created

setFakerValueForProperty()   C

Complexity

Conditions 8
Paths 8

Size

Total Lines 40
Code Lines 33

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 40
rs 5.3846
c 0
b 0
f 0
cc 8
eloc 33
nc 8
nop 1
1
<?php declare(strict_types=1);
2
3
namespace EdmondsCommerce\DoctrineStaticMeta\Entity\Fields\Traits;
4
5
use EdmondsCommerce\DoctrineStaticMeta\AbstractFunctionalTest;
6
use EdmondsCommerce\DoctrineStaticMeta\AbstractIntegrationTest;
7
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\AbstractGenerator;
8
use EdmondsCommerce\DoctrineStaticMeta\Entity\Fields\FakerData\FakerDataProviderInterface;
9
use EdmondsCommerce\DoctrineStaticMeta\Entity\Interfaces\EntityInterface;
10
use EdmondsCommerce\DoctrineStaticMeta\Entity\Savers\EntitySaver;
11
use Faker\Generator;
12
13
/**
14
 * Extend this test with your Field Trait test to get basic test coverage.
15
 *
16
 * You should extend your field trait test to test your validation
17
 *
18
 * Class AbstractFieldTraitFunctionalTest
19
 *
20
 * @package EdmondsCommerce\DoctrineStaticMeta\Entity\Fields\Traits
21
 * @SuppressWarnings(PHPMD.NumberOfChildren)
22
 */
23
abstract class AbstractFieldTraitFunctionalTest extends AbstractFunctionalTest
24
{
25
    protected const TEST_ENTITY_FQN_BASE = AbstractIntegrationTest::TEST_PROJECT_ROOT_NAMESPACE
26
                                           .'\\'.AbstractGenerator::ENTITIES_FOLDER_NAME
27
                                           .'\\';
28
29
    protected const TEST_FIELD_FQN = 'Override Me';
30
31
    /**
32
     * The expected default value for the field. Most fields are marked as nullable so the default is null.
33
     * Should be overriden in the actual field test for any fields that are not nullable
34
     */
35
    protected const TEST_FIELD_DEFAULT = null;
36
37
    protected const TEST_FIELD_PROP = 'Override Me';
38
39
    protected $entitySuffix;
40
41
    /**
42
     * @var Generator
43
     */
44
    protected static $fakerGenerator;
45
46
    /**
47
     * @SuppressWarnings(PHPMD.StaticAccess)
48
     */
49
    public static function setUpBeforeClass()
50
    {
51
        /* The :void return type declaration that should be here would cause a BC issue */
52
        self::$fakerGenerator = \Faker\Factory::create();
53
    }
54
55
    public function setup()
56
    {
57
        parent::setup();
58
        $this->entitySuffix = substr(static::class, strrpos(static::class, '\\') + 1);
59
        $this->generateCode();
60
    }
61
62
    protected function generateCode()
63
    {
64
        $this->getEntityGenerator()
65
             ->generateEntity(static::TEST_ENTITY_FQN_BASE.$this->entitySuffix);
66
        $this->getFieldGenerator()
67
             ->setEntityHasField(
68
                 static::TEST_ENTITY_FQN_BASE.$this->entitySuffix,
69
                 static::TEST_FIELD_FQN
70
             );
71
    }
72
73
    /**
74
     * @param EntityInterface $entity
75
     *
76
     * @return string
77
     * @throws \Exception
78
     */
79
    protected function getGetter(EntityInterface $entity): string
80
    {
81
        foreach (['get', 'is', 'has'] as $prefix) {
82
            $method = $prefix.static::TEST_FIELD_PROP;
83
            if (\method_exists($entity, $method)) {
84
                return $method;
85
            }
86
        }
87
        throw new \RuntimeException('Failed finding a getter in '.__METHOD__);
88
    }
89
90
    protected function findFakerProvider(): ?FakerDataProviderInterface
91
    {
92
        $fakerProviderFqnBase = 'EdmondsCommerce\DoctrineStaticMeta\Entity\Fields\FakerData';
93
        $traitBase            = 'EdmondsCommerce\DoctrineStaticMeta\Entity\Fields\Traits';
94
        $fakerFqn             = \str_replace(
95
            [
96
                $traitBase,
97
                'FieldTrait',
98
            ],
99
            [
100
                $fakerProviderFqnBase,
101
                'FakerData',
102
            ],
103
            static::TEST_FIELD_FQN
104
        );
105
        if (class_exists($fakerFqn)) {
106
            return new $fakerFqn(self::$fakerGenerator);
107
        }
108
109
        return null;
110
    }
111
112
    /**
113
     * @param EntityInterface $entity
114
     *
115
     * @return mixed
116
     * @throws \ReflectionException
117
     * @throws \Exception
118
     */
119
    protected function setFakerValueForProperty(EntityInterface $entity)
120
    {
121
        $setter        = 'set'.static::TEST_FIELD_PROP;
122
        $fakerProvider = $this->findFakerProvider();
123
        if ($fakerProvider instanceof FakerDataProviderInterface) {
124
            $setValue = $fakerProvider();
125
            $entity->$setter($setValue);
126
127
            return $setValue;
128
        }
129
        $reflection       = new \ReflectionClass($entity);
130
        $setterReflection = $reflection->getMethod($setter);
131
        $setParamType     = current($setterReflection->getParameters())->getType()->getName();
132
        switch ($setParamType) {
133
            case 'string':
134
                $setValue = self::$fakerGenerator->text();
135
                break;
136
            case 'int':
137
                $setValue = self::$fakerGenerator->numberBetween(0, PHP_INT_MAX);
138
                break;
139
            case 'float':
140
                $setValue = self::$fakerGenerator->randomFloat(12, 0, 10000);
141
                break;
142
            case 'bool':
143
                $setValue = self::$fakerGenerator->boolean;
144
                break;
145
            case 'DateTime':
146
                $setValue = self::$fakerGenerator->dateTime;
147
                break;
148
            case 'DateTimeImmutable':
149
                $setValue = new \DateTimeImmutable(
150
                    self::$fakerGenerator->dateTime->format('Y-m-d')
151
                );
152
                break;
153
            default:
154
                throw new \RuntimeException('Failed getting a data provider for the property type '.$setParamType);
155
        }
156
        $entity->$setter($setValue);
157
158
        return $setValue;
159
    }
160
161
162
    /**
163
     * @throws \EdmondsCommerce\DoctrineStaticMeta\Exception\DoctrineStaticMetaException
164
     * @throws \ReflectionException
165
     */
166
    public function testCreateEntityWithField(): void
167
    {
168
        $this->setupCopiedWorkDir();
169
        $entityFqn = $this->getCopiedFqn(static::TEST_ENTITY_FQN_BASE.$this->entitySuffix);
170
        $entity    = new $entityFqn();
171
        $getter    = $this->getGetter($entity);
172
        $this->assertTrue(\method_exists($entity, $getter));
173
        $value = $entity->$getter();
174
        $this->assertSame(static::TEST_FIELD_DEFAULT, $value);
175
        $setValue = $this->setFakerValueForProperty($entity);
176
        $this->assertSame($setValue, $entity->$getter());
177
    }
178
179
    public function testCreateDatabaseSchema()
180
    {
181
        $this->setupCopiedWorkDirAndCreateDatabase();
182
        $entityManager = $this->getEntityManager();
183
        $entityFqn     = $this->getCopiedFqn(static::TEST_ENTITY_FQN_BASE.$this->entitySuffix);
184
        $entity        = new $entityFqn();
185
        $setValue      = $this->setFakerValueForProperty($entity);
186
        $saver         = $this->container->get(EntitySaver::class);
187
        $saver->save($entity);
188
        $repository  = $entityManager->getRepository($entityFqn);
189
        $entities    = $repository->findAll();
190
        $savedEntity = current($entities);
191
        $getter      = $this->getGetter($entity);
192
        $this->assertEquals($setValue, $savedEntity->$getter());
193
    }
194
}
195