feat(email): implement EmailSendJob class for robust email delivery with retry logic and MX record resolution feat(mail): restructure mail module exports for simplified access to core and delivery functionalities
3.6 KiB
3.6 KiB
DCRouter Test Configuration
Running Tests
Run All Tests
cd dcrouter
pnpm test
Run Specific Category
# Run all connection tests
tsx test/run-category.ts connection
# Run all security tests
tsx test/run-category.ts security
# Run all performance tests
tsx test/run-category.ts performance
Run Individual Test File
# Run TLS connection test
tsx test/suite/connection/test.tls-connection.ts
# Run authentication test
tsx test/suite/security/test.authentication.ts
Run Tests with Verbose Output
# All tests with verbose logging
pnpm test -- --verbose
# Individual test with verbose
tsx test/suite/connection/test.tls-connection.ts --verbose
Test Server Configuration
Each test file starts its own SMTP server with specific configuration. Common configurations:
Basic Server
const testServer = await startTestServer({
port: 2525,
hostname: 'localhost'
});
TLS-Enabled Server
const testServer = await startTestServer({
port: 2525,
hostname: 'localhost',
tlsEnabled: true
});
Authenticated Server
const testServer = await startTestServer({
port: 2525,
hostname: 'localhost',
authRequired: true
});
High-Performance Server
const testServer = await startTestServer({
port: 2525,
hostname: 'localhost',
maxConnections: 1000,
size: 50 * 1024 * 1024 // 50MB
});
Port Allocation
Tests use different ports to avoid conflicts:
- Connection tests: 2525-2530
- Command tests: 2531-2540
- Email processing: 2541-2550
- Security tests: 2551-2560
- Performance tests: 2561-2570
- Edge cases: 2571-2580
- RFC compliance: 2581-2590
Test Utilities
Server Lifecycle
All tests follow this pattern:
import { tap, expect } from '@git.zone/tstest/tapbundle';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
let testServer;
tap.test('setup', async () => {
testServer = await startTestServer({ port: 2525 });
});
// Your tests here...
tap.test('cleanup', async () => {
await stopTestServer(testServer);
});
tap.start();
SMTP Client Testing
import { createTestSmtpClient } from '../../helpers/smtp.client.js';
const client = createTestSmtpClient({
host: 'localhost',
port: 2525
});
Low-Level SMTP Testing
import { connectToSmtp, sendSmtpCommand } from '../../helpers/test.utils.js';
const socket = await connectToSmtp('localhost', 2525);
const response = await sendSmtpCommand(socket, 'EHLO test.example.com', '250');
Performance Benchmarks
Expected minimums for production:
- Throughput: >10 emails/second
- Concurrent connections: >100
- Memory increase: <2% under load
- Connection time: <5000ms
- Error rate: <5%
Debugging Failed Tests
Enable Verbose Logging
DEBUG=* tsx test/suite/connection/test.tls-connection.ts
Check Server Logs
Tests output server logs to console. Look for:
- 🚀 Server start messages
- 📧 Email processing logs
- ❌ Error messages
- ✅ Success confirmations
Common Issues
-
Port Already in Use
- Tests use unique ports
- Check for orphaned processes:
lsof -i :2525 - Kill process:
kill -9 <PID>
-
TLS Certificate Errors
- Tests use self-signed certificates
- Production should use real certificates
-
Timeout Errors
- Increase timeout in test configuration
- Check network connectivity
- Verify server started successfully
-
Authentication Failures
- Test servers may not validate credentials
- Check authRequired configuration
- Verify AUTH mechanisms supported