3 namespace Friendica\Test\src\Core\Config;
5 use Friendica\Core\Config\Capability\ISetConfigValuesTransactionally;
6 use Friendica\Core\Config\Model\Config;
7 use Friendica\Core\Config\Model\ConfigTransaction;
8 use Friendica\Core\Config\Util\ConfigFileManager;
9 use Friendica\Core\Config\ValueObject\Cache;
10 use Friendica\Test\MockedTest;
11 use Friendica\Test\Util\VFSTrait;
13 class ConfigTransactionTest extends MockedTest
17 /** @var ConfigFileManager */
18 protected $configFileManager;
20 protected function setUp(): void
26 $this->configFileManager = new ConfigFileManager($this->root->url(), $this->root->url() . '/config/', $this->root->url() . '/static/');
29 public function dataTests(): array
33 'data' => include dirname(__FILE__, 4) . '/datasets/B.node.config.php',
38 public function testInstance()
40 $config = new Config($this->configFileManager, new Cache());
41 $configTransaction = new ConfigTransaction($config);
43 self::assertInstanceOf(ISetConfigValuesTransactionally::class, $configTransaction);
44 self::assertInstanceOf(ConfigTransaction::class, $configTransaction);
47 public function testConfigTransaction()
49 $config = new Config($this->configFileManager, new Cache());
50 $config->set('config', 'key1', 'value1');
51 $config->set('system', 'key2', 'value2');
52 $config->set('system', 'keyDel', 'valueDel');
53 $config->set('delete', 'keyDel', 'catDel');
55 $configTransaction = new ConfigTransaction($config);
56 self::assertEquals('value1', $configTransaction->get('config', 'key1'));
57 self::assertEquals('value2', $configTransaction->get('system', 'key2'));
58 self::assertEquals('valueDel', $configTransaction->get('system', 'keyDel'));
59 self::assertEquals('catDel', $configTransaction->get('delete', 'keyDel'));
60 // the config file knows it as well immediately
61 $tempData = include $this->root->url() . '/config/' . ConfigFileManager::CONFIG_DATA_FILE;
62 self::assertEquals('value1', $tempData['config']['key1'] ?? null);
63 self::assertEquals('value2', $tempData['system']['key2'] ?? null);
66 $configTransaction->set('transaction', 'key3', 'value3');
67 // overwrite key-value
68 $configTransaction->set('config', 'key1', 'changedValue1');
70 $configTransaction->delete('system', 'keyDel');
71 // delete last key of category - so the category is gone
72 $configTransaction->delete('delete', 'keyDel');
74 // The main config still doesn't know about the change
75 self::assertNull($config->get('transaction', 'key3'));
76 self::assertEquals('value1', $config->get('config', 'key1'));
77 self::assertEquals('valueDel', $config->get('system', 'keyDel'));
78 self::assertEquals('catDel', $config->get('delete', 'keyDel'));
79 // but the transaction config of course knows it
80 self::assertEquals('value3', $configTransaction->get('transaction', 'key3'));
81 self::assertEquals('changedValue1', $configTransaction->get('config', 'key1'));
82 self::assertNull($configTransaction->get('system', 'keyDel'));
83 self::assertNull($configTransaction->get('delete', 'keyDel'));
84 // The config file still doesn't know it either
85 $tempData = include $this->root->url() . '/config/' . ConfigFileManager::CONFIG_DATA_FILE;
86 self::assertEquals('value1', $tempData['config']['key1'] ?? null);
87 self::assertEquals('value2', $tempData['system']['key2'] ?? null);
88 self::assertEquals('catDel', $tempData['delete']['keyDel'] ?? null);
89 self::assertNull($tempData['transaction']['key3'] ?? null);
92 $configTransaction->commit();
94 // Now every config and file knows the change
95 self::assertEquals('changedValue1', $config->get('config', 'key1'));
96 self::assertEquals('value3', $config->get('transaction', 'key3'));
97 self::assertNull($config->get('system', 'keyDel'));
98 self::assertNull($config->get('delete', 'keyDel'));
99 self::assertEquals('value3', $configTransaction->get('transaction', 'key3'));
100 self::assertEquals('changedValue1', $configTransaction->get('config', 'key1'));
101 self::assertNull($configTransaction->get('system', 'keyDel'));
102 $tempData = include $this->root->url() . '/config/' . ConfigFileManager::CONFIG_DATA_FILE;
103 self::assertEquals('changedValue1', $tempData['config']['key1'] ?? null);
104 self::assertEquals('value2', $tempData['system']['key2'] ?? null);
105 self::assertEquals('value3', $tempData['transaction']['key3'] ?? null);
106 self::assertNull($tempData['system']['keyDel'] ?? null);
107 self::assertNull($tempData['delete']['keyDel'] ?? null);
108 // the whole category should be gone
109 self::assertNull($tempData['delete'] ?? null);