UNPKG

maildev

Version:

SMTP Server and Web Interface for reading and testing emails during development

181 lines 8.15 kB
import { describe, it, expect } from 'vitest'; import { validateConfig, formatValidationErrors } from '../../config/validate.js'; import { getDefaultConfig } from '../../config/defaults.js'; describe('validateConfig', () => { const createConfig = (overrides = {}) => ({ ...getDefaultConfig(), ...overrides, }); describe('valid configurations', () => { it('should accept default configuration', () => { const result = validateConfig(getDefaultConfig()); expect(result.valid).toBe(true); expect(result.errors).toHaveLength(0); }); it('should accept valid custom ports', () => { const config = createConfig({ smtp: 2025, web: 3080 }); const result = validateConfig(config); expect(result.valid).toBe(true); }); it('should accept valid authentication config', () => { const config = createConfig({ incomingUser: 'user', incomingPass: 'pass', webUser: 'admin', webPass: 'secret', }); const result = validateConfig(config); expect(result.valid).toBe(true); }); }); describe('port validation', () => { it('should reject invalid SMTP port (too low)', () => { const config = createConfig({ smtp: 0 }); const result = validateConfig(config); expect(result.valid).toBe(false); expect(result.errors.some((e) => e.field === 'smtp')).toBe(true); }); it('should reject invalid SMTP port (too high)', () => { const config = createConfig({ smtp: 70000 }); const result = validateConfig(config); expect(result.valid).toBe(false); expect(result.errors.some((e) => e.field === 'smtp')).toBe(true); }); it('should reject invalid web port', () => { const config = createConfig({ web: -1 }); const result = validateConfig(config); expect(result.valid).toBe(false); expect(result.errors.some((e) => e.field === 'web')).toBe(true); }); it('should reject non-integer ports', () => { const config = createConfig({ smtp: 1025.5 }); const result = validateConfig(config); expect(result.valid).toBe(false); }); }); describe('authentication validation', () => { it('should require password when username is set (SMTP)', () => { const config = createConfig({ incomingUser: 'user' }); const result = validateConfig(config); expect(result.valid).toBe(false); expect(result.errors.some((e) => e.field === 'incomingPass')).toBe(true); }); it('should require username when password is set (SMTP)', () => { const config = createConfig({ incomingPass: 'pass' }); const result = validateConfig(config); expect(result.valid).toBe(false); expect(result.errors.some((e) => e.field === 'incomingUser')).toBe(true); }); it('should require password when username is set (Web)', () => { const config = createConfig({ webUser: 'admin' }); const result = validateConfig(config); expect(result.valid).toBe(false); expect(result.errors.some((e) => e.field === 'webPass')).toBe(true); }); it('should require username when password is set (Web)', () => { const config = createConfig({ webPass: 'secret' }); const result = validateConfig(config); expect(result.valid).toBe(false); expect(result.errors.some((e) => e.field === 'webUser')).toBe(true); }); }); describe('TLS validation', () => { it('should require cert when incomingSecure is enabled', () => { const config = createConfig({ incomingSecure: true }); const result = validateConfig(config); expect(result.valid).toBe(false); expect(result.errors.some((e) => e.field === 'incomingCert')).toBe(true); }); it('should require key when incomingSecure is enabled', () => { const config = createConfig({ incomingSecure: true }); const result = validateConfig(config); expect(result.valid).toBe(false); expect(result.errors.some((e) => e.field === 'incomingKey')).toBe(true); }); it('should require cert when https is enabled', () => { const config = createConfig({ https: true }); const result = validateConfig(config); expect(result.valid).toBe(false); expect(result.errors.some((e) => e.field === 'httpsCert')).toBe(true); }); it('should require key when https is enabled', () => { const config = createConfig({ https: true }); const result = validateConfig(config); expect(result.valid).toBe(false); expect(result.errors.some((e) => e.field === 'httpsKey')).toBe(true); }); }); describe('warnings', () => { it('should warn when SMTP and web ports are the same', () => { const config = createConfig({ smtp: 8080, web: 8080 }); const result = validateConfig(config); expect(result.warnings.some((w) => w.includes('same'))).toBe(true); }); it('should warn when both verbose and silent are enabled', () => { const config = createConfig({ verbose: true, silent: true }); const result = validateConfig(config); expect(result.warnings.some((w) => w.includes('verbose') && w.includes('silent'))).toBe(true); }); it('should warn when web auth is configured but web is disabled', () => { const config = createConfig({ disableWeb: true, webUser: 'admin', webPass: 'secret', }); const result = validateConfig(config); expect(result.warnings.some((w) => w.includes('disabled'))).toBe(true); }); it('should warn when MCP is enabled but web is disabled', () => { const config = createConfig({ disableWeb: true, mcp: true }); const result = validateConfig(config); expect(result.warnings.some((w) => w.includes('MCP'))).toBe(true); }); }); }); describe('formatValidationErrors', () => { it('should format errors correctly', () => { const result = { valid: false, errors: [ { field: 'smtp', message: 'Invalid port' }, { field: 'web', message: 'Invalid port' }, ], warnings: [], }; const formatted = formatValidationErrors(result); expect(formatted).toContain('Configuration errors:'); expect(formatted).toContain('smtp'); expect(formatted).toContain('web'); expect(formatted).toContain('Invalid port'); }); it('should format warnings correctly', () => { const result = { valid: true, errors: [], warnings: ['Port conflict warning'], }; const formatted = formatValidationErrors(result); expect(formatted).toContain('Warnings:'); expect(formatted).toContain('Port conflict warning'); }); it('should format both errors and warnings', () => { const result = { valid: false, errors: [{ field: 'smtp', message: 'Invalid' }], warnings: ['Some warning'], }; const formatted = formatValidationErrors(result); expect(formatted).toContain('Configuration errors:'); expect(formatted).toContain('Warnings:'); }); it('should return empty string for valid config with no warnings', () => { const result = { valid: true, errors: [], warnings: [], }; const formatted = formatValidationErrors(result); expect(formatted).toBe(''); }); }); //# sourceMappingURL=validate.test.js.map