Fix/broken merging of parameter bag env placeholders

This commit is contained in:
Michael Devery 2016-10-13 13:42:55 +01:00 committed by Nicolas Grekas
parent f065095db7
commit b53e0de8f0
2 changed files with 82 additions and 5 deletions

View File

@ -71,6 +71,12 @@ class EnvPlaceholderParameterBag extends ParameterBag
*/
public function mergeEnvPlaceholders(self $bag)
{
$this->envPlaceholders = array_merge_recursive($this->envPlaceholders, $bag->getEnvPlaceholders());
if ($newPlaceholders = $bag->getEnvPlaceholders()) {
$this->envPlaceholders += $newPlaceholders;
foreach ($newPlaceholders as $env => $placeholders) {
$this->envPlaceholders[$env] += $placeholders;
}
}
}
}

View File

@ -26,16 +26,87 @@ class EnvPlaceholderParameterBagTest extends \PHPUnit_Framework_TestCase
public function testMergeWillNotDuplicateIdenticalParameters()
{
$originalPlaceholders = array('database_host' => array('localhost'));
$firstBag = new EnvPlaceholderParameterBag($originalPlaceholders);
$envVariableName = 'DB_HOST';
$parameter = sprintf('env(%s)', $envVariableName);
$firstBag = new EnvPlaceholderParameterBag();
// initialize placeholders
$firstBag->get('env(database_host)');
$firstBag->get($parameter);
$secondBag = clone $firstBag;
$firstBag->mergeEnvPlaceholders($secondBag);
$mergedPlaceholders = $firstBag->getEnvPlaceholders();
$this->assertCount(1, $mergedPlaceholders['database_host']);
$placeholderForVariable = $mergedPlaceholders[$envVariableName];
$placeholder = array_values($placeholderForVariable)[0];
$this->assertCount(1, $placeholderForVariable);
$this->assertInternalType('string', $placeholder);
$this->assertContains($envVariableName, $placeholder);
}
public function testMergeWhereFirstBagIsEmptyWillWork()
{
$envVariableName = 'DB_HOST';
$parameter = sprintf('env(%s)', $envVariableName);
$firstBag = new EnvPlaceholderParameterBag();
$secondBag = new EnvPlaceholderParameterBag();
// initialize placeholder only in second bag
$secondBag->get($parameter);
$this->assertEmpty($firstBag->getEnvPlaceholders());
$firstBag->mergeEnvPlaceholders($secondBag);
$mergedPlaceholders = $firstBag->getEnvPlaceholders();
$placeholderForVariable = $mergedPlaceholders[$envVariableName];
$placeholder = array_values($placeholderForVariable)[0];
$this->assertCount(1, $placeholderForVariable);
$this->assertInternalType('string', $placeholder);
$this->assertContains($envVariableName, $placeholder);
}
public function testMergeWherePlaceholderOnlyExistsInSecond()
{
$uniqueEnvName = 'DB_HOST';
$commonEnvName = 'DB_USER';
$uniqueParamName = sprintf('env(%s)', $uniqueEnvName);
$commonParamName = sprintf('env(%s)', $commonEnvName);
$firstBag = new EnvPlaceholderParameterBag();
// initialize common placeholder
$firstBag->get($commonParamName);
$secondBag = clone $firstBag;
// initialize unique placeholder
$secondBag->get($uniqueParamName);
$firstBag->mergeEnvPlaceholders($secondBag);
$merged = $firstBag->getEnvPlaceholders();
$this->assertCount(1, $merged[$uniqueEnvName]);
// second bag has same placeholder for commonEnvName
$this->assertCount(1, $merged[$commonEnvName]);
}
public function testMergeWithDifferentIdentifiersForPlaceholders()
{
$envName = 'DB_USER';
$paramName = sprintf('env(%s)', $envName);
$firstBag = new EnvPlaceholderParameterBag();
$secondBag = new EnvPlaceholderParameterBag();
// initialize placeholders
$firstPlaceholder = $firstBag->get($paramName);
$secondPlaceholder = $secondBag->get($paramName);
$firstBag->mergeEnvPlaceholders($secondBag);
$merged = $firstBag->getEnvPlaceholders();
$this->assertNotEquals($firstPlaceholder, $secondPlaceholder);
$this->assertCount(2, $merged[$envName]);
}
}