add dashboard MoA settings controls
This commit is contained in:
106
src/settings-store-moa.test.ts
Normal file
106
src/settings-store-moa.test.ts
Normal file
@@ -0,0 +1,106 @@
|
||||
import fs from 'node:fs';
|
||||
import os from 'node:os';
|
||||
import path from 'node:path';
|
||||
|
||||
import { afterEach, describe, expect, it } from 'vitest';
|
||||
|
||||
import { getMoaSettings, updateMoaSettings } from './settings-store-moa.js';
|
||||
|
||||
const originalCwd = process.cwd();
|
||||
let tempDir: string | null = null;
|
||||
|
||||
function writeTempEnv(content: string): string {
|
||||
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ejclaw-moa-settings-'));
|
||||
fs.writeFileSync(path.join(tempDir, '.env'), content, { mode: 0o600 });
|
||||
process.chdir(tempDir);
|
||||
return path.join(tempDir, '.env');
|
||||
}
|
||||
|
||||
afterEach(() => {
|
||||
process.chdir(originalCwd);
|
||||
if (tempDir) fs.rmSync(tempDir, { recursive: true, force: true });
|
||||
tempDir = null;
|
||||
});
|
||||
|
||||
describe('MoA settings store', () => {
|
||||
it('reads MoA config without exposing API keys', () => {
|
||||
writeTempEnv(
|
||||
[
|
||||
'MOA_ENABLED=true',
|
||||
'MOA_REF_MODELS=kimi,glm',
|
||||
'MOA_KIMI_MODEL=kimi-k2.6',
|
||||
'MOA_KIMI_BASE_URL=https://api.kimi.com/coding',
|
||||
'MOA_KIMI_API_FORMAT=anthropic',
|
||||
'MOA_KIMI_API_KEY=sk-kimi-secret',
|
||||
'MOA_GLM_MODEL=glm-5.1',
|
||||
'MOA_GLM_BASE_URL=https://open.bigmodel.cn/api/anthropic',
|
||||
'MOA_GLM_API_FORMAT=anthropic',
|
||||
'MOA_GLM_API_KEY=glm-secret',
|
||||
'',
|
||||
].join('\n'),
|
||||
);
|
||||
|
||||
expect(getMoaSettings()).toMatchObject({
|
||||
enabled: true,
|
||||
referenceModels: ['kimi', 'glm'],
|
||||
models: [
|
||||
{
|
||||
name: 'kimi',
|
||||
enabled: true,
|
||||
model: 'kimi-k2.6',
|
||||
apiFormat: 'anthropic',
|
||||
apiKeyConfigured: true,
|
||||
},
|
||||
{
|
||||
name: 'glm',
|
||||
enabled: true,
|
||||
model: 'glm-5.1',
|
||||
apiFormat: 'anthropic',
|
||||
apiKeyConfigured: true,
|
||||
},
|
||||
],
|
||||
});
|
||||
expect(JSON.stringify(getMoaSettings())).not.toContain('sk-kimi-secret');
|
||||
});
|
||||
|
||||
it('updates the master toggle, active models, and replacement API keys', () => {
|
||||
const envFile = writeTempEnv(
|
||||
[
|
||||
'MOA_ENABLED=true',
|
||||
'MOA_REF_MODELS=kimi,glm',
|
||||
'MOA_KIMI_MODEL=kimi-k2.6',
|
||||
'MOA_KIMI_BASE_URL=https://api.kimi.com/coding',
|
||||
'MOA_KIMI_API_FORMAT=anthropic',
|
||||
'MOA_KIMI_API_KEY=old-secret',
|
||||
'MOA_GLM_MODEL=glm-5.1',
|
||||
'MOA_GLM_BASE_URL=https://open.bigmodel.cn/api/anthropic',
|
||||
'MOA_GLM_API_FORMAT=anthropic',
|
||||
'MOA_GLM_API_KEY=glm-secret',
|
||||
'',
|
||||
].join('\n'),
|
||||
);
|
||||
|
||||
const updated = updateMoaSettings({
|
||||
enabled: false,
|
||||
models: [
|
||||
{
|
||||
name: 'kimi',
|
||||
enabled: false,
|
||||
model: 'kimi-k2.7',
|
||||
baseUrl: 'https://api.kimi.com/coding',
|
||||
apiFormat: 'anthropic',
|
||||
apiKey: 'new-secret',
|
||||
},
|
||||
{ name: 'glm', enabled: true },
|
||||
],
|
||||
});
|
||||
|
||||
expect(updated.enabled).toBe(false);
|
||||
expect(updated.referenceModels).toEqual(['glm']);
|
||||
const content = fs.readFileSync(envFile, 'utf-8');
|
||||
expect(content).toContain('MOA_ENABLED=false');
|
||||
expect(content).toContain('MOA_REF_MODELS=glm');
|
||||
expect(content).toContain('MOA_KIMI_MODEL=kimi-k2.7');
|
||||
expect(content).toContain('MOA_KIMI_API_KEY=new-secret');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user