67 lines
1.9 KiB
TypeScript
67 lines
1.9 KiB
TypeScript
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
import { tmpdir } from 'node:os';
|
|
import { join } from 'node:path';
|
|
|
|
import { describe, expect, test } from 'vitest';
|
|
|
|
import { mergeApiServerEnv } from './api-server-dev.mjs';
|
|
|
|
type EnvMap = Record<string, string>;
|
|
|
|
function withTempEnvFiles(
|
|
files: Record<string, string>,
|
|
assertEnv: (env: EnvMap, tempDir: string) => void,
|
|
) {
|
|
const tempDir = mkdtempSync(join(tmpdir(), 'genarrative-api-env-'));
|
|
|
|
try {
|
|
for (const [fileName, content] of Object.entries(files)) {
|
|
writeFileSync(join(tempDir, fileName), content, 'utf8');
|
|
}
|
|
|
|
assertEnv(mergeApiServerEnv(tempDir, {}) as EnvMap, tempDir);
|
|
} finally {
|
|
rmSync(tempDir, { recursive: true, force: true });
|
|
}
|
|
}
|
|
|
|
describe('api-server-dev env merge', () => {
|
|
test('.env.local 和 .env.secrets.local 可以覆盖 .env 默认值', () => {
|
|
withTempEnvFiles(
|
|
{
|
|
'.env': [
|
|
'SMS_AUTH_ENABLED=false',
|
|
'HYPER3D_API_KEY=',
|
|
'GENARRATIVE_SPACETIME_DATABASE=from-env',
|
|
].join('\n'),
|
|
'.env.local': [
|
|
'SMS_AUTH_ENABLED=true',
|
|
'HYPER3D_API_KEY=local-key',
|
|
].join('\n'),
|
|
'.env.secrets.local': 'HYPER3D_API_KEY=secret-key',
|
|
},
|
|
(env) => {
|
|
expect(env.SMS_AUTH_ENABLED).toBe('true');
|
|
expect(env.HYPER3D_API_KEY).toBe('secret-key');
|
|
expect(env.GENARRATIVE_SPACETIME_DATABASE).toBe('from-env');
|
|
},
|
|
);
|
|
});
|
|
|
|
test('外层 shell 变量优先于本地 env 文件', () => {
|
|
withTempEnvFiles(
|
|
{
|
|
'.env': 'HYPER3D_API_KEY=from-env',
|
|
'.env.local': 'HYPER3D_API_KEY=from-local',
|
|
'.env.secrets.local': 'HYPER3D_API_KEY=from-secrets',
|
|
},
|
|
(_env, tempDir) => {
|
|
expect(
|
|
mergeApiServerEnv(tempDir, { HYPER3D_API_KEY: 'from-shell' })
|
|
.HYPER3D_API_KEY,
|
|
).toBe('from-shell');
|
|
},
|
|
);
|
|
});
|
|
});
|