Issues (3877)

_support/DynamicEntityBackendApiTester.php (1 issue)

1
<?php
2
3
/**
4
 * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
declare(strict_types=1);
9
10
namespace SprykerTest\Glue\DynamicEntityBackendApi;
11
12
use ArrayObject;
13
use Codeception\Actor;
14
use Generated\Shared\Transfer\DynamicEntityConfigurationRelationTransfer;
15
use Generated\Shared\Transfer\DynamicEntityConfigurationTransfer;
16
use Generated\Shared\Transfer\DynamicEntityDefinitionTransfer;
17
use Generated\Shared\Transfer\DynamicEntityFieldDefinitionTransfer;
18
use Generated\Shared\Transfer\DynamicEntityFieldValidationTransfer;
19
use Generated\Shared\Transfer\GlueRequestTransfer;
20
use Generated\Shared\Transfer\GlueResourceTransfer;
21
use Spryker\Glue\DynamicEntityBackendApi\DynamicEntityBackendApiConfig;
22
use Spryker\Glue\DynamicEntityBackendApi\DynamicEntityBackendApiFactory;
23
use Spryker\Glue\DynamicEntityBackendApi\Formatter\Builder\SchemaBuilder;
24
use Spryker\Glue\DynamicEntityBackendApi\Formatter\Builder\SchemaBuilderInterface;
25
use Spryker\Glue\DynamicEntityBackendApi\Formatter\TreeBuilder\DynamicEntityConfigurationTreeBuilder;
26
use Spryker\Glue\DynamicEntityBackendApi\Formatter\TreeBuilder\DynamicEntityConfigurationTreeBuilderInterface;
27
use Spryker\Shared\Config\Config;
28
use Spryker\Shared\Storage\StorageConstants;
29
30
/**
31
 * Inherited Methods
32
 *
33
 * @method void wantTo($text)
34
 * @method void wantToTest($text)
35
 * @method void execute($callable)
36
 * @method void expectTo($prediction)
37
 * @method void expect($prediction)
38
 * @method void amGoingTo($argumentation)
39
 * @method void am($role)
40
 * @method void lookForwardTo($achieveValue)
41
 * @method void comment($description)
42
 * @method void pause($vars = [])
43
 *
44
 * @SuppressWarnings(\SprykerTest\Glue\DynamicEntityBackendApi\PHPMD)
45
 */
46
class DynamicEntityBackendApiTester extends Actor
47
{
48
    use _generated\DynamicEntityBackendApiTesterActions;
49
50
    /**
51
     * @var string
52
     */
53
    public const TABLE_NAME = 'spy_dynamic_entity_configuration';
54
55
    /**
56
     * @var string
57
     */
58
    public const BAR_TABLE_NAME = 'spy_bar';
59
60
    /**
61
     * @var string
62
     */
63
    public const FOO_TABLE_NAME = 'spy_foo';
64
65
    /**
66
     * @var string
67
     */
68
    public const FOO_TABLE_ALIAS = 'foo';
69
70
    /**
71
     * @var string
72
     */
73
    public const BAR_TABLE_ALIAS = 'bar';
74
75
    /**
76
     * @var string
77
     */
78
    public const TABLE_ALIAS_COLUMN = 'table_alias';
79
80
    /**
81
     * @var string
82
     */
83
    public const TABLE_ID_DYNAMIC_ENTITY_CONFIGURATION_COLUMN = 'id_dynamic_entity_configuration';
84
85
    /**
86
     * @var string
87
     */
88
    public const TABLE_NAME_COLUMN = 'table_name';
89
90
    /**
91
     * @var string
92
     */
93
    public const DEFINITION_COLUMN = 'definition';
94
95
    /**
96
     * @var string
97
     */
98
    public const DEFINITION_UPDATED_VALUE = 'Definition is updated.';
99
100
    /**
101
     * @var string
102
     */
103
    public const DEFINITION_CREATED_VALUE = 'Definition is created.';
104
105
    /**
106
     * @var string
107
     */
108
    public const KEY_DATA = 'data';
109
110
    /**
111
     * @var string
112
     */
113
    protected const X_REAL_IP_HEADER = 'x-real-ip';
114
115
    /**
116
     * @var string
117
     */
118
    protected const REQUESTED_FORMAT = 'application/json';
119
120
    /**
121
     * @var string
122
     */
123
    protected const FOO_IP = '0.0.0.0';
124
125
    /**
126
     * @uses \Spryker\Shared\StorageRedis\StorageRedisConstants::STORAGE_REDIS_SCHEME
127
     *
128
     * @var string
129
     */
130
    protected const REDIS_SCHEME = 'STORAGE_REDIS:STORAGE_REDIS_SCHEME';
131
132
    /**
133
     * @uses \Spryker\Shared\StorageRedis\StorageRedisConstants::STORAGE_REDIS_HOST
134
     *
135
     * @var string
136
     */
137
    protected const REDIS_HOST = 'STORAGE_REDIS:STORAGE_REDIS_HOST';
138
139
    /**
140
     * @uses \Spryker\Shared\StorageRedis\StorageRedisConstants::STORAGE_REDIS_PORT
141
     *
142
     * @var string
143
     */
144
    protected const REDIS_PORT = 'STORAGE_REDIS:STORAGE_REDIS_PORT';
145
146
    /**
147
     * @uses \Spryker\Shared\StorageRedis\StorageRedisConstants::STORAGE_REDIS_DATABASE
148
     *
149
     * @var string
150
     */
151
    protected const REDIS_DATABASE = 'STORAGE_REDIS:STORAGE_REDIS_DATABASE';
152
153
    /**
154
     * @uses \Spryker\Shared\StorageRedis\StorageRedisConstants::STORAGE_REDIS_PASSWORD
155
     *
156
     * @var string
157
     */
158
    protected const REDIS_PASSWORD = 'STORAGE_REDIS:STORAGE_REDIS_PASSWORD';
159
160
    /**
161
     * @var string
162
     */
163
    protected const STRING_FALSE = 'false';
164
165
    /**
166
     * @param string|null $tableAlias
167
     *
168
     * @return \Generated\Shared\Transfer\GlueRequestTransfer
169
     */
170
    public function haveGlueRequestTransfer(?string $tableAlias = null): GlueRequestTransfer
171
    {
172
        $glueRequestTransfer = new GlueRequestTransfer();
173
        $glueRequestTransfer->setPath($this->getPath($tableAlias));
174
        $glueRequestTransfer->setResource(new GlueResourceTransfer());
175
        $glueRequestTransfer->setRequestedFormat(static::REQUESTED_FORMAT);
176
        $glueRequestTransfer->setMeta([
177
            static::X_REAL_IP_HEADER => [static::FOO_IP],
178
        ]);
179
180
        return $glueRequestTransfer;
181
    }
182
183
    /**
184
     * @param bool $isCreatable
185
     * @param bool $isRequired
186
     * @param bool $isEditable
187
     *
188
     * @return string
189
     */
190
    public function buildDefinitionWithNonAutoIncrementedId(
191
        bool $isCreatable = true,
192
        bool $isRequired = false,
193
        bool $isEditable = true
194
    ): string {
195
        $definitions = [
196
            'identifier' => 'table_alias',
197
            'fields' => $this->getDynamicEntityDefinitionFields($isCreatable, $isRequired, $isEditable),
198
        ];
199
200
        return json_encode($definitions);
201
    }
202
203
    /**
204
     * @param bool $isCreatable
205
     * @param bool $isRequired
206
     * @param bool $isEditable
207
     *
208
     * @return string
209
     */
210
    public function buildDefinitionWithAutoIncrementedId(
211
        bool $isCreatable = true,
212
        bool $isRequired = false,
213
        bool $isEditable = true
214
    ): string {
215
        $definitions = [
216
            'identifier' => 'id_dynamic_entity_configuration',
217
            'fields' => $this->getDynamicEntityDefinitionFields($isCreatable, $isRequired, $isEditable),
218
        ];
219
220
        return json_encode($definitions);
221
    }
222
223
    /**
224
     * @param bool $isCreatable
225
     * @param bool $isRequired
226
     * @param bool $isEditable
227
     *
228
     * @return array
229
     */
230
    protected function getDynamicEntityDefinitionFields(
231
        bool $isCreatable = true,
232
        bool $isRequired = false,
233
        bool $isEditable = true
234
    ): array {
235
        return [
236
            [
237
                'fieldName' => 'id_dynamic_entity_configuration',
238
                'fieldVisibleName' => 'id_dynamic_entity_configuration',
239
                'type' => 'integer',
240
                'isEditable' => false,
241
                'isCreatable' => false,
242
                'validation' => [
243
                    'isRequired' => false,
244
                ],
245
            ],
246
            [
247
                'fieldName' => 'table_alias',
248
                'fieldVisibleName' => 'table_alias',
249
                'type' => 'string',
250
                'isEditable' => $isEditable,
251
                'isCreatable' => $isCreatable,
252
                'validation' => [
253
                    'isRequired' => $isRequired,
254
                ],
255
            ],
256
            [
257
                'fieldName' => 'table_name',
258
                'fieldVisibleName' => 'table_name',
259
                'type' => 'string',
260
                'isEditable' => true,
261
                'isCreatable' => true,
262
                'validation' => [
263
                    'isRequired' => $isRequired,
264
                ],
265
            ],
266
            [
267
                'fieldName' => 'definition',
268
                'fieldVisibleName' => 'definition',
269
                'type' => 'string',
270
                'isEditable' => true,
271
                'isCreatable' => true,
272
                'validation' => [
273
                    'isRequired' => false,
274
                ],
275
            ],
276
        ];
277
    }
278
279
    /**
280
     * @return \Generated\Shared\Transfer\DynamicEntityConfigurationTransfer
281
     */
282
    public function createDynamicEntityConfigurationTransfer(): DynamicEntityConfigurationTransfer
283
    {
284
        $dynamicEntityFieldDefinitionTransfer = (new DynamicEntityFieldDefinitionTransfer())->setFieldName('test-field-name');
285
        $dynamicEntityFieldDefinitionTransfer->setFieldVisibleName('test')
286
            ->setType('string')
287
            ->setIsEditable(true)
288
            ->setIsCreatable(true)
289
            ->setValidation((new DynamicEntityFieldValidationTransfer())->setIsRequired(false));
290
291
        $dynamicEntityDefinitionTransfer = new DynamicEntityDefinitionTransfer();
292
        $dynamicEntityDefinitionTransfer->setIdentifier('test-identifier')
293
            ->setIsDeletable(true)
294
            ->setFieldDefinitions(new ArrayObject([
295
                $dynamicEntityFieldDefinitionTransfer,
296
            ]));
297
298
        $dynamicEntityConfigurationTransfer = new DynamicEntityConfigurationTransfer();
299
        $dynamicEntityConfigurationTransfer->setTableAlias('test-resource')
300
            ->setTableName('test-table')
301
            ->setDynamicEntityDefinition($dynamicEntityDefinitionTransfer);
302
303
        return $dynamicEntityConfigurationTransfer;
304
    }
305
306
    /**
307
     * @return \Generated\Shared\Transfer\DynamicEntityConfigurationTransfer
308
     */
309
    public function createDynamicEntityConfigurationTransferWithEmptyFieldDefinitions(): DynamicEntityConfigurationTransfer
310
    {
311
        $dynamicEntityDefinitionTransfer = new DynamicEntityDefinitionTransfer();
312
        $dynamicEntityDefinitionTransfer
313
            ->setIdentifier('test-identifier')
314
            ->setFieldDefinitions(new ArrayObject([]));
315
316
        $dynamicEntityConfigurationTransfer = new DynamicEntityConfigurationTransfer();
317
        $dynamicEntityConfigurationTransfer->setTableAlias('test-resource')
318
            ->setTableName('test-table')
319
            ->setDynamicEntityDefinition($dynamicEntityDefinitionTransfer);
320
321
        return $dynamicEntityConfigurationTransfer;
322
    }
323
324
    /**
325
     * @return \Generated\Shared\Transfer\DynamicEntityConfigurationTransfer
326
     */
327
    public function createDynamicEntityConfigurationTransferWithChildRelation(): DynamicEntityConfigurationTransfer
328
    {
329
        $dynamicEntityFieldDefinitionTransfer = $this->createDynamicEntityConfigurationTransfer();
330
331
        $dynamicEntityFieldDefinitionTransfer->addChildRelation(
332
            (new DynamicEntityConfigurationRelationTransfer())
333
                ->setChildDynamicEntityConfiguration(
334
                    $this->createDynamicEntityConfigurationTransfer(),
335
                )->setIsEditable(true)
336
                ->setName('test-child-relation'),
337
        );
338
339
        return $dynamicEntityFieldDefinitionTransfer;
340
    }
341
342
    /**
343
     * @param int $numberRelations
344
     *
345
     * @return \Generated\Shared\Transfer\DynamicEntityConfigurationTransfer
346
     */
347
    public function createDynamicEntityConfigurationTransferWithChildRelations(int $numberRelations = 3): DynamicEntityConfigurationTransfer
348
    {
349
        $dynamicEntityFieldDefinitionTransfer = $this->createDynamicEntityConfigurationTransfer();
350
351
        for ($i = 0; $i < $numberRelations; $i++) {
352
            $dynamicEntityFieldDefinitionTransfer->addChildRelation(
353
                (new DynamicEntityConfigurationRelationTransfer())
354
                    ->setChildDynamicEntityConfiguration(
355
                        $this->createDynamicEntityConfigurationTransfer(),
356
                    )->setIsEditable(true)
357
                    ->setName('test-child-relation-' . $i),
358
            );
359
        }
360
361
        return $dynamicEntityFieldDefinitionTransfer;
362
    }
363
364
    /**
365
     * @return \Generated\Shared\Transfer\DynamicEntityConfigurationTransfer
366
     */
367
    public function createDynamicEntityConfigurationTransferWithChildRelationsTree(): DynamicEntityConfigurationTransfer
368
    {
369
        $dynamicEntityFieldDefinitionTransfer = $this->createDynamicEntityConfigurationTransfer();
370
371
        $dynamicEntityFieldDefinitionTransfer->addChildRelation(
372
            (new DynamicEntityConfigurationRelationTransfer())
373
                ->setChildDynamicEntityConfiguration(
374
                    $this->createDynamicEntityConfigurationTransferWithChildRelations(),
375
                )->setIsEditable(true)
376
                ->setName('test-first-level-child-relation'),
377
        );
378
379
        return $dynamicEntityFieldDefinitionTransfer;
380
    }
381
382
    /**
383
     * @param string $fileName
384
     * @param string $methodName
385
     *
386
     * @return array<mixed>
387
     */
388
    public function getExpectedPathData(string $fileName, string $methodName): array
389
    {
390
        return require codecept_data_dir() . 'Builder' . DIRECTORY_SEPARATOR . $methodName . DIRECTORY_SEPARATOR . $fileName;
0 ignored issues
show
The function codecept_data_dir was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

390
        return require /** @scrutinizer ignore-call */ codecept_data_dir() . 'Builder' . DIRECTORY_SEPARATOR . $methodName . DIRECTORY_SEPARATOR . $fileName;
Loading history...
391
    }
392
393
    /**
394
     * @return void
395
     */
396
    public function setupStorageRedisConfig(): void
397
    {
398
        $this->setConfig(StorageConstants::STORAGE_REDIS_PROTOCOL, Config::get(static::REDIS_SCHEME, false));
399
        $this->setConfig(StorageConstants::STORAGE_REDIS_PORT, Config::get(static::REDIS_PORT));
400
        $this->setConfig(StorageConstants::STORAGE_REDIS_HOST, Config::get(static::REDIS_HOST));
401
        $this->setConfig(StorageConstants::STORAGE_REDIS_DATABASE, Config::get(static::REDIS_DATABASE));
402
        $this->setConfig(StorageConstants::STORAGE_REDIS_PASSWORD, Config::get(static::REDIS_PASSWORD));
403
    }
404
405
    /**
406
     * @return \Spryker\Glue\DynamicEntityBackendApi\Formatter\TreeBuilder\DynamicEntityConfigurationTreeBuilderInterface
407
     */
408
    public function createDynamicEntityConfigurationTreeBuilder(): DynamicEntityConfigurationTreeBuilderInterface
409
    {
410
        return new DynamicEntityConfigurationTreeBuilder();
411
    }
412
413
    /**
414
     * @return \Spryker\Glue\DynamicEntityBackendApi\Formatter\Builder\SchemaBuilderInterface
415
     */
416
    public function createSchemaBuilder(): SchemaBuilderInterface
417
    {
418
        return new SchemaBuilder();
419
    }
420
421
    /**
422
     * @return \Generated\Shared\Transfer\DynamicEntityConfigurationTransfer
423
     */
424
    public function createDynamicEntityConfigurationTransferWithThreeLevels(): DynamicEntityConfigurationTransfer
425
    {
426
        $rootDynamicEntityConfigurationTransfer = $this->createDynamicEntityConfigurationTransfer();
427
428
        $thirdLevelDynamicEntityConfigurationTransfer = $this->createDynamicEntityConfigurationTransfer();
429
        $thirdLevelDynamicEntityConfigurationRelationTransfer = new DynamicEntityConfigurationRelationTransfer();
430
        $thirdLevelDynamicEntityConfigurationRelationTransfer->setName('test-third-level-child-relation');
431
        $thirdLevelDynamicEntityConfigurationRelationTransfer->setChildDynamicEntityConfiguration($thirdLevelDynamicEntityConfigurationTransfer);
432
433
        $secondLevelDynamicEntityConfigurationTransfer = $this->createDynamicEntityConfigurationTransfer();
434
        $secondLevelDynamicEntityConfigurationTransfer->addChildRelation($thirdLevelDynamicEntityConfigurationRelationTransfer);
435
        $secondLevelDynamicEntityConfigurationRelationTransfer = new DynamicEntityConfigurationRelationTransfer();
436
        $secondLevelDynamicEntityConfigurationRelationTransfer->setName('test-second-level-child-relation');
437
        $secondLevelDynamicEntityConfigurationRelationTransfer->setChildDynamicEntityConfiguration($secondLevelDynamicEntityConfigurationTransfer);
438
439
        $firstLevelDynamicEntityConfigurationTransfer = $this->createDynamicEntityConfigurationTransfer();
440
        $firstLevelDynamicEntityConfigurationTransfer->addChildRelation($secondLevelDynamicEntityConfigurationRelationTransfer);
441
        $firstLevelDynamicEntityConfigurationRelationTransfer = new DynamicEntityConfigurationRelationTransfer();
442
        $firstLevelDynamicEntityConfigurationRelationTransfer->setName('test-first-level-child-relation');
443
        $firstLevelDynamicEntityConfigurationRelationTransfer->setChildDynamicEntityConfiguration($firstLevelDynamicEntityConfigurationTransfer);
444
445
        $rootDynamicEntityConfigurationTransfer->addChildRelation($firstLevelDynamicEntityConfigurationRelationTransfer);
446
447
        return $rootDynamicEntityConfigurationTransfer;
448
    }
449
450
    /**
451
     * @param \Generated\Shared\Transfer\GlueRequestTransfer $glueRequestTransfer
452
     *
453
     * @return \Generated\Shared\Transfer\GlueRequestTransfer
454
     */
455
    public function addNonTransactionalHeaderToRequestTransfer(GlueRequestTransfer $glueRequestTransfer): GlueRequestTransfer
456
    {
457
        $factory = new DynamicEntityBackendApiFactory();
458
        $meta = $glueRequestTransfer->getMeta();
459
        $meta[strtolower($factory->getConfig()->getTransactionalHeader())] = [static::STRING_FALSE];
460
        $glueRequestTransfer->setMeta($meta);
461
462
        return $glueRequestTransfer;
463
    }
464
465
    /**
466
     * @param string|null $tableAlias
467
     *
468
     * @return string
469
     */
470
    protected function getPath(?string $tableAlias = null): string
471
    {
472
        return sprintf(
473
            '/%s/%s',
474
            (new DynamicEntityBackendApiConfig())->getRoutePrefix(),
475
            $tableAlias ?? static::FOO_TABLE_ALIAS,
476
        );
477
    }
478
}
479