2 namespace Consolidation\Config;
4 use Consolidation\Config\Loader\ConfigProcessor;
5 use Consolidation\Config\Loader\YamlConfigLoader;
7 class ConfigTest extends \PHPUnit_Framework_TestCase
9 public function testSetters()
11 // Pointless tests just to ensure everything is covered.
12 $config = new Config();
13 $config->set('foo', 'bar');
14 $data = $config->export();
15 $this->assertEquals('{"foo":"bar"}', json_encode($data));
18 public function testCombine()
20 // Pointless tests just to ensure everything is covered.
21 $config = new Config();
22 $config->set('foo', 'bar');
23 $config->set('baz', 'boz');
24 $config2 = new Config();
25 $config2->set('foo', 'fu');
26 $config2->set('new', 'blue');
27 $config->combine($config2->export());
28 $this->assertEquals('fu', $config->get('foo'));
29 $this->assertEquals('boz', $config->get('baz'));
30 $this->assertEquals('blue', $config->get('new'));
33 public function testDefault()
41 $foo = ["foo" => "bar"];
43 $config = new Config($data);
45 $config->setDefault('c', 'other');
46 $config->setDefault('d', 'other');
47 $config->setDefault('f', $foo);
49 $this->assertEquals('foo', $config->get('a'));
50 $this->assertEquals('boz', $config->get('c'));
51 $this->assertEquals('other', $config->get('d'));
52 $this->assertEquals('other', $config->getDefault('c'));
53 $this->assertEquals('', $config->get('e'));
54 $this->assertEquals('bar', $config->get('f.foo'));
55 $this->assertEquals('{"foo":"bar"}', json_encode($config->get('f')));
58 public function testDefaultsArray()
60 $data = ['a' => 'foo', 'b' => 'bar', 'c' => 'boz',];
61 $defaults = ['d' => 'foo', 'e' => 'bar', 'f' => 'boz',];
63 // Create reflection class to test private methods
64 $configClass = new \ReflectionClass("Consolidation\Config\Config");
67 $defaultsProperty = $configClass->getProperty("defaults");
68 $defaultsProperty->setAccessible(true);
71 $getDefaultsMethod = $configClass->getMethod("getDefaults");
72 $getDefaultsMethod->setAccessible(true);
74 // Test the config class
75 $config = new Config($data);
77 // Set $config::defaults to an array to test getter and setter
78 $defaultsProperty->setValue($config, $defaults);
79 $this->assertTrue(is_array($defaultsProperty->getValue($config)));
80 $this->assertInstanceOf('Dflydev\DotAccessData\Data',
81 $getDefaultsMethod->invoke($config));
83 // Set $config::defaults to a string to test exception
84 $defaultsProperty->setValue($config, "foo.bar");
85 $this->setExpectedException("Exception");
86 $getDefaultsMethod->invoke($config);
89 public function testConfigurationWithCrossFileReferences()
91 $config = new Config();
92 $processor = new ConfigProcessor();
93 $loader = new YamlConfigLoader();
94 $processor->extend($loader->load(__DIR__ . '/data/config-1.yml'));
95 $processor->extend($loader->load(__DIR__ . '/data/config-2.yml'));
96 $processor->extend($loader->load(__DIR__ . '/data/config-3.yml'));
98 // Does not fail if configuration file cannot be found
99 $processor->extend($loader->load(__DIR__ . '/data/no-such-file.yml'));
101 // We must capture the sources before exporting, as export
102 // dumps this information.
103 $sources = $processor->sources();
105 $config->import($processor->export());
107 $this->assertEquals(implode(',', $config->get('m')), '3');
108 $this->assertEquals($config->get('a'), 'foobarbaz');
110 $this->assertEquals($sources['a'], __DIR__ . '/data/config-3.yml');
111 $this->assertEquals($sources['b'], __DIR__ . '/data/config-2.yml');
112 $this->assertEquals($sources['c'], __DIR__ . '/data/config-1.yml');
115 public function testConfigurationWithReverseOrderCrossFileReferences()
117 $config = new Config();
118 $processor = new ConfigProcessor();
119 $loader = new YamlConfigLoader();
120 $processor->extend($loader->load(__DIR__ . '/data/config-3.yml'));
121 $processor->extend($loader->load(__DIR__ . '/data/config-2.yml'));
122 $processor->extend($loader->load(__DIR__ . '/data/config-1.yml'));
124 $sources = $processor->sources();
125 $config->import($processor->export());
127 $this->assertEquals(implode(',', $config->get('m')), '1');
129 if (strpos($config->get('a'), '$') !== false) {
130 throw new \PHPUnit_Framework_SkippedTestError(
131 'Evaluation of cross-file references in reverse order not supported.'
134 $this->assertEquals($config->get('a'), 'foobarbaz');
136 $this->assertEquals($sources['a'], __DIR__ . '/data/config-3.yml');
137 $this->assertEquals($sources['b'], __DIR__ . '/data/config-2.yml');
138 $this->assertEquals($sources['c'], __DIR__ . '/data/config-1.yml');