From 2b033710e2adad9c55242b23413e004d7182168d Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Fri, 25 Sep 2020 19:51:23 +0200 Subject: [PATCH] events: extend system configurations and set invoice formatter (#1995) --- src/Command/ReloadCommand.php | 10 ++-- .../StringAccessibleConfigTrait.php | 38 ++++++++++----- .../SystemConfigurationController.php | 4 ++ src/Form/Model/SystemConfiguration.php | 24 +++++----- src/Invoice/InvoiceModel.php | 9 +++- tests/Configuration/FormConfigurationTest.php | 7 ++- .../Configuration/SystemConfigurationTest.php | 9 ++-- .../TimesheetConfigurationTest.php | 6 +-- tests/Form/Model/SystemConfigurationTest.php | 48 +++++++++++++++++++ tests/Invoice/InvoiceModelTest.php | 5 ++ 10 files changed, 119 insertions(+), 41 deletions(-) create mode 100644 tests/Form/Model/SystemConfigurationTest.php diff --git a/src/Command/ReloadCommand.php b/src/Command/ReloadCommand.php index 51d946b6..bc7357f3 100644 --- a/src/Command/ReloadCommand.php +++ b/src/Command/ReloadCommand.php @@ -120,12 +120,14 @@ final class ReloadCommand extends Command 'bin/console cache:warmup --env=' . $environment ] ); - } else { - $io->success( - sprintf('Kimai config was reloaded') - ); + + return $cacheResult; } + $io->success( + sprintf('Kimai config was reloaded') + ); + return 0; } diff --git a/src/Configuration/StringAccessibleConfigTrait.php b/src/Configuration/StringAccessibleConfigTrait.php index ad94e2f2..c1b8f325 100644 --- a/src/Configuration/StringAccessibleConfigTrait.php +++ b/src/Configuration/StringAccessibleConfigTrait.php @@ -57,8 +57,8 @@ trait StringAccessibleConfigTrait } foreach ($temp as $key2) { if (!\array_key_exists($key2, $array)) { - // unknown values will silently be skipped - continue 2; + $array[$key2] = $configuration->getValue(); + continue; } if (\is_array($array[$key2])) { $array = &$array[$key2]; @@ -87,6 +87,13 @@ trait StringAccessibleConfigTrait public function find(string $key) { $this->prepare(); + $key = $this->prepareSearchKey($key); + + return $this->get($key, $this->settings); + } + + private function prepareSearchKey(string $key): string + { $prefix = $this->getPrefix() . '.'; $length = \strlen($prefix); @@ -94,7 +101,7 @@ trait StringAccessibleConfigTrait $key = substr($key, $length); } - return $this->get($key, $this->settings); + return $key; } /** @@ -108,7 +115,7 @@ trait StringAccessibleConfigTrait $search = array_shift($keys); if (!\array_key_exists($search, $config)) { - throw new \InvalidArgumentException('Unknown config: ' . $key); + return null; } if (\is_array($config[$search]) && !empty($keys)) { @@ -118,18 +125,27 @@ trait StringAccessibleConfigTrait return $config[$search]; } + public function has(string $key): bool + { + $this->prepare(); + $key = $this->prepareSearchKey($key); + + $keys = explode('.', $key); + $search = array_shift($keys); + + if (!\array_key_exists($search, $this->settings)) { + return false; + } + + return true; + } + /** * @return bool */ public function offsetExists($offset) { - try { - $this->find($offset); - } catch (\Exception $ex) { - return false; - } - - return true; + return $this->has($offset); } /** diff --git a/src/Controller/SystemConfigurationController.php b/src/Controller/SystemConfigurationController.php index a9422f4e..f1397dd6 100644 --- a/src/Controller/SystemConfigurationController.php +++ b/src/Controller/SystemConfigurationController.php @@ -202,6 +202,10 @@ final class SystemConfigurationController extends AbstractController foreach ($event->getConfigurations() as $configs) { foreach ($configs->getConfiguration() as $config) { + if (!$this->configurations->has($config->getName())) { + continue; + } + $configValue = $this->configurations->find($config->getName()); if (null !== $configValue) { $config->setValue($configValue); diff --git a/src/Form/Model/SystemConfiguration.php b/src/Form/Model/SystemConfiguration.php index b022df20..00fd19a4 100644 --- a/src/Form/Model/SystemConfiguration.php +++ b/src/Form/Model/SystemConfiguration.php @@ -21,27 +21,20 @@ class SystemConfiguration public const SECTION_BRANDING = 'branding'; /** - * @var string + * @var string|null */ private $section; /** * @var Configuration[] */ - private $configuration; + private $configuration = []; - /** - * @return string - */ - public function getSection(): string + public function getSection(): ?string { return $this->section; } - /** - * @param string $section - * @return SystemConfiguration - */ - public function setSection(string $section) + public function setSection(?string $section): SystemConfiguration { $this->section = $section; @@ -60,10 +53,17 @@ class SystemConfiguration * @param Configuration[] $configuration * @return SystemConfiguration */ - public function setConfiguration(array $configuration) + public function setConfiguration(array $configuration): SystemConfiguration { $this->configuration = $configuration; return $this; } + + public function addConfiguration(Configuration $configuration): SystemConfiguration + { + $this->configuration[] = $configuration; + + return $this; + } } diff --git a/src/Invoice/InvoiceModel.php b/src/Invoice/InvoiceModel.php index 3599ae18..7f5eac58 100644 --- a/src/Invoice/InvoiceModel.php +++ b/src/Invoice/InvoiceModel.php @@ -267,11 +267,18 @@ final class InvoiceModel return $this; } - public function getFormatter(): ?InvoiceFormatter + public function getFormatter(): InvoiceFormatter { return $this->formatter; } + public function setFormatter(InvoiceFormatter $formatter): InvoiceModel + { + $this->formatter = $formatter; + + return $this; + } + public function getCurrency(): string { if (null === $this->getCustomer()) { diff --git a/tests/Configuration/FormConfigurationTest.php b/tests/Configuration/FormConfigurationTest.php index 55276cb1..8a7814d2 100644 --- a/tests/Configuration/FormConfigurationTest.php +++ b/tests/Configuration/FormConfigurationTest.php @@ -86,14 +86,13 @@ class FormConfigurationTest extends TestCase $this->assertEquals('FR', $sut->find('defaults.customer.country')); } - public function testUnknownConfigAreNotImportedAndFindingThemThrowsException() + public function testUnknownConfigAreImported() { - $this->expectException(\InvalidArgumentException::class); - $this->expectExceptionMessage('Unknown config: foobar'); - $sut = $this->getSut($this->getDefaultSettings(), [ (new Configuration())->setName('defaults.customer.foobar')->setValue('hello'), ]); + $this->assertTrue($sut->has('customer.foobar')); + $this->assertFalse($sut->has('xxxx.foobar')); $this->assertEquals('hello', $sut->find('customer.foobar')); } } diff --git a/tests/Configuration/SystemConfigurationTest.php b/tests/Configuration/SystemConfigurationTest.php index 7f7cfec1..064184f6 100644 --- a/tests/Configuration/SystemConfigurationTest.php +++ b/tests/Configuration/SystemConfigurationTest.php @@ -129,15 +129,14 @@ class SystemConfigurationTest extends TestCase $this->assertEquals(false, $sut->find('timesheet.rules.allow_future_times')); } - public function testUnknownConfigAreNotImportedAndFindingThemThrowsException() + public function testUnknownConfigs() { - $this->expectException(\InvalidArgumentException::class); - $this->expectExceptionMessage('Unknown config: foo'); - $sut = $this->getSut($this->getDefaultSettings(), [ (new Configuration())->setName('timesheet.foo')->setValue('hello'), ]); - $this->assertEquals('hello', $sut->find('foo')); + $this->assertEquals('hello', $sut->find('timesheet.foo')); + $this->assertFalse($sut->has('xxxxxxxx.yyyyyyyyy')); + $this->assertNull($sut->find('xxxxxxxx.yyyyyyyyy')); } public function testCalendarWithoutLoader() diff --git a/tests/Configuration/TimesheetConfigurationTest.php b/tests/Configuration/TimesheetConfigurationTest.php index 63f5c483..4ab75331 100644 --- a/tests/Configuration/TimesheetConfigurationTest.php +++ b/tests/Configuration/TimesheetConfigurationTest.php @@ -116,14 +116,12 @@ class TimesheetConfigurationTest extends TestCase $this->assertEquals(false, $sut->find('timesheet.rules.allow_future_times')); } - public function testUnknownConfigAreNotImportedAndFindingThemThrowsException() + public function testUnknownConfigAreImported() { - $this->expectException(\InvalidArgumentException::class); - $this->expectExceptionMessage('Unknown config: foo'); - $sut = $this->getSut($this->getDefaultSettings(), [ (new Configuration())->setName('timesheet.foo')->setValue('hello'), ]); + $this->assertTrue($sut->has('foo')); $this->assertEquals('hello', $sut->find('foo')); } } diff --git a/tests/Form/Model/SystemConfigurationTest.php b/tests/Form/Model/SystemConfigurationTest.php new file mode 100644 index 00000000..8f460255 --- /dev/null +++ b/tests/Form/Model/SystemConfigurationTest.php @@ -0,0 +1,48 @@ +getSection()); + self::assertEquals([], $sut->getConfiguration()); + } + + public function testSetterAndGetter() + { + $sut = new SystemConfiguration(); + + self::assertInstanceOf(SystemConfiguration::class, $sut->setSection('foo')); + self::assertEquals('foo', $sut->getSection()); + + self::assertInstanceOf(SystemConfiguration::class, $sut->setConfiguration([])); + self::assertEquals([], $sut->getConfiguration()); + + $config = new Configuration(); + self::assertInstanceOf(SystemConfiguration::class, $sut->setConfiguration([$config])); + self::assertEquals([$config], $sut->getConfiguration()); + + self::assertInstanceOf(SystemConfiguration::class, $sut->setConfiguration([$config, $config])); + self::assertEquals([$config, $config], $sut->getConfiguration()); + + self::assertInstanceOf(SystemConfiguration::class, $sut->addConfiguration($config)); + self::assertEquals([$config, $config, $config], $sut->getConfiguration()); + } +} diff --git a/tests/Invoice/InvoiceModelTest.php b/tests/Invoice/InvoiceModelTest.php index 922d7ac0..e5fc93e2 100644 --- a/tests/Invoice/InvoiceModelTest.php +++ b/tests/Invoice/InvoiceModelTest.php @@ -41,6 +41,11 @@ class InvoiceModelTest extends TestCase self::assertInstanceOf(\DateTime::class, $sut->getInvoiceDate()); self::assertSame($formatter, $sut->getFormatter()); + + $newFormatter = new DebugFormatter(); + $sut->setFormatter($newFormatter); + self::assertNotSame($formatter, $sut->getFormatter()); + self::assertSame($newFormatter, $sut->getFormatter()); } public function testEmptyObjectThrowsExceptionOnNumberGenerator()