Implement .env configuration
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../src/EnvLoader.php';
|
||||
|
||||
use VoipMs\EnvLoader;
|
||||
|
||||
/**
|
||||
* @param callable(): void $test
|
||||
*/
|
||||
function runTest(string $name, callable $test): void
|
||||
{
|
||||
try {
|
||||
$test();
|
||||
echo "PASS {$name}\n";
|
||||
} catch (Throwable $exception) {
|
||||
fwrite(STDERR, "FAIL {$name}: {$exception->getMessage()}\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
function assertSameValue(mixed $expected, mixed $actual, string $message): void
|
||||
{
|
||||
if ($expected !== $actual) {
|
||||
throw new RuntimeException($message . ' Expected ' . var_export($expected, true) . ', got ' . var_export($actual, true) . '.');
|
||||
}
|
||||
}
|
||||
|
||||
function clearEnvKey(string $key): void
|
||||
{
|
||||
putenv($key);
|
||||
unset($_ENV[$key], $_SERVER[$key]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param list<string> $lines
|
||||
*/
|
||||
function withTempEnvFile(array $lines): string
|
||||
{
|
||||
$path = tempnam(sys_get_temp_dir(), 'voipms-env-');
|
||||
if ($path === false) {
|
||||
throw new RuntimeException('Unable to create temp env file.');
|
||||
}
|
||||
|
||||
file_put_contents($path, implode("\n", $lines) . "\n");
|
||||
|
||||
return $path;
|
||||
}
|
||||
|
||||
runTest('loads simple and quoted .env values', function (): void {
|
||||
foreach (['VOIPMS_TEST_SIMPLE', 'VOIPMS_TEST_SINGLE', 'VOIPMS_TEST_DOUBLE', 'VOIPMS_TEST_EMPTY'] as $key) {
|
||||
clearEnvKey($key);
|
||||
}
|
||||
|
||||
$path = withTempEnvFile([
|
||||
'# comment',
|
||||
'',
|
||||
'VOIPMS_TEST_SIMPLE=value',
|
||||
"VOIPMS_TEST_SINGLE='single quoted value'",
|
||||
'VOIPMS_TEST_DOUBLE="double quoted value"',
|
||||
'VOIPMS_TEST_EMPTY=',
|
||||
]);
|
||||
|
||||
try {
|
||||
EnvLoader::load($path);
|
||||
|
||||
assertSameValue('value', getenv('VOIPMS_TEST_SIMPLE'), 'Simple value should be available through getenv().');
|
||||
assertSameValue('single quoted value', $_ENV['VOIPMS_TEST_SINGLE'] ?? null, 'Single quoted value should be available through $_ENV.');
|
||||
assertSameValue('double quoted value', $_SERVER['VOIPMS_TEST_DOUBLE'] ?? null, 'Double quoted value should be available through $_SERVER.');
|
||||
assertSameValue('', getenv('VOIPMS_TEST_EMPTY'), 'Empty value should be loaded.');
|
||||
} finally {
|
||||
unlink($path);
|
||||
foreach (['VOIPMS_TEST_SIMPLE', 'VOIPMS_TEST_SINGLE', 'VOIPMS_TEST_DOUBLE', 'VOIPMS_TEST_EMPTY'] as $key) {
|
||||
clearEnvKey($key);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
runTest('does not override existing process environment', function (): void {
|
||||
clearEnvKey('VOIPMS_TEST_OVERRIDE');
|
||||
putenv('VOIPMS_TEST_OVERRIDE=from-process');
|
||||
$_ENV['VOIPMS_TEST_OVERRIDE'] = 'from-process';
|
||||
$_SERVER['VOIPMS_TEST_OVERRIDE'] = 'from-process';
|
||||
|
||||
$path = withTempEnvFile([
|
||||
'VOIPMS_TEST_OVERRIDE=from-file',
|
||||
]);
|
||||
|
||||
try {
|
||||
EnvLoader::load($path);
|
||||
|
||||
assertSameValue('from-process', getenv('VOIPMS_TEST_OVERRIDE'), 'Existing getenv() value should win.');
|
||||
assertSameValue('from-process', $_ENV['VOIPMS_TEST_OVERRIDE'] ?? null, 'Existing $_ENV value should win.');
|
||||
assertSameValue('from-process', $_SERVER['VOIPMS_TEST_OVERRIDE'] ?? null, 'Existing $_SERVER value should win.');
|
||||
} finally {
|
||||
unlink($path);
|
||||
clearEnvKey('VOIPMS_TEST_OVERRIDE');
|
||||
}
|
||||
});
|
||||
|
||||
runTest('ignores missing .env files', function (): void {
|
||||
EnvLoader::load(sys_get_temp_dir() . '/voipms-missing-env-file');
|
||||
});
|
||||
Reference in New Issue
Block a user