ConfigFactoryTest::test_only_gacela_file_exists()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 23
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 15
nc 1
nop 0
dl 0
loc 23
rs 9.7666
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace GacelaTest\Integration\Framework\Config\ConfigFactory;
6
7
use Gacela\Framework\Bootstrap\SetupGacela;
8
use Gacela\Framework\Config\ConfigFactory;
9
use Gacela\Framework\Config\GacelaConfigBuilder\AppConfigBuilder;
10
use Gacela\Framework\Config\GacelaConfigBuilder\BindingsBuilder;
11
use Gacela\Framework\Config\GacelaConfigBuilder\SuffixTypesBuilder;
12
use Gacela\Framework\Config\GacelaFileConfig\GacelaConfigFile;
13
use Gacela\Framework\Config\GacelaFileConfig\GacelaConfigItem;
14
use GacelaTest\Fixtures\AbstractCustom;
15
use GacelaTest\Fixtures\CustomClass;
16
use GacelaTest\Fixtures\CustomInterface;
17
use PHPUnit\Framework\TestCase;
18
19
final class ConfigFactoryTest extends TestCase
20
{
21
    protected function setUp(): void
22
    {
23
        ConfigFactory::resetCache();
24
    }
25
26
    public function test_empty_setup_then_default_gacela_config_file(): void
27
    {
28
        $setup = new SetupGacela();
29
30
        $actual = (new ConfigFactory(__DIR__ . '/WithoutGacelaFile', $setup))
31
            ->createGacelaFileConfig();
32
33
        $expected = new GacelaConfigFile();
34
35
        self::assertEquals($expected, $actual);
36
    }
37
38
    public function test_cache_gacela_file_config(): void
39
    {
40
        $setup = new SetupGacela();
41
42
        $expected = (new ConfigFactory(__DIR__ . '/WithoutGacelaFile', $setup))
43
            ->createGacelaFileConfig();
44
45
        $actual = (new ConfigFactory(__DIR__ . '/WithoutGacelaFile', $setup))
46
            ->createGacelaFileConfig();
47
48
        self::assertSame($expected, $actual);
49
    }
50
51
    public function test_only_gacela_file_exists(): void
52
    {
53
        $setup = (new SetupGacela())
54
            ->setExternalServices(['CustomClassFromExternalService' => CustomClass::class]);
55
56
        $actual = (new ConfigFactory(__DIR__ . '/WithGacelaFile', $setup))
57
            ->createGacelaFileConfig();
58
59
        $expected = (new GacelaConfigFile())
60
            ->setConfigItems([
61
                new GacelaConfigItem('config/from-gacela-file.php', ''),
62
            ])
63
            ->setBindings([
64
                CustomInterface::class => CustomClass::class,
65
            ])
66
            ->setSuffixTypes([
67
                'Facade' => ['Facade', 'FacadeFromGacelaFile'],
68
                'Factory' => ['Factory', 'FactoryFromGacelaFile'],
69
                'Config' => ['Config', 'ConfigFromGacelaFile'],
70
                'Provider' => ['Provider', 'AbstractProviderFromGacelaFile'],
71
            ]);
72
73
        self::assertEquals($expected, $actual);
74
    }
75
76
    public function test_only_bootstrap_setup_gacela_exists(): void
77
    {
78
        $bootstrapSetup = (new SetupGacela())
79
            ->setExternalServices(['CustomClassFromExternalService' => CustomClass::class])
80
            ->setAppConfigFn(static function (AppConfigBuilder $builder): void {
81
                $builder->add('config/from-bootstrap.php');
82
            })
83
            ->setBindingsFn(
84
                static function (BindingsBuilder $bindingsBuilder, array $externalServices): void {
85
                    $bindingsBuilder->bind(
86
                        CustomInterface::class,
87
                        $externalServices['CustomClassFromExternalService'],
88
                    );
89
                },
90
            )
91
            ->setSuffixTypesFn(static function (SuffixTypesBuilder $suffixTypesBuilder): void {
92
                $suffixTypesBuilder
93
                    ->addFacade('FacadeFromBootstrap')
94
                    ->addFactory('FactoryFromBootstrap')
95
                    ->addConfig('ConfigFromBootstrap')
96
                    ->addProvider('ProviderFromBootstrap');
97
            });
98
99
        $actual = (new ConfigFactory(__DIR__ . '/WithoutGacelaFile', $bootstrapSetup))
100
            ->createGacelaFileConfig();
101
102
        $expected = (new GacelaConfigFile())
103
            ->setConfigItems([
104
                new GacelaConfigItem('config/from-bootstrap.php', ''),
105
            ])
106
            ->setBindings([
107
                CustomInterface::class => CustomClass::class,
108
            ])
109
            ->setSuffixTypes([
110
                'Facade' => ['Facade', 'FacadeFromBootstrap'],
111
                'Factory' => ['Factory', 'FactoryFromBootstrap'],
112
                'Config' => ['Config', 'ConfigFromBootstrap'],
113
                'Provider' => ['Provider', 'ProviderFromBootstrap'],
114
            ]);
115
116
        self::assertEquals($expected, $actual);
117
    }
118
119
    public function test_combine_bootstrap_setup_with_gacela_file(): void
120
    {
121
        $setup = (new SetupGacela())
122
            ->setExternalServices(['CustomClassFromExternalService' => CustomClass::class])
123
            ->setAppConfigFn(static function (AppConfigBuilder $builder): void {
124
                $builder->add('config/from-bootstrap.php');
125
            })
126
            ->setBindingsFn(
127
                static function (BindingsBuilder $bindingsBuilder, array $externalServices): void {
128
                    $bindingsBuilder->bind(
129
                        AbstractCustom::class,
130
                        $externalServices['CustomClassFromExternalService'],
131
                    );
132
                },
133
            )
134
            ->setSuffixTypesFn(static function (SuffixTypesBuilder $suffixTypesBuilder): void {
135
                $suffixTypesBuilder
136
                    ->addFacade('FacadeFromBootstrap')
137
                    ->addFactory('FactoryFromBootstrap')
138
                    ->addConfig('ConfigFromBootstrap')
139
                    ->addProvider('ProviderFromBootstrap');
140
            });
141
142
        $actual = (new ConfigFactory(__DIR__ . '/WithGacelaFile', $setup))
143
            ->createGacelaFileConfig();
144
145
        $expected = (new GacelaConfigFile())
146
            ->setConfigItems([
147
                new GacelaConfigItem('config/from-bootstrap.php', ''),
148
                new GacelaConfigItem('config/from-gacela-file.php', ''),
149
            ])
150
            ->setBindings([
151
                CustomInterface::class => CustomClass::class,
152
                AbstractCustom::class => CustomClass::class,
153
            ])
154
            ->setSuffixTypes([
155
                'Facade' => [
156
                    'Facade',
157
                    'FacadeFromBootstrap',
158
                    'FacadeFromGacelaFile',
159
                ],
160
                'Factory' => [
161
                    'Factory',
162
                    'FactoryFromBootstrap',
163
                    'FactoryFromGacelaFile',
164
                ],
165
                'Config' => [
166
                    'Config',
167
                    'ConfigFromBootstrap',
168
                    'ConfigFromGacelaFile',
169
                ],
170
                'Provider' => [
171
                    'Provider',
172
                    'ProviderFromBootstrap',
173
                    'AbstractProviderFromGacelaFile',
174
                ],
175
            ]);
176
177
        self::assertEquals($expected, $actual);
178
    }
179
}
180