Skip to content

Commit b90a5d8

Browse files
cuchacJoe
andauthored
Add dynamic configuration (#46)
* Add dynamic configuration --------- Co-authored-by: Joe <joe@wpj.cz>
1 parent f36411d commit b90a5d8

File tree

4 files changed

+69
-11
lines changed

4 files changed

+69
-11
lines changed

src/LuigisBoxBundle/DTO/ConfigDTO.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
namespace Answear\LuigisBoxBundle\DTO;
66

7+
use Answear\LuigisBoxBundle\DependencyInjection\Configuration;
8+
79
class ConfigDTO
810
{
911
private const MAX_SEARCH_CACHE_TTL = 300;
@@ -44,13 +46,13 @@ class ConfigDTO
4446
private $searchCacheTtl;
4547

4648
public function __construct(
47-
string $host,
4849
string $publicKey,
4950
string $privateKey,
50-
float $connectionTimeout,
51-
float $requestTimeout,
52-
float $searchTimeout,
53-
int $searchCacheTtl
51+
string $host = Configuration::HOST,
52+
float $connectionTimeout = Configuration::CONNECTION_TIMEOUT,
53+
float $requestTimeout = Configuration::REQUEST_TIMEOUT,
54+
float $searchTimeout = Configuration::SEARCH_TIMEOUT,
55+
int $searchCacheTtl = Configuration::SEARCH_CACHE_TIMEOUT
5456
) {
5557
if ($searchCacheTtl < 0) {
5658
throw new \InvalidArgumentException('searchCacheTtl cannot be negative.');

src/LuigisBoxBundle/DependencyInjection/Configuration.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99

1010
class Configuration implements ConfigurationInterface
1111
{
12-
private const HOST = 'https://live.luigisbox.com';
13-
private const CONNECTION_TIMEOUT = 4.0;
14-
private const REQUEST_TIMEOUT = 10.0;
15-
private const SEARCH_TIMEOUT = 6.0;
12+
public const HOST = 'https://live.luigisbox.com';
13+
public const CONNECTION_TIMEOUT = 4.0;
14+
public const REQUEST_TIMEOUT = 10.0;
15+
public const SEARCH_TIMEOUT = 6.0;
16+
public const SEARCH_CACHE_TIMEOUT = 0;
1617

1718
public function getConfigTreeBuilder(): TreeBuilder
1819
{
@@ -32,7 +33,7 @@ public function getConfigTreeBuilder(): TreeBuilder
3233
->floatNode('connectionTimeout')->defaultValue(self::CONNECTION_TIMEOUT)->end()
3334
->floatNode('requestTimeout')->defaultValue(self::REQUEST_TIMEOUT)->end()
3435
->floatNode('searchTimeout')->defaultValue(self::SEARCH_TIMEOUT)->end()
35-
->integerNode('searchCacheTtl')->defaultValue(0)->end()
36+
->integerNode('searchCacheTtl')->defaultValue(self::SEARCH_CACHE_TIMEOUT)->end()
3637
->end()
3738
->end()
3839
->end()

src/LuigisBoxBundle/Service/ConfigProvider.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ public function __construct(string $defaultConfigName, array $configs)
4040
Assert::keyExists($item, 'searchCacheTtl');
4141

4242
$configsDTO[$configName] = new ConfigDTO(
43-
rtrim($item['host'], '/'),
4443
$item['publicKey'],
4544
$item['privateKey'],
45+
rtrim($item['host'], '/'),
4646
$item['connectionTimeout'],
4747
$item['requestTimeout'],
4848
$item['searchTimeout'],
@@ -65,6 +65,20 @@ public function __construct(string $defaultConfigName, array $configs)
6565
$this->configs = $configsDTO;
6666
}
6767

68+
public function addConfig(string $configName, ConfigDTO $configDTO): void
69+
{
70+
Assert::keyNotExists(
71+
$this->configs,
72+
$configName,
73+
sprintf(
74+
'Configuration with key "%s" already exists.',
75+
$configName,
76+
)
77+
);
78+
79+
$this->configs[$configName] = $configDTO;
80+
}
81+
6882
public function setConfig(string $configName): void
6983
{
7084
Assert::keyExists(

tests/Unit/DTO/ConfigDTOTest.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Answear\LuigisBoxBundle\Tests\Acceptance\DependencyInjection;
6+
7+
use Answear\LuigisBoxBundle\DTO\ConfigDTO;
8+
use Answear\LuigisBoxBundle\Tests\DataProvider\Faker\ExampleConfiguration;
9+
use PHPUnit\Framework\TestCase;
10+
11+
class ConfigDTOTest extends TestCase
12+
{
13+
/**
14+
* @test
15+
*/
16+
public function addConfig()
17+
{
18+
$configProvider = ExampleConfiguration::provideDefaultConfig();
19+
20+
$config = new ConfigDTO('new-public', 'new-private');
21+
$configProvider->addConfig('new_config', $config);
22+
23+
$this->assertEquals('public-key', $configProvider->getPublicKey());
24+
25+
$configProvider->setConfig('new_config');
26+
27+
$this->assertEquals('new-public', $configProvider->getPublicKey());
28+
}
29+
30+
/**
31+
* @test
32+
*/
33+
public function addConfigWithColidingName()
34+
{
35+
$this->expectExceptionMessage('Configuration with key "config_name" already exists.');
36+
$configProvider = ExampleConfiguration::provideDefaultConfig();
37+
38+
$config = new ConfigDTO('public', 'private');
39+
$configProvider->addConfig('config_name', $config);
40+
}
41+
}

0 commit comments

Comments
 (0)