Passed
Push — master ( ac1451...1d2831 )
by Alan
02:29 queued 11s
created

ConfigTest::testConfigOutOfBounds()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 5
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 11
rs 10
1
<?php
2
3
namespace FigTree\Config\Tests;
4
5
use FigTree\Exceptions\{
6
	InvalidDirectoryException,
7
	InvalidPathException,
8
};
9
use FigTree\Config\{
10
	Exceptions\InvalidConfigFileException,
11
	Exceptions\InvalidConfigFilePathException,
12
	Contracts\ConfigInterface,
13
	Contracts\ConfigFactoryInterface,
14
	Contracts\ConfigRepositoryInterface,
15
	AbstractConfig,
16
	AbstractConfigRepository,
17
	Config,
18
	ConfigFactory,
19
	ConfigRepository,
20
};
21
use FigTree\Config\Contracts\ConfigurableInterface;
22
use FigTree\Config\Tests\Dummies\ConfigurableClass;
23
24
class ConfigTest extends AbstractTestCase
25
{
26
	/**
27
	 * @small
28
	 */
29
	public function testConfigRepository()
30
	{
31
		$factory = new ConfigFactory();
32
33
		$this->assertInstanceOf(ConfigFactoryInterface::class, $factory);
34
35
		$repo = new ConfigRepository($factory);
36
37
		$this->assertInstanceOf(ConfigRepositoryInterface::class, $repo);
38
		$this->assertInstanceOf(AbstractConfigRepository::class, $repo);
39
40
		$repo->addDirectory(__DIR__ . '/Data/Config/Alpha');
41
		$repo->addDirectory(__DIR__ . '/Data/Config/Beta');
42
43
		$directories = $repo->getDirectories();
44
45
		$this->assertIsArray($directories);
46
		$this->assertCount(2, $directories);
47
48
		$this->assertEquals($this->path(__DIR__, 'Data', 'Config', 'Alpha'), $directories[0]);
49
		$this->assertEquals($this->path(__DIR__, 'Data', 'Config', 'Beta'), $directories[1]);
50
	}
51
52
	/**
53
	 * @small
54
	 */
55
	public function testConfigRepositoryInvalidDirectory()
56
	{
57
		$factory = new ConfigFactory();
58
59
		$repo = new ConfigRepository($factory);
60
61
		$this->expectException(InvalidDirectoryException::class);
62
63
		$repo->addDirectory(__FILE__);
64
	}
65
66
	/**
67
	 * @small
68
	 */
69
	public function testConfigFactoryInvalidPath()
70
	{
71
		$factory = new ConfigFactory();
72
73
		$repo = new ConfigRepository($factory);
74
75
		$this->expectException(InvalidPathException::class);
76
77
		$repo->addDirectory('foo');
78
	}
79
80
	/**
81
	 * @small
82
	 */
83
	public function testConfigInvalid()
84
	{
85
		$factory = new ConfigFactory();
86
87
		$repo = new ConfigRepository($factory);
88
89
		$repo->addDirectory(__DIR__ . '/Data/Config/Alpha');
90
91
		$this->expectException(InvalidConfigFileException::class);
92
93
		$repo->get('invalid');
94
	}
95
96
	/**
97
	 * @small
98
	 */
99
	public function testConfigOutOfBounds()
100
	{
101
		$factory = new ConfigFactory();
102
103
		$repo = new ConfigRepository($factory);
104
105
		$repo->addDirectory(__DIR__ . '/Data/Config/Alpha');
106
107
		$this->expectException(InvalidConfigFilePathException::class);
108
109
		$repo->get('../oob');
110
	}
111
112
	/**
113
	 * @small
114
	 */
115
	public function testConfigFactoryCreate()
116
	{
117
		$factory = new ConfigFactory();
118
119
		$config = $factory->create([
120
			__DIR__ . '/Data/Config/Alpha/foo.php'
121
		]);
122
123
		$this->assertInstanceOf(ConfigInterface::class, $config);
124
		$this->assertInstanceOf(AbstractConfig::class, $config);
125
		$this->assertInstanceOf(Config::class, $config);
126
127
		$paths = $config->getPaths();
128
129
		$this->assertCount(1, $paths);
130
		$this->assertEquals($this->path(__DIR__, 'Data', 'Config', 'Alpha', 'foo.php'), $paths[0]);
131
	}
132
133
	/**
134
	 * @small
135
	 */
136
	public function testConfigRepositoryGet()
137
	{
138
		$factory = new ConfigFactory();
139
140
		$repo = new ConfigRepository($factory);
141
142
		$repo->addDirectory(__DIR__ . '/Data/Config/Alpha');
143
		$repo->addDirectory(__DIR__ . '/Data/Config/Beta');
144
145
		$config = $repo->get('oof');
146
147
		$this->assertInstanceOf(ConfigInterface::class, $config);
148
		$this->assertInstanceOf(AbstractConfig::class, $config);
149
		$this->assertInstanceOf(Config::class, $config);
150
151
		$paths = $config->getPaths();
152
153
		$this->assertEquals($this->path(__DIR__, 'Data', 'Config', 'Beta', 'oof.php'), $paths[0]);
154
155
		$this->assertEquals('Service Name', $config['name']);
156
		$this->assertEquals('main', $config['server']);
157
158
		$servers = $config['servers'];
159
160
		$this->assertIsArray($servers);
161
		$this->assertArrayHasKey('main', $servers);
162
		$this->assertArrayHasKey('alt', $servers);
163
164
		$this->assertArrayHasKey($config['server'], $servers);
165
166
		$main = $servers['main'];
167
168
		$this->assertIsArray($main);
169
170
		$this->assertArrayHasKey('host', $main);
171
		$this->assertIsString($main['host']);
172
		$this->assertEquals('http://www.service.com', $main['host']);
173
174
		$this->assertArrayHasKey('port', $main);
175
		$this->assertIsInt($main['port']);
176
		$this->assertEquals(80, $main['port']);
177
178
		$this->assertArrayHasKey('secure', $main);
179
		$this->assertIsBool($main['secure']);
180
		$this->assertEquals(false, $main['secure']);
181
182
		$alt = $servers['alt'];
183
184
		$this->assertIsArray($alt);
185
186
		$this->assertArrayHasKey('host', $alt);
187
		$this->assertIsString($alt['host']);
188
		$this->assertEquals('https://www.service.com', $alt['host']);
189
190
		$this->assertArrayHasKey('port', $alt);
191
		$this->assertIsInt($alt['port']);
192
		$this->assertEquals(443, $alt['port']);
193
194
		$this->assertArrayHasKey('secure', $alt);
195
		$this->assertIsBool($alt['secure']);
196
		$this->assertEquals(true, $alt['secure']);
197
	}
198
199
	/**
200
	 * @small
201
	 */
202
	public function testMergedConfig()
203
	{
204
		$factory = new ConfigFactory();
205
206
		$repo = new ConfigRepository($factory);
207
208
		$repo->addDirectory(__DIR__ . '/Data/Config/Alpha');
209
		$repo->addDirectory(__DIR__ . '/Data/Config/Beta');
210
211
		$config = $repo->get('bar');
212
213
		$this->assertEquals('new', $config['name']);
214
215
		$this->assertArrayHasKey('alpha', $config);
216
217
		$alpha = $config['alpha'];
218
		$this->assertArrayHasKey('colors', $alpha);
219
		$this->assertIsArray($alpha['colors']);
220
221
		$this->assertArrayHasKey('beta', $config);
222
223
		$beta = $config['beta'];
224
		$this->assertArrayHasKey('shapes', $beta);
225
		$this->assertIsArray($beta['shapes']);
226
227
		$this->assertArrayHasKey('servers', $config);
228
229
		$servers = $config['servers'];
230
		$this->assertCount(3, $servers);
231
232
		$server = $servers[0];
233
234
		$this->assertEquals('https://service.net', $server['host']);
235
		$this->assertEquals(443, $server['port']);
236
		$this->assertEquals('/api', $server['path']);
237
		$this->assertEquals('username', $server['username']);
238
		$this->assertEquals('This is my password, actually.', $server['password']);
239
		$this->assertEquals(1, $server['version']);
240
241
		$server = $servers[1];
242
243
		$this->assertEquals('https://service.net', $server['host']);
244
		$this->assertEquals(443, $server['port']);
245
		$this->assertEquals('/api', $server['path']);
246
		$this->assertEquals('username', $server['username']);
247
		$this->assertEquals('This is my password, actually.', $server['password']);
248
		$this->assertEquals(2, $server['version']);
249
250
		$server = $servers[2];
251
252
		$this->assertEquals('https://service.org', $server['host']);
253
		$this->assertEquals(443, $server['port']);
254
		$this->assertEquals('/api', $server['path']);
255
		$this->assertEquals('slj', $server['username']);
256
		$this->assertEquals('sn@kes on a Plane!', $server['password']);
257
		$this->assertEquals(2, $server['version']);
258
	}
259
260
	public function testConfigurable()
261
	{
262
		$factory = new ConfigFactory();
263
264
		$repo = new ConfigRepository($factory);
265
266
		$repo->addDirectory(__DIR__ . '/Data/Config/Alpha');
267
		$repo->addDirectory(__DIR__ . '/Data/Config/Beta');
268
269
		$configurable = new ConfigurableClass($repo);
270
271
		$this->assertInstanceOf(ConfigurableInterface::class, $configurable);
272
273
		$this->assertEquals('new', $configurable->getName());
274
	}
275
}
276