import { describe, it, expect, beforeEach, afterEach } from 'vitest';
import { loadConfig, createTestConfig } from '../../src/config/index.js';
describe('config', () => {
const originalEnv = { ...process.env };
beforeEach(() => {
// Clear relevant env vars
delete process.env['AGENT_PRIVATE_KEY'];
delete process.env['AGENT_ORIGIN'];
delete process.env['AGENT_PUBKEY_ID'];
delete process.env['REGISTRY_API_URL'];
delete process.env['REQUEST_TIMEOUT'];
delete process.env['DEBUG'];
});
afterEach(() => {
// Restore original env
process.env = { ...originalEnv };
});
describe('loadConfig', () => {
it('should throw if AGENT_PRIVATE_KEY is missing', () => {
process.env['AGENT_ORIGIN'] = 'test.example.com';
process.env['AGENT_PUBKEY_ID'] = '00000000-0000-0000-0000-000000000000';
expect(() => loadConfig()).toThrow('privateKey: Required');
});
it('should throw if AGENT_ORIGIN is missing', () => {
process.env['AGENT_PRIVATE_KEY'] = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=';
process.env['AGENT_PUBKEY_ID'] = '00000000-0000-0000-0000-000000000000';
expect(() => loadConfig()).toThrow('origin: Required');
});
it('should throw if AGENT_PUBKEY_ID is missing', () => {
process.env['AGENT_PRIVATE_KEY'] = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=';
process.env['AGENT_ORIGIN'] = 'test.example.com';
expect(() => loadConfig()).toThrow('pubkeyId: Required');
});
it('should throw if AGENT_PUBKEY_ID is not a valid UUID', () => {
process.env['AGENT_PRIVATE_KEY'] = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=';
process.env['AGENT_ORIGIN'] = 'test.example.com';
process.env['AGENT_PUBKEY_ID'] = 'not-a-uuid';
expect(() => loadConfig()).toThrow('AGENT_PUBKEY_ID must be a valid UUID');
});
it('should throw if AGENT_PRIVATE_KEY is invalid base64', () => {
process.env['AGENT_PRIVATE_KEY'] = 'not-valid-base64!!!';
process.env['AGENT_ORIGIN'] = 'test.example.com';
process.env['AGENT_PUBKEY_ID'] = '00000000-0000-0000-0000-000000000000';
expect(() => loadConfig()).toThrow('must be a valid base64-encoded Ed25519 private key');
});
it('should throw if AGENT_PRIVATE_KEY has wrong length', () => {
process.env['AGENT_PRIVATE_KEY'] = Buffer.from('too-short').toString('base64');
process.env['AGENT_ORIGIN'] = 'test.example.com';
process.env['AGENT_PUBKEY_ID'] = '00000000-0000-0000-0000-000000000000';
expect(() => loadConfig()).toThrow('must be a valid base64-encoded Ed25519 private key');
});
it('should load valid config with defaults', () => {
process.env['AGENT_PRIVATE_KEY'] = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=';
process.env['AGENT_ORIGIN'] = 'test.example.com';
process.env['AGENT_PUBKEY_ID'] = '00000000-0000-0000-0000-000000000000';
const config = loadConfig();
expect(config.privateKey).toBe('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=');
expect(config.origin).toBe('test.example.com');
expect(config.pubkeyId).toBe('00000000-0000-0000-0000-000000000000');
expect(config.registryUrl).toBe('https://api.agents-registry.com');
expect(config.requestTimeout).toBe(30000);
expect(config.debug).toBe(false);
});
it('should load custom values from env', () => {
process.env['AGENT_PRIVATE_KEY'] = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=';
process.env['AGENT_ORIGIN'] = 'custom.example.com';
process.env['AGENT_PUBKEY_ID'] = '11111111-1111-1111-1111-111111111111';
process.env['REGISTRY_API_URL'] = 'http://localhost:3000';
process.env['REQUEST_TIMEOUT'] = '10000';
process.env['DEBUG'] = 'true';
const config = loadConfig();
expect(config.origin).toBe('custom.example.com');
expect(config.pubkeyId).toBe('11111111-1111-1111-1111-111111111111');
expect(config.registryUrl).toBe('http://localhost:3000');
expect(config.requestTimeout).toBe(10000);
expect(config.debug).toBe(true);
});
it('should accept 64-byte private keys', () => {
// 64-byte key (seed + public key concatenated)
const key64 = Buffer.alloc(64).toString('base64');
process.env['AGENT_PRIVATE_KEY'] = key64;
process.env['AGENT_ORIGIN'] = 'test.example.com';
process.env['AGENT_PUBKEY_ID'] = '00000000-0000-0000-0000-000000000000';
const config = loadConfig();
expect(config.privateKey).toBe(key64);
});
});
describe('createTestConfig', () => {
it('should create valid test config with defaults', () => {
const config = createTestConfig();
expect(config.privateKey).toBeDefined();
expect(config.origin).toBe('test.example.com');
expect(config.pubkeyId).toBe('00000000-0000-0000-0000-000000000000');
expect(config.registryUrl).toBe('http://localhost:3000');
expect(config.requestTimeout).toBe(5000);
expect(config.debug).toBe(false);
});
it('should allow overrides', () => {
const config = createTestConfig({
origin: 'custom.test.example',
debug: true,
});
expect(config.origin).toBe('custom.test.example');
expect(config.debug).toBe(true);
});
});
});