From e1d9d67632a8d6777a2b49c227b7a40d1014437c Mon Sep 17 00:00:00 2001 From: Philipp Holzer Date: Mon, 11 Feb 2019 21:36:26 +0100 Subject: [PATCH] renamed Logger::setLogger() to Logger::init() --- src/Core/Config/Adapter/IConfigAdapter.php | 13 +- src/Core/Config/Adapter/IPConfigAdapter.php | 11 ++ src/Core/Config/Adapter/JITConfigAdapter.php | 12 ++ src/Core/Config/Adapter/JITPConfigAdapter.php | 14 ++- .../Config/Adapter/PreloadConfigAdapter.php | 16 ++- .../Config/Adapter/PreloadPConfigAdapter.php | 16 ++- src/Core/Config/Configuration.php | 28 ++--- src/Core/Config/PConfiguration.php | 28 ++--- src/Core/Logger.php | 2 +- src/Factory/LoggerFactory.php | 2 +- tests/src/Core/Config/ConfigurationTest.php | 112 +++++++++++++---- tests/src/Core/Config/PConfigurationTest.php | 114 +++++++++++++----- 12 files changed, 276 insertions(+), 92 deletions(-) diff --git a/src/Core/Config/Adapter/IConfigAdapter.php b/src/Core/Config/Adapter/IConfigAdapter.php index 3bbbbbe94c..8223d33672 100644 --- a/src/Core/Config/Adapter/IConfigAdapter.php +++ b/src/Core/Config/Adapter/IConfigAdapter.php @@ -29,8 +29,7 @@ interface IConfigAdapter public function get($cat, $key); /** - * Stores a config value ($value) in the category ($family) under the key ($key) - * for the user_id $uid. + * Stores a config value ($value) in the category ($family) under the key ($key). * * Note: Please do not store booleans - convert to 0/1 integer values! * @@ -59,4 +58,14 @@ interface IConfigAdapter * @return bool */ public function isConnected(); + + /** + * Checks, if a config value ($value) in the category ($cat) is already loaded. + * + * @param string $cat The configuration category + * @param string $key The configuration key + * + * @return bool + */ + public function isLoaded($cat, $key); } diff --git a/src/Core/Config/Adapter/IPConfigAdapter.php b/src/Core/Config/Adapter/IPConfigAdapter.php index 3e821efa02..e9f389292b 100644 --- a/src/Core/Config/Adapter/IPConfigAdapter.php +++ b/src/Core/Config/Adapter/IPConfigAdapter.php @@ -69,4 +69,15 @@ interface IPConfigAdapter * @return bool */ public function isConnected(); + + /** + * Checks, if a config value ($value) in the category ($cat) is already loaded for the user_id $uid. + * + * @param string $uid The user_id + * @param string $cat The configuration category + * @param string $key The configuration key + * + * @return bool + */ + public function isLoaded($uid, $cat, $key); } diff --git a/src/Core/Config/Adapter/JITConfigAdapter.php b/src/Core/Config/Adapter/JITConfigAdapter.php index 8dadfff688..95211777f3 100644 --- a/src/Core/Config/Adapter/JITConfigAdapter.php +++ b/src/Core/Config/Adapter/JITConfigAdapter.php @@ -120,4 +120,16 @@ class JITConfigAdapter extends AbstractDbaConfigAdapter implements IConfigAdapte return $result; } + + /** + * {@inheritdoc} + */ + public function isLoaded($cat, $key) + { + if (!$this->isConnected()) { + return false; + } + + return (isset($this->in_db[$cat][$key])) && $this->in_db[$cat][$key]; + } } diff --git a/src/Core/Config/Adapter/JITPConfigAdapter.php b/src/Core/Config/Adapter/JITPConfigAdapter.php index 950dd58bd8..697e27128a 100644 --- a/src/Core/Config/Adapter/JITPConfigAdapter.php +++ b/src/Core/Config/Adapter/JITPConfigAdapter.php @@ -36,7 +36,7 @@ class JITPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfigAdap } } else if ($cat != 'config') { // Negative caching - $return[null] = "!!"; + $return = "!!"; } DBA::close($pconfigs); @@ -123,4 +123,16 @@ class JITPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfigAdap return $result; } + + /** + * {@inheritdoc} + */ + public function isLoaded($uid, $cat, $key) + { + if (!$this->isConnected()) { + return false; + } + + return (isset($this->in_db[$uid][$cat][$key])) && $this->in_db[$uid][$cat][$key]; + } } diff --git a/src/Core/Config/Adapter/PreloadConfigAdapter.php b/src/Core/Config/Adapter/PreloadConfigAdapter.php index 8cad5c5557..a12c2a7ca6 100644 --- a/src/Core/Config/Adapter/PreloadConfigAdapter.php +++ b/src/Core/Config/Adapter/PreloadConfigAdapter.php @@ -32,13 +32,13 @@ class PreloadConfigAdapter extends AbstractDbaConfigAdapter implements IConfigAd $configs = DBA::select('config', ['cat', 'v', 'k']); while ($config = DBA::fetch($configs)) { - $return[$config['k']] = $config['v']; + $return[$config['cat']][$config['k']] = $config['v']; } DBA::close($configs); $this->config_loaded = true; - return [$cat => $return]; + return $return; } /** @@ -101,4 +101,16 @@ class PreloadConfigAdapter extends AbstractDbaConfigAdapter implements IConfigAd return $result; } + + /** + * {@inheritdoc} + */ + public function isLoaded($cat, $key) + { + if (!$this->isConnected()) { + return false; + } + + return $this->config_loaded; + } } diff --git a/src/Core/Config/Adapter/PreloadPConfigAdapter.php b/src/Core/Config/Adapter/PreloadPConfigAdapter.php index d117ed3542..d1c44d9fb6 100644 --- a/src/Core/Config/Adapter/PreloadPConfigAdapter.php +++ b/src/Core/Config/Adapter/PreloadPConfigAdapter.php @@ -44,13 +44,13 @@ class PreloadPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfig $pconfigs = DBA::select('pconfig', ['cat', 'v', 'k'], ['uid' => $uid]); while ($pconfig = DBA::fetch($pconfigs)) { - $return[$pconfig['k']] = $pconfig['v']; + $return[$pconfig['cat']][$pconfig['k']] = $pconfig['v']; } DBA::close($pconfigs); $this->config_loaded = true; - return [$cat => $return]; + return $return; } /** @@ -123,4 +123,16 @@ class PreloadPConfigAdapter extends AbstractDbaConfigAdapter implements IPConfig return $result; } + + /** + * {@inheritdoc} + */ + public function isLoaded($uid, $cat, $key) + { + if (!$this->isConnected()) { + return false; + } + + return $this->config_loaded; + } } diff --git a/src/Core/Config/Configuration.php b/src/Core/Config/Configuration.php index ccb9abda8a..2ad11b0ba3 100644 --- a/src/Core/Config/Configuration.php +++ b/src/Core/Config/Configuration.php @@ -79,22 +79,20 @@ class Configuration */ public function get($cat, $key, $default_value = null, $refresh = false) { - // Return the value of the cache if found and no refresh is forced - if (!$refresh && $this->configCache->has($cat, $key)) { + // if the value isn't loaded or refresh is needed, load it to the cache + if ($this->configAdapter->isConnected() && + (!$this->configAdapter->isLoaded($cat, $key) || + $refresh)) { + $dbvalue = $this->configAdapter->get($cat, $key); + + if ($dbvalue !== '!!') { + $this->configCache->set($cat, $key, $dbvalue); + } + } + + // use the config cache for return + if ($this->configCache->has($cat, $key)) { return $this->configCache->get($cat, $key); - } - - // if we don't find the value in the cache and the adapter isn't ready, return the default value - if (!$this->configAdapter->isConnected()) { - return $default_value; - } - - // load DB value to cache - $dbvalue = $this->configAdapter->get($cat, $key); - - if ($dbvalue !== '!!') { - $this->configCache->set($cat, $key, $dbvalue); - return $dbvalue; } else { return $default_value; } diff --git a/src/Core/Config/PConfiguration.php b/src/Core/Config/PConfiguration.php index d3c848c9db..cf7ef6adca 100644 --- a/src/Core/Config/PConfiguration.php +++ b/src/Core/Config/PConfiguration.php @@ -71,22 +71,20 @@ class PConfiguration */ public function get($uid, $cat, $key, $default_value = null, $refresh = false) { - // Return the value of the cache if found and no refresh is forced - if (!$refresh && $this->configCache->hasP($uid, $cat, $key)) { + // if the value isn't loaded or refresh is needed, load it to the cache + if ($this->configAdapter->isConnected() && + (!$this->configAdapter->isLoaded($uid, $cat, $key) || + $refresh)) { + $dbValue = $this->configAdapter->get($uid, $cat, $key); + + if ($dbValue !== '!!') { + $this->configCache->setP($uid, $cat, $key, $dbValue); + } + } + + // use the config cache for return + if ($this->configCache->hasP($uid, $cat, $key)) { return $this->configCache->getP($uid, $cat, $key); - } - - // if we don't find the value in the cache and the adapter isn't ready, return the default value - if (!$this->configAdapter->isConnected()) { - return $default_value; - } - - // load DB value to cache - $dbvalue = $this->configAdapter->get($uid, $cat, $key); - - if ($dbvalue !== '!!') { - $this->configCache->setP($uid, $cat, $key, $dbvalue); - return $dbvalue; } else { return $default_value; } diff --git a/src/Core/Logger.php b/src/Core/Logger.php index a2e587342d..67e58ef6b1 100644 --- a/src/Core/Logger.php +++ b/src/Core/Logger.php @@ -68,7 +68,7 @@ class Logger extends BaseObject * * @param LoggerInterface $logger The Logger instance of this Application */ - public static function setLogger($logger) + public static function init($logger) { self::$logger = $logger; } diff --git a/src/Factory/LoggerFactory.php b/src/Factory/LoggerFactory.php index 74f55e637f..bbe3b0a4b3 100644 --- a/src/Factory/LoggerFactory.php +++ b/src/Factory/LoggerFactory.php @@ -44,7 +44,7 @@ class LoggerFactory static::addStreamHandler($logger, $stream, $loglevel); } - Logger::setLogger($logger); + Logger::init($logger); return $logger; } diff --git a/tests/src/Core/Config/ConfigurationTest.php b/tests/src/Core/Config/ConfigurationTest.php index 6ce81a41b0..0437f1e7ad 100644 --- a/tests/src/Core/Config/ConfigurationTest.php +++ b/tests/src/Core/Config/ConfigurationTest.php @@ -9,6 +9,20 @@ use Friendica\Test\MockedTest; class ConfigurationTest extends MockedTest { + public function dataTests() + { + return [ + 'string' => ['data' => 'it'], + 'boolTrue' => ['data' => true], + 'boolFalse' => ['data' => false], + 'integer' => ['data' => 235], + 'decimal' => ['data' => 2.456], + 'array' => ['data' => ['1', 2, '3', true, false]], + 'boolIntTrue' => ['data' => 1], + 'boolIntFalse' => ['Data' => 0], + ]; + } + /** * Test the configuration initialization */ @@ -24,17 +38,18 @@ class ConfigurationTest extends MockedTest } /** - * Test if the configuration load() method + * Test the configuration load() method */ public function testCacheLoad() { $configCache = new ConfigCache(); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(true)->twice(); + $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(3); // constructor loading $configAdapter->shouldReceive('load')->andReturn([])->once(); // expected loading $configAdapter->shouldReceive('load')->andReturn(['testing' => ['test' => 'it']])->once(); + $configAdapter->shouldReceive('isLoaded')->with('testing', 'test')->andReturn(true)->once(); $configuration = new Configuration($configCache, $configAdapter); $configuration->load('testing'); @@ -44,17 +59,18 @@ class ConfigurationTest extends MockedTest } /** - * Test if the configuration load() method with overwrite + * Test the configuration load() method with overwrite */ public function testCacheLoadDouble() { $configCache = new ConfigCache(); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(3); + $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(5); // constructor loading $configAdapter->shouldReceive('load')->andReturn([])->once(); // expected loading $configAdapter->shouldReceive('load')->andReturn(['testing' => ['test' => 'it']])->once(); + $configAdapter->shouldReceive('isLoaded')->with('testing', 'test')->andReturn(true)->twice(); // expected next loading $configAdapter->shouldReceive('load')->andReturn(['testing' => ['test' => 'again']])->once(); @@ -71,40 +87,43 @@ class ConfigurationTest extends MockedTest } /** - * Test if the configuration get() and set() methods without adapter + * Test the configuration get() and set() methods without adapter + * @dataProvider dataTests */ - public function testSetGetWithoutDB() + public function testSetGetWithoutDB($data) { $configCache = new ConfigCache(); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(false)->twice(); + $configAdapter->shouldReceive('isConnected')->andReturn(false)->times(3); $configuration = new Configuration($configCache, $configAdapter); - $this->assertTrue($configuration->set('test', 'it', 'now')); + $this->assertTrue($configuration->set('test', 'it', $data)); - $this->assertEquals('now', $configuration->get('test', 'it')); - $this->assertEquals('now', $configuration->getCache()->get('test', 'it')); + $this->assertEquals($data, $configuration->get('test', 'it')); + $this->assertEquals($data, $configuration->getCache()->get('test', 'it')); } /** - * Test if the configuration get() and set() methods with adapter + * Test the configuration get() and set() methods with adapter + * @dataProvider dataTests */ - public function testSetGetWithDB() + public function testSetGetWithDB($data) { $configCache = new ConfigCache(); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(true)->twice(); + $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(3); // constructor loading $configAdapter->shouldReceive('load')->andReturn([])->once(); - $configAdapter->shouldReceive('set')->with('test', 'it', 'now')->andReturn(true)->once(); + $configAdapter->shouldReceive('isLoaded')->with('test', 'it')->andReturn(true)->once(); + $configAdapter->shouldReceive('set')->with('test', 'it', $data)->andReturn(true)->once(); $configuration = new Configuration($configCache, $configAdapter); - $this->assertTrue($configuration->set('test', 'it', 'now')); + $this->assertTrue($configuration->set('test', 'it', $data)); - $this->assertEquals('now', $configuration->get('test', 'it')); - $this->assertEquals('now', $configuration->getCache()->get('test', 'it')); + $this->assertEquals($data, $configuration->get('test', 'it')); + $this->assertEquals($data, $configuration->getCache()->get('test', 'it')); } /** @@ -133,15 +152,18 @@ class ConfigurationTest extends MockedTest /** * Test the configuration get() method with refresh + * @dataProvider dataTests */ - public function testGetWithRefresh() + public function testGetWithRefresh($data) { $configCache = new ConfigCache(['test' => ['it' => 'now']]); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(3); + $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(4); // constructor loading $configAdapter->shouldReceive('load')->andReturn([])->once(); - $configAdapter->shouldReceive('get')->with('test', 'it')->andReturn('again')->once(); + $configAdapter->shouldReceive('isLoaded')->with('test', 'it')->andReturn(true)->twice(); + $configAdapter->shouldReceive('get')->with('test', 'it')->andReturn($data)->once(); + $configAdapter->shouldReceive('isLoaded')->with('test', 'not')->andReturn(false)->once(); $configAdapter->shouldReceive('get')->with('test', 'not')->andReturn('!!')->once(); $configuration = new Configuration($configCache, $configAdapter); @@ -151,8 +173,8 @@ class ConfigurationTest extends MockedTest $this->assertEquals('now', $configuration->getCache()->get('test', 'it')); // with refresh - $this->assertEquals('again', $configuration->get('test', 'it', null, true)); - $this->assertEquals('again', $configuration->getCache()->get('test', 'it')); + $this->assertEquals($data, $configuration->get('test', 'it', null, true)); + $this->assertEquals($data, $configuration->getCache()->get('test', 'it')); // without refresh and wrong value and default $this->assertEquals('default', $configuration->get('test', 'not', 'default')); @@ -160,19 +182,55 @@ class ConfigurationTest extends MockedTest } /** - * Test the configuration delete() method without adapter + * Test the configuration get() method with different isLoaded settings + * @dataProvider dataTests */ - public function testDeleteWithoutDB() + public function testGetWithoutLoaded($data) { $configCache = new ConfigCache(['test' => ['it' => 'now']]); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(false)->times(3); + $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(4); + // constructor loading + $configAdapter->shouldReceive('load')->andReturn([])->once(); + + $configAdapter->shouldReceive('isLoaded')->with('test', 'it')->andReturn(false)->once(); + $configAdapter->shouldReceive('get')->with('test', 'it')->andReturn('!!')->once(); + + $configAdapter->shouldReceive('isLoaded')->with('test', 'it')->andReturn(false)->once(); + $configAdapter->shouldReceive('get')->with('test', 'it')->andReturn($data)->once(); + + $configAdapter->shouldReceive('isLoaded')->with('test', 'it')->andReturn(true)->once(); $configuration = new Configuration($configCache, $configAdapter); + // first run is not loaded and no data is found in the DB $this->assertEquals('now', $configuration->get('test', 'it')); $this->assertEquals('now', $configuration->getCache()->get('test', 'it')); + // second run is not loaded, but now data is found in the db (overwrote cache) + $this->assertEquals($data, $configuration->get('test', 'it')); + $this->assertEquals($data, $configuration->getCache()->get('test', 'it')); + + // third run is loaded and therefore cache is used + $this->assertEquals($data, $configuration->get('test', 'it')); + $this->assertEquals($data, $configuration->getCache()->get('test', 'it')); + } + + /** + * Test the configuration delete() method without adapter + * @dataProvider dataTests + */ + public function testDeleteWithoutDB($data) + { + $configCache = new ConfigCache(['test' => ['it' => $data]]); + $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IConfigAdapter'); + $configAdapter->shouldReceive('isConnected')->andReturn(false)->times(4); + + $configuration = new Configuration($configCache, $configAdapter); + + $this->assertEquals($data, $configuration->get('test', 'it')); + $this->assertEquals($data, $configuration->getCache()->get('test', 'it')); + $this->assertTrue($configuration->delete('test', 'it')); $this->assertNull($configuration->get('test', 'it')); $this->assertEquals('!!', $configuration->getCache()->get('test', 'it')); @@ -187,9 +245,11 @@ class ConfigurationTest extends MockedTest { $configCache = new ConfigCache(['test' => ['it' => 'now', 'quarter' => 'true']]); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(5); + $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(6); // constructor loading $configAdapter->shouldReceive('load')->andReturn([])->once(); + $configAdapter->shouldReceive('isLoaded')->with('test', 'it')->andReturn(true)->once(); + $configAdapter->shouldReceive('delete')->with('test', 'it')->andReturn(false)->once(); $configAdapter->shouldReceive('delete')->with('test', 'second')->andReturn(true)->once(); diff --git a/tests/src/Core/Config/PConfigurationTest.php b/tests/src/Core/Config/PConfigurationTest.php index 3d8fb586ce..8ecc9bdf37 100644 --- a/tests/src/Core/Config/PConfigurationTest.php +++ b/tests/src/Core/Config/PConfigurationTest.php @@ -8,17 +8,35 @@ use Friendica\Test\MockedTest; class PConfigurationTest extends MockedTest { + public function dataTests() + { + return [ + 'string' => ['data' => 'it'], + 'boolTrue' => ['data' => true], + 'boolFalse' => ['data' => false], + 'integer' => ['data' => 235], + 'decimal' => ['data' => 2.456], + 'array' => ['data' => ['1', 2, '3', true, false]], + 'boolIntTrue' => ['data' => 1], + 'boolIntFalse' => ['Data' => 0], + ]; + } + /** - * Test if the configuration load() method + * Test the configuration load() method */ public function testCacheLoad() { $uid = 234; $configCache = new ConfigCache(); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IPConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(true)->once(); + $configAdapter->shouldReceive('isConnected')->andReturn(true)->twice(); // expected loading - $configAdapter->shouldReceive('load')->andReturn(['testing' => ['test' => 'it']])->once(); + $configAdapter->shouldReceive('load') + ->with($uid, 'testing') + ->andReturn(['testing' => ['test' => 'it']]) + ->once(); + $configAdapter->shouldReceive('isLoaded')->with($uid, 'testing', 'test')->andReturn(true)->once(); $configuration = new PConfiguration($configCache, $configAdapter); $configuration->load($uid, 'testing'); @@ -27,16 +45,17 @@ class PConfigurationTest extends MockedTest } /** - * Test if the configuration load() method with overwrite + * Test the configuration load() method with overwrite */ public function testCacheLoadDouble() { $uid = 234; $configCache = new ConfigCache(); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IPConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(true)->twice(); + $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(4); // expected loading - $configAdapter->shouldReceive('load')->andReturn(['testing' => ['test' => 'it']])->once(); + $configAdapter->shouldReceive('load')->with($uid, 'testing')->andReturn(['testing' => ['test' => 'it']])->once(); + $configAdapter->shouldReceive('isLoaded')->with($uid, 'testing', 'test')->andReturn(true)->twice(); // expected next loading $configAdapter->shouldReceive('load')->andReturn(['testing' => ['test' => 'again']])->once(); @@ -51,38 +70,41 @@ class PConfigurationTest extends MockedTest } /** - * Test if the configuration get() and set() methods without adapter + * Test the configuration get() and set() methods without adapter + * @dataProvider dataTests */ - public function testSetGetWithoutDB() + public function testSetGetWithoutDB($data) { $uid = 234; $configCache = new ConfigCache(); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IPConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(false)->once(); + $configAdapter->shouldReceive('isConnected')->andReturn(false)->times(2); $configuration = new PConfiguration($configCache, $configAdapter); - $this->assertTrue($configuration->set($uid, 'test', 'it', 'now')); + $this->assertTrue($configuration->set($uid, 'test', 'it', $data)); - $this->assertEquals('now', $configuration->get($uid, 'test', 'it')); + $this->assertEquals($data, $configuration->get($uid, 'test', 'it')); } /** - * Test if the configuration get() and set() methods with adapter + * Test the configuration get() and set() methods with adapter + * @dataProvider dataTests */ - public function testSetGetWithDB() + public function testSetGetWithDB($data) { $uid = 234; $configCache = new ConfigCache(); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IPConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(true)->once(); - $configAdapter->shouldReceive('set')->with($uid, 'test', 'it', 'now')->andReturn(true)->once(); + $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(2); + $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(true)->once(); + $configAdapter->shouldReceive('set')->with($uid, 'test', 'it', $data)->andReturn(true)->once(); $configuration = new PConfiguration($configCache, $configAdapter); - $this->assertTrue($configuration->set($uid, 'test', 'it', 'now')); + $this->assertTrue($configuration->set($uid, 'test', 'it', $data)); - $this->assertEquals('now', $configuration->get($uid, 'test', 'it')); + $this->assertEquals($data, $configuration->get($uid, 'test', 'it')); } /** @@ -109,15 +131,19 @@ class PConfigurationTest extends MockedTest /** * Test the configuration get() method with refresh + * @dataProvider dataTests */ - public function testGetWithRefresh() + public function testGetWithRefresh($data) { $uid = 234; $configCache = new ConfigCache(); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IPConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(3); + $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(4); + $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(false)->once(); $configAdapter->shouldReceive('get')->with($uid, 'test', 'it')->andReturn('now')->once(); - $configAdapter->shouldReceive('get')->with($uid, 'test', 'it')->andReturn('again')->once(); + $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(true)->twice(); + $configAdapter->shouldReceive('get')->with($uid, 'test', 'it')->andReturn($data)->once(); + $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'not')->andReturn(false)->once(); $configAdapter->shouldReceive('get')->with($uid, 'test', 'not')->andReturn('!!')->once(); $configuration = new PConfiguration($configCache, $configAdapter); @@ -128,26 +154,58 @@ class PConfigurationTest extends MockedTest $this->assertEquals('now', $configuration->get($uid, 'test', 'it')); // with refresh (and load the second value out of the db) - $this->assertEquals('again', $configuration->get($uid, 'test', 'it', null, true)); + $this->assertEquals($data, $configuration->get($uid, 'test', 'it', null, true)); // without refresh and wrong value and default $this->assertEquals('default', $configuration->get($uid, 'test', 'not', 'default')); } /** - * Test the configuration delete() method without adapter + * Test the configuration get() method with different isLoaded settings + * @dataProvider dataTests */ - public function testDeleteWithoutDB() + public function testGetWithoutLoaded($data) { $uid = 234; $configCache = new ConfigCache(); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IPConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(false)->times(3); + $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(3); + + $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(false)->once(); + $configAdapter->shouldReceive('get')->with($uid, 'test', 'it')->andReturn('!!')->once(); + + $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(false)->once(); + $configAdapter->shouldReceive('get')->with($uid, 'test', 'it')->andReturn($data)->once(); + + $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(true)->once(); $configuration = new PConfiguration($configCache, $configAdapter); - $this->assertTrue($configuration->set($uid, 'test', 'it', 'now')); - $this->assertEquals('now', $configuration->get($uid, 'test', 'it')); + // first run is not loaded and no data is found in the DB + $this->assertNull($configuration->get($uid, 'test', 'it')); + + // second run is not loaded, but now data is found in the db (overwrote cache) + $this->assertEquals($data, $configuration->get($uid,'test', 'it')); + + // third run is loaded and therefore cache is used + $this->assertEquals($data, $configuration->get($uid,'test', 'it')); + } + + /** + * Test the configuration delete() method without adapter + * @dataProvider dataTests + */ + public function testDeleteWithoutDB($data) + { + $uid = 234; + $configCache = new ConfigCache(); + $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IPConfigAdapter'); + $configAdapter->shouldReceive('isConnected')->andReturn(false)->times(4); + + $configuration = new PConfiguration($configCache, $configAdapter); + + $this->assertTrue($configuration->set($uid, 'test', 'it', $data)); + $this->assertEquals($data, $configuration->get($uid, 'test', 'it')); $this->assertTrue($configuration->delete($uid, 'test', 'it')); $this->assertNull($configuration->get($uid, 'test', 'it')); @@ -161,8 +219,10 @@ class PConfigurationTest extends MockedTest $uid = 234; $configCache = new ConfigCache(); $configAdapter = \Mockery::mock('Friendica\Core\Config\Adapter\IPConfigAdapter'); - $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(5); + $configAdapter->shouldReceive('isConnected')->andReturn(true)->times(6); $configAdapter->shouldReceive('set')->with($uid, 'test', 'it', 'now')->andReturn(false)->once(); + $configAdapter->shouldReceive('isLoaded')->with($uid, 'test', 'it')->andReturn(true)->once(); + $configAdapter->shouldReceive('delete')->with($uid, 'test', 'it')->andReturn(false)->once(); $configAdapter->shouldReceive('delete')->with($uid, 'test', 'second')->andReturn(true)->once();