Skip to content

Commit 6e95d2c

Browse files
committed
Add abstract config tests
1 parent f7895c7 commit 6e95d2c

File tree

2 files changed

+410
-0
lines changed

2 files changed

+410
-0
lines changed

tests/AbstractConfigTest.php

Lines changed: 376 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,376 @@
1+
<?php
2+
3+
namespace ConfigWriter\Tests;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use ConfigWriter\AbstractConfig;
7+
use ConfigWriter\Record;
8+
9+
class AbstractConfigTest extends TestCase
10+
{
11+
/**
12+
* @var \ConfigWriter\AbstractConfig
13+
*/
14+
protected $config;
15+
16+
public function setUp()
17+
{
18+
$config = $this
19+
->getMockBuilder('ConfigWriter\AbstractConfig')
20+
->getMockForAbstractClass();
21+
22+
$config->addRecord('settings.development.debug', true, 'Debugging');
23+
$config->addRecord('settings.development.errors', E_ALL, 'Error reporting');
24+
25+
$config->addRecord('database.host', 'localhost', 'Database hostname');
26+
$config->addRecord('database.port', 3306, 'Database port');
27+
28+
$config->addRecord(
29+
'website',
30+
[
31+
'title' => 'My Website',
32+
'description' => 'This is my cool website!',
33+
],
34+
'Website details'
35+
);
36+
37+
$this->config = $config;
38+
}
39+
40+
/**
41+
* @covers \ConfigWriter\AbstractConfig::__construct()
42+
* @covers \ConfigWriter\AbstractConfig::stringToRecord()
43+
*
44+
* @param array $original Predefined data
45+
* @param array $expected Expected data
46+
*
47+
* @dataProvider providerConstructWithPredefinedData
48+
*/
49+
public function testConstructWithPredefinedData($original, $expected)
50+
{
51+
$config = $this
52+
->getMockBuilder('ConfigWriter\AbstractConfig')
53+
->setConstructorArgs([$original])
54+
->getMockForAbstractClass();
55+
56+
$result = $config->data;
57+
58+
$this->assertEquals($expected, $result);
59+
}
60+
61+
/**
62+
* @covers \ConfigWriter\AbstractConfig::stringToRecord()
63+
*/
64+
public function testStringToRecord()
65+
{
66+
$config = $this
67+
->getMockBuilder('ConfigWriter\AbstractConfig')
68+
->getMockForAbstractClass();
69+
70+
$config->addSection(
71+
'database',
72+
[
73+
'database.host' => 'localhost',
74+
'database.port' => 3306,
75+
],
76+
'Database settings'
77+
);
78+
79+
$config->addRecord(
80+
'website',
81+
[
82+
'title' => new Record('My Website'),
83+
'description' => new Record('This is my cool website!'),
84+
],
85+
'Website details'
86+
);
87+
88+
$expected = [
89+
'database' => $this
90+
->getMockBuilder('ConfigWriter\AbstractConfig')
91+
->setConstructorArgs(
92+
[
93+
[
94+
'database' => new Record(
95+
[
96+
'host' => new Record('localhost'),
97+
'port' => new Record(3306),
98+
]
99+
),
100+
],
101+
'Database settings',
102+
]
103+
)
104+
->getMockForAbstractClass(),
105+
'website' => new Record(
106+
[
107+
'title' => new Record('My Website'),
108+
'description' => new Record('This is my cool website!'),
109+
],
110+
'Website details'
111+
),
112+
];
113+
114+
$result = AbstractConfig::stringToRecord($config->data);
115+
116+
$this->assertEquals($expected, $result);
117+
}
118+
119+
120+
/**
121+
* @covers \ConfigWriter\AbstractConfig::recordToString()
122+
*/
123+
public function testRecordToString()
124+
{
125+
$config = $this
126+
->getMockBuilder('ConfigWriter\AbstractConfig')
127+
->getMockForAbstractClass();
128+
129+
$config->addSection(
130+
'database',
131+
[
132+
'database.host' => 'localhost',
133+
'database.port' => 3306,
134+
],
135+
'Database settings'
136+
);
137+
138+
$config->addRecord(
139+
'website',
140+
[
141+
'title' => new Record('My Website'),
142+
'description' => new Record('This is my cool website!'),
143+
],
144+
'Website details'
145+
);
146+
147+
$expected = [
148+
'database' => [
149+
'host' => 'localhost',
150+
'port' => 3306,
151+
],
152+
'website' => [
153+
'title' => 'My Website',
154+
'description' => 'This is my cool website!',
155+
],
156+
];
157+
158+
$result = AbstractConfig::recordToString($config->data);
159+
160+
$this->assertEquals($expected, $result);
161+
162+
$original = [
163+
'development' => [
164+
'debug' => new Record(true, 'Debugging'),
165+
'reporting' => new Record(E_ALL, 'Error reporting'),
166+
],
167+
];
168+
169+
$expected = [
170+
'development' => [
171+
'debug' => true,
172+
'reporting' => E_ALL,
173+
],
174+
];
175+
176+
$result = AbstractConfig::recordToString($original);
177+
178+
$this->assertEquals($expected, $result);
179+
}
180+
181+
/**
182+
* @covers \ConfigWriter\AbstractConfig::addRecord()
183+
* @covers \ConfigWriter\AbstractConfig::set()
184+
* @covers \ConfigWriter\AbstractConfig::stringToRecord()
185+
*
186+
* @param string $key Record's key
187+
* @param mixed|null $value Record's value
188+
* @param mixed|null $comment Record's comment
189+
* @param array $expected Expected data
190+
*
191+
* @dataProvider providerAddRecord
192+
*/
193+
public function testAddRecord($key, $value, $comment, $expected)
194+
{
195+
$config = $this
196+
->getMockBuilder('ConfigWriter\AbstractConfig')
197+
->getMockForAbstractClass();
198+
199+
$config->addRecord($key, $value, $comment);
200+
201+
$result = $config->data;
202+
203+
$this->assertEquals($expected, $result);
204+
}
205+
206+
/**
207+
* @covers \ConfigWriter\AbstractConfig::addSection()
208+
* @covers \ConfigWriter\AbstractConfig::set()
209+
* @covers \ConfigWriter\AbstractConfig::stringToRecord()
210+
*/
211+
public function testAddSection()
212+
{
213+
$config = $this
214+
->getMockBuilder('ConfigWriter\AbstractConfig')
215+
->getMockForAbstractClass();
216+
217+
$database = $config->addSection('database', [], 'Database settings');
218+
219+
$database->addRecord('database.user', 'root', 'Database username');
220+
$database->addRecord('database.pass', '', 'Database password');
221+
222+
$this->assertEquals('Database settings', $config['database']->comment);
223+
224+
$this->assertEquals('root', $config['database']->data['database']['user']->value);
225+
$this->assertEquals('', $config['database']->data['database']['pass']->value);
226+
}
227+
228+
/**
229+
* @covers \ConfigWriter\AbstractConfig::offsetGet()
230+
* @covers \ConfigWriter\Record::offsetGet()
231+
*/
232+
public function testOffsetGet()
233+
{
234+
$this->assertEquals(true, $this->config['settings']['development']['debug']->value);
235+
$this->assertEquals('localhost', $this->config['database']['host']->value);
236+
$this->assertEquals('My Website', $this->config['website']['title']->value);
237+
}
238+
239+
/**
240+
* @covers \ConfigWriter\AbstractConfig::offsetExists()
241+
* @covers \ConfigWriter\Record::offsetExists()
242+
*/
243+
public function testOffsetExists()
244+
{
245+
$this->assertTrue(isset($this->config['database']['host']));
246+
$this->assertFalse(isset($this->config['user']['password']));
247+
}
248+
249+
/**
250+
* @covers \ConfigWriter\AbstractConfig::offsetSet()
251+
* @covers \ConfigWriter\Record::offsetSet()
252+
* @covers \ConfigWriter\AbstractConfig::addRecord()
253+
* @covers \ConfigWriter\AbstractConfig::set()
254+
* @covers \ConfigWriter\AbstractConfig::stringToRecord()
255+
*/
256+
public function testoffsetSet()
257+
{
258+
$username = 'test123';
259+
$this->config['username'] = $username;
260+
$this->assertEquals($username, $this->config['username']->value);
261+
262+
$password = new Record('1234', 'Your password');
263+
$this->config['password'] = $password;
264+
$this->assertEquals($password, $this->config['password']);
265+
266+
$keywords = new Record(['cool', 'website'], 'Website keywords');
267+
$this->config['website']['keywords'] = $keywords;
268+
$this->assertEquals($keywords, $this->config['website']['keywords']);
269+
}
270+
271+
/**
272+
* @covers \ConfigWriter\AbstractConfig::offsetUnset()
273+
* @covers \ConfigWriter\Record::offsetUnset()
274+
* @covers \ConfigWriter\AbstractConfig::set()
275+
* @covers \ConfigWriter\AbstractConfig::stringToRecord()
276+
*/
277+
public function testOffsetUnset()
278+
{
279+
unset($this->config['website']);
280+
$this->assertNull($this->config['website']);
281+
282+
unset($this->config['settings']['development']['debug']);
283+
$this->assertNull($this->config['settings']['development']['debug']);
284+
}
285+
286+
public function providerConstructWithPredefinedData()
287+
{
288+
return [
289+
[
290+
[
291+
'username' => 'user123',
292+
'password' => '1234',
293+
],
294+
[
295+
'username' => new Record('user123'),
296+
'password' => new Record('1234'),
297+
],
298+
],
299+
300+
[
301+
[
302+
'username' => new Record('user123', 'Database username'),
303+
'password' => new Record('1234', 'Database password'),
304+
],
305+
[
306+
'username' => new Record('user123', 'Database username'),
307+
'password' => new Record('1234', 'Database password'),
308+
],
309+
],
310+
311+
[
312+
[
313+
'database' => [
314+
'host' => 'localhost',
315+
'port' => 3306,
316+
],
317+
],
318+
[
319+
'database' => new Record(
320+
[
321+
'host' => new Record('localhost'),
322+
'port' => new Record(3306),
323+
]
324+
),
325+
],
326+
],
327+
328+
[
329+
[
330+
'database' => new Record(
331+
[
332+
'host' => 'localhost',
333+
'port' => 3306,
334+
],
335+
'Database settings'
336+
),
337+
],
338+
[
339+
'database' => new Record(
340+
[
341+
'host' => new Record('localhost'),
342+
'port' => new Record(3306),
343+
],
344+
'Database settings'
345+
),
346+
],
347+
],
348+
];
349+
}
350+
351+
public function providerAddRecord()
352+
{
353+
return [
354+
[
355+
'title',
356+
'My Website',
357+
'Website title',
358+
[
359+
'title' => new Record('My Website', 'Website title'),
360+
],
361+
],
362+
[
363+
'website.title',
364+
'My Website',
365+
'Website title',
366+
[
367+
'website' => new Record(
368+
[
369+
'title' => new Record('My Website', 'Website title'),
370+
]
371+
),
372+
],
373+
],
374+
];
375+
}
376+
}

0 commit comments

Comments
 (0)