Passed
Push — feature/change-setup-override-... ( 7b5c3a...d078d0 )
by Chema
03:52
created

SetupGacelaTest::test_combine_external_services()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 16
nc 1
nop 0
dl 0
loc 24
rs 9.7333
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace GacelaTest\Unit\Framework\Bootstrap;
6
7
use Gacela\Framework\Bootstrap\GacelaConfig;
8
use Gacela\Framework\Bootstrap\SetupGacela;
9
use Gacela\Framework\Event\Dispatcher\ConfigurableEventDispatcher;
10
use Gacela\Framework\Event\Dispatcher\NullEventDispatcher;
11
use Gacela\Framework\Event\GacelaEventInterface;
12
use GacelaTest\Unit\Framework\Config\GacelaFileConfig\Factory\FakeEvent;
13
use PHPUnit\Framework\TestCase;
14
use stdClass;
15
16
final class SetupGacelaTest extends TestCase
17
{
18
    public function test_null_event_dispatcher(): void
19
    {
20
        $config = new GacelaConfig();
21
        $setup = SetupGacela::fromGacelaConfig($config);
22
23
        self::assertInstanceOf(NullEventDispatcher::class, $setup->getEventDispatcher());
24
        $setup->getEventDispatcher()->dispatch(new FakeEvent());
25
    }
26
27
    public function test_combine_event_dispatcher(): void
28
    {
29
        $listenerDispatched1 = false;
30
        $listenerDispatched2 = false;
31
32
        $setup = SetupGacela::fromGacelaConfig(
33
            (new GacelaConfig())->registerSpecificListener(
34
                FakeEvent::class,
35
                static function (GacelaEventInterface $event) use (&$listenerDispatched1): void {
36
                    self::assertInstanceOf(FakeEvent::class, $event);
37
                    $listenerDispatched1 = true;
38
                }
39
            )
40
        );
41
42
        self::assertInstanceOf(ConfigurableEventDispatcher::class, $setup->getEventDispatcher());
43
44
        $setup2 = SetupGacela::fromGacelaConfig(
45
            (new GacelaConfig())->registerSpecificListener(
46
                FakeEvent::class,
47
                static function (GacelaEventInterface $event) use (&$listenerDispatched2): void {
48
                    self::assertInstanceOf(FakeEvent::class, $event);
49
                    $listenerDispatched2 = true;
50
                }
51
            )
52
        );
53
        $setup->combine($setup2);
54
55
        self::assertFalse($listenerDispatched1);
56
        self::assertFalse($listenerDispatched2);
57
58
        $setup->getEventDispatcher()->dispatch(new FakeEvent());
59
60
        self::assertTrue($listenerDispatched1);
61
        self::assertTrue($listenerDispatched2);
62
    }
63
64
    public function test_combine_config_key_values(): void
65
    {
66
        $setup = SetupGacela::fromGacelaConfig(
67
            (new GacelaConfig())->addAppConfigKeyValue('key1', 1)
68
        );
69
70
        $setup2 = SetupGacela::fromGacelaConfig(
71
            (new GacelaConfig())->addAppConfigKeyValues(['key2' => 'value2'])
72
        );
73
74
        $setup->combine($setup2);
75
76
        self::assertSame([
77
            'key1' => 1,
78
            'key2' => 'value2',
79
        ], $setup->getConfigKeyValues());
80
    }
81
82
    public function test_combine_project_namespaces(): void
83
    {
84
        $setup = SetupGacela::fromGacelaConfig(
85
            (new GacelaConfig())->setProjectNamespaces(['App1'])
86
        );
87
88
        $setup2 = SetupGacela::fromGacelaConfig(
89
            (new GacelaConfig())->setProjectNamespaces(['App2'])
90
        );
91
92
        $setup->combine($setup2);
93
94
        self::assertSame(['App1', 'App2'], $setup->getProjectNamespaces());
95
    }
96
97
    public function test_override_file_cache_settings(): void
98
    {
99
        $setup = SetupGacela::fromGacelaConfig(
100
            (new GacelaConfig())
101
                ->setFileCacheEnabled(false)
102
                ->setFileCacheDirectory('original/dir')
103
        );
104
105
        $setup2 = SetupGacela::fromGacelaConfig(
106
            (new GacelaConfig())
107
                ->setFileCacheEnabled(true)
108
                ->setFileCacheDirectory('override/dir')
109
        );
110
111
        self::assertFalse($setup->isFileCacheEnabled());
112
        self::assertSame('original/dir', $setup->getFileCacheDirectory());
113
114
        $setup->combine($setup2);
115
116
        self::assertTrue($setup->isFileCacheEnabled());
117
        self::assertSame('override/dir', $setup->getFileCacheDirectory());
118
    }
119
120
    public function test_not_override_file_cache_settings_when_using_default(): void
121
    {
122
        $setup = SetupGacela::fromGacelaConfig(
123
            (new GacelaConfig())
124
                ->setFileCacheEnabled(true)
125
                ->setFileCacheDirectory('original/dir')
126
        );
127
128
        $setup2 = SetupGacela::fromGacelaConfig(new GacelaConfig());
129
130
        self::assertTrue($setup->isFileCacheEnabled());
131
        self::assertSame('original/dir', $setup->getFileCacheDirectory());
132
133
        $setup->combine($setup2);
134
135
        self::assertTrue($setup->isFileCacheEnabled());
136
        self::assertSame('original/dir', $setup->getFileCacheDirectory());
137
    }
138
139
    public function test_override_reset_in_memory_cache(): void
140
    {
141
        $setup = SetupGacela::fromGacelaConfig(new GacelaConfig());
142
143
        $setup2 = SetupGacela::fromGacelaConfig(
144
            (new GacelaConfig())->resetInMemoryCache()
145
        );
146
147
        self::assertFalse($setup->shouldResetInMemoryCache());
148
        $setup->combine($setup2);
149
        self::assertTrue($setup->shouldResetInMemoryCache());
150
    }
151
152
    public function test_combine_external_services(): void
153
    {
154
        $setup = SetupGacela::fromGacelaConfig(
155
            (new GacelaConfig())
156
                ->addExternalService('service1', static fn () => 1)
157
        );
158
159
        $setup2 = SetupGacela::fromGacelaConfig(
160
            (new GacelaConfig())
161
                ->addExternalService('service2', static fn () => 2)
162
                ->addExternalService('service3', new stdClass())
163
        );
164
165
        self::assertEquals([
166
            'service1' => static fn () => 1,
167
        ], $setup->externalServices());
168
169
        $setup->combine($setup2);
170
171
        self::assertEquals([
172
            'service1' => static fn () => 1,
173
            'service2' => static fn () => 2,
174
            'service3' => new stdClass(),
175
        ], $setup->externalServices());
176
    }
177
}
178