Implement .env configuration

This commit is contained in:
Jason Thistlethwaite
2026-04-27 22:52:27 +00:00
parent 16feb51b12
commit 324084d419
8 changed files with 259 additions and 9 deletions
+104
View File
@@ -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');
});