Skip to content

Commit

Permalink
Merge pull request #36 from kschroeder/develop
Browse files Browse the repository at this point in the history
Some Builder Factory stuff
  • Loading branch information
kschroeder authored Feb 22, 2017
2 parents 8d9e7bb + fde4ecf commit a180872
Show file tree
Hide file tree
Showing 2 changed files with 175 additions and 17 deletions.
44 changes: 27 additions & 17 deletions lib/Config/BuilderFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,42 +52,52 @@ public function getPersistence()
return $persistence;
}

protected function getSecureBaseDirectories()
public function getSecureBaseDirectories()
{
$cwd = getcwd();
chdir($this->baseDirectory->getPath());
$config = json_encode($this->configuration->configurationDirectories);
$config = $this->configuration->configurationDirectories;
$config = json_encode($config);
$config = json_decode($config, true);
$baseDirs = [];
if (is_array($config)) {
// This code depends on chdir() having been called in MagiumConfigurationFactory
foreach ($config as $dir) {
if (is_array($config) && isset($config['directory'])) {
if (!is_array($config['directory'])) {
$config['directory'] = [$config['directory']];
}
foreach ($config['directory'] as $dir) {
$path = realpath($dir);
if (!is_dir($path)) {
throw new InvalidConfigurationLocationException('A secure configuration path cannot be determined for the directory: ' . $dir);
}
$baseDirs[] = $path;
}
}
chdir($cwd);
return $baseDirs;
}

protected function getConfigurationFiles(array $secureBaseDirectories = [])
public function getConfigurationFiles(array $secureBaseDirectories = [])
{
$config = json_encode($this->configuration->configurationFiles);
$config = json_decode($config, true);
$files = [];
foreach ($config as $file) {
$found = false;
foreach ($secureBaseDirectories as $base) {
chdir($base);
$path = realpath($file);
if ($path) {
$found = true;
$files[] = $path;
}
if (isset($config['file'])) {
if (!is_array($config['file'])) {
$config['file'] = [$config['file']];
}
if (!$found) {
throw new InvalidConfigurationLocationException('Could not find file: ' . $file);
foreach ($config['file'] as $file) {
$found = false;
foreach ($secureBaseDirectories as $base) {
chdir($base);
$path = realpath($file);
if ($path) {
$found = true;
$files[] = $path;
}
}
if (!$found) {
throw new InvalidConfigurationLocationException('Could not find file: ' . $file);
}
}
}
return $files;
Expand Down
148 changes: 148 additions & 0 deletions tests/Config/BuilderFactoryTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
<?php

namespace Magium\Configuration\Tests\Config;

use Magium\Configuration\Config\BuilderFactory;
use Magium\Configuration\File\Context\AbstractContextConfigurationFile;
use PHPUnit\Framework\TestCase;

class BuilderFactoryTest extends TestCase
{

public function testSingleConfigurationDirectory()
{
$config = new \SimpleXMLElement(<<<XML
<?xml version="1.0" encoding="UTF-8" ?>
<magium xmlns="http://www.magiumlib.com/BaseConfiguration">
<persistenceConfiguration>
<driver>
</driver><database></database></persistenceConfiguration><contextConfigurationFile file="" type="xml"/>
<configurationDirectories><directory>xml</directory></configurationDirectories>
</magium>
XML
);

$dirs = $this->runConfigurationDirectory($config);
self::assertCount(1, $dirs);
self::assertContains(realpath(__DIR__ . '/xml'), $dirs);
}

public function testSingleConfigurationDirectoryParent()
{
$config = new \SimpleXMLElement(<<<XML
<?xml version="1.0" encoding="UTF-8" ?>
<magium xmlns="http://www.magiumlib.com/BaseConfiguration">
<persistenceConfiguration>
<driver>
</driver><database></database></persistenceConfiguration><contextConfigurationFile file="" type="xml"/>
<configurationDirectories><directory>..</directory></configurationDirectories>
</magium>
XML
);

$dirs = $this->runConfigurationDirectory($config);
self::assertCount(1, $dirs);
self::assertContains(realpath(__DIR__ . '/..'), $dirs);
}

public function testMutipleConfigurationDirectory()
{
$config = new \SimpleXMLElement(<<<XML
<?xml version="1.0" encoding="UTF-8" ?>
<magium xmlns="http://www.magiumlib.com/BaseConfiguration">
<persistenceConfiguration>
<driver>
</driver><database></database></persistenceConfiguration><contextConfigurationFile file="" type="xml"/>
<configurationDirectories><directory>not-supported</directory><directory>xml</directory></configurationDirectories>
</magium>
XML
);

$dirs = $this->runConfigurationDirectory($config);
self::assertCount(2, $dirs);
self::assertContains(realpath(__DIR__ . '/xml'), $dirs);
self::assertContains(realpath(__DIR__ . '/not-supported'), $dirs);
}

public function testGetOneConfigurationFile()
{
$config = new \SimpleXMLElement(<<<XML
<?xml version="1.0" encoding="UTF-8" ?>
<magium xmlns="http://www.magiumlib.com/BaseConfiguration">
<persistenceConfiguration>
<driver>
</driver><database></database></persistenceConfiguration><contextConfigurationFile file="" type="xml"/>
<configurationFiles><file>config-merge-1.xml</file></configurationFiles>
</magium>
XML
);
$dirs = [realpath(__DIR__ . '/xml')];
$files = $this->runConfigurationFiles($config, $dirs);
self::assertCount(1, $files);
self::assertContains(realpath(__DIR__ . '/xml/config-merge-1.xml'), $files);
}

public function testGetMultipleConfigurationFiles()
{
$config = new \SimpleXMLElement(<<<XML
<?xml version="1.0" encoding="UTF-8" ?>
<magium xmlns="http://www.magiumlib.com/BaseConfiguration">
<persistenceConfiguration>
<driver>
</driver><database></database></persistenceConfiguration><contextConfigurationFile file="" type="xml"/>
<configurationFiles><file>config-merge-1.xml</file><file>config-merge-2.xml</file></configurationFiles>
</magium>
XML
);
$dirs = [realpath(__DIR__ . '/xml')];
$files = $this->runConfigurationFiles($config, $dirs);
self::assertCount(2, $files);
self::assertContains(realpath(__DIR__ . '/xml/config-merge-1.xml'), $files);
}

public function testGetMultipleConfigurationFilesFromMultipleDirectories()
{
$config = new \SimpleXMLElement(<<<XML
<?xml version="1.0" encoding="UTF-8" ?>
<magium xmlns="http://www.magiumlib.com/BaseConfiguration">
<persistenceConfiguration>
<driver>
</driver><database></database></persistenceConfiguration><contextConfigurationFile file="" type="xml"/>
<configurationFiles><file>config-merge-1.xml</file><file>test.unsupported</file></configurationFiles>
</magium>
XML
);
$dirs = [
realpath(__DIR__ . '/xml'),
realpath(__DIR__ . '/not-supported'),
];
$files = $this->runConfigurationFiles($config, $dirs);
self::assertCount(2, $files);
self::assertContains(realpath(__DIR__ . '/xml/config-merge-1.xml'), $files);
self::assertContains(realpath(__DIR__ . '/not-supported/test.unsupported'), $files);
}

protected function runConfigurationFiles(\SimpleXMLElement $config, array $secureDirs)
{
$factory = $this->getFactory($config);
return $factory->getConfigurationFiles($secureDirs);
}

protected function getFactory(\SimpleXMLElement $config)
{
$factory = new BuilderFactory(
new \SplFileInfo(__DIR__ . '../../'),
$config,
$this->createMock(AbstractContextConfigurationFile::class)
);
return $factory;
}

protected function runConfigurationDirectory(\SimpleXMLElement $config)
{
$factory = $this->getFactory($config);
$dirs = $factory->getSecureBaseDirectories();
return $dirs;
}

}

0 comments on commit a180872

Please sign in to comment.