update
This commit is contained in:
@ -110,7 +110,7 @@ export async function startTestServer(config: ITestServerConfig): Promise<ITestS
|
||||
const smtpServer = await createSmtpServer(mockEmailServer, smtpOptions);
|
||||
|
||||
// Start the server
|
||||
await smtpServer.start();
|
||||
await smtpServer.listen();
|
||||
|
||||
// Wait for server to be ready
|
||||
await waitForServerReady(serverConfig.hostname, serverConfig.port);
|
||||
@ -140,12 +140,8 @@ export async function stopTestServer(testServer: ITestServer): Promise<void> {
|
||||
console.log(`🛑 Stopping test SMTP server on ${testServer.hostname}:${testServer.port}`);
|
||||
|
||||
// Stop the SMTP server
|
||||
if (testServer.smtpServer.stop && typeof testServer.smtpServer.stop === 'function') {
|
||||
await testServer.smtpServer.stop();
|
||||
} else if (testServer.smtpServer.close && typeof testServer.smtpServer.close === 'function') {
|
||||
await new Promise<void>((resolve) => {
|
||||
testServer.smtpServer.close(() => resolve());
|
||||
});
|
||||
if (testServer.smtpServer.close && typeof testServer.smtpServer.close === 'function') {
|
||||
await testServer.smtpServer.close();
|
||||
}
|
||||
|
||||
// Wait for port to be free
|
||||
|
@ -30,7 +30,7 @@ test/
|
||||
├── readme.md # This file
|
||||
├── helpers/
|
||||
│ ├── server.loader.ts # SMTP server lifecycle management
|
||||
│ ├── test.utils.ts # Common test utilities
|
||||
│ ├── utils.ts # Common test utilities
|
||||
│ └── smtp.client.ts # Test SMTP client utilities
|
||||
└── suite/
|
||||
├── connection/ # Connection management tests (CM)
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
const TEST_TIMEOUT = 30000;
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
const TEST_TIMEOUT = 15000;
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
const TEST_TIMEOUT = 10000;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import * as path from 'path';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
// Test configuration
|
||||
const TEST_PORT = 2525;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import * as path from 'path';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
// Test configuration
|
||||
const TEST_PORT = 2525;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import * as path from 'path';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
// Test configuration
|
||||
const TEST_PORT = 2525;
|
||||
@ -192,7 +192,7 @@ tap.test('HELP - should return properly formatted help text', async (tools) => {
|
||||
// Multi-line help should use 214- prefix
|
||||
if (helpLines.length > 1) {
|
||||
const hasMultilineFormat = helpLines.some(l => l.startsWith('214-'));
|
||||
expect(hasMultilineFormat).toBeTrue();
|
||||
expect(hasMultilineFormat).toEqual(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
const TEST_TIMEOUT = 10000;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
const TEST_TIMEOUT = 10000;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import * as path from 'path';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
// Test configuration
|
||||
const TEST_PORT = 2525;
|
||||
@ -356,7 +356,7 @@ tap.test('QUIT - verify clean connection shutdown', async (tools) => {
|
||||
socket.on('close', () => {
|
||||
closeEventFired = true;
|
||||
if (currentStep === 'quit') {
|
||||
expect(endEventFired || closeEventFired).toBeTrue();
|
||||
expect(endEventFired || closeEventFired).toEqual(true);
|
||||
done.resolve();
|
||||
}
|
||||
});
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
const TEST_TIMEOUT = 10000;
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
// Test configuration
|
||||
const TEST_PORT = 2525;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import * as path from 'path';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
// Test configuration
|
||||
const TEST_PORT = 2525;
|
||||
@ -49,7 +49,7 @@ tap.test('SIZE Extension - should advertise SIZE in EHLO response', async (tools
|
||||
socket.write('QUIT\r\n');
|
||||
setTimeout(() => {
|
||||
socket.destroy();
|
||||
expect(sizeSupported).toBeTrue();
|
||||
expect(sizeSupported).toEqual(true);
|
||||
if (maxMessageSize !== null) {
|
||||
expect(maxMessageSize).toBeGreaterThan(0);
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import * as path from 'path';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
// Test configuration
|
||||
const TEST_PORT = 2525;
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
@ -71,7 +71,7 @@ tap.test('Abrupt Disconnection - should handle socket destruction without QUIT',
|
||||
setTimeout(() => resolve(false), 5000);
|
||||
});
|
||||
|
||||
expect(recoveryConnected).toBeTrue();
|
||||
expect(recoveryConnected).toEqual(true);
|
||||
|
||||
if (recoveryConnected) {
|
||||
// Get banner from recovery connection
|
||||
@ -143,7 +143,7 @@ tap.test('Abrupt Disconnection - should handle multiple simultaneous abrupt disc
|
||||
setTimeout(() => resolve(false), 5000);
|
||||
});
|
||||
|
||||
expect(stillAccepting).toBeTrue();
|
||||
expect(stillAccepting).toEqual(true);
|
||||
|
||||
if (stillAccepting) {
|
||||
const banner = await new Promise<string>((resolve) => {
|
||||
@ -240,7 +240,7 @@ tap.test('Abrupt Disconnection - should handle disconnection during DATA transfe
|
||||
setTimeout(() => resolve(false), 5000);
|
||||
});
|
||||
|
||||
expect(canConnect).toBeTrue();
|
||||
expect(canConnect).toEqual(true);
|
||||
|
||||
if (canConnect) {
|
||||
const banner = await new Promise<string>((resolve) => {
|
||||
@ -307,7 +307,7 @@ tap.test('Abrupt Disconnection - should timeout idle connections', async (tools)
|
||||
}
|
||||
|
||||
// Either behavior is acceptable
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
} finally {
|
||||
done.resolve();
|
||||
@ -316,7 +316,7 @@ tap.test('Abrupt Disconnection - should timeout idle connections', async (tools)
|
||||
|
||||
tap.test('cleanup - stop SMTP server', async () => {
|
||||
await stopTestServer();
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
|
||||
tap.start();
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
// Test configuration
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
@ -62,7 +62,7 @@ tap.test('Connection Rejection - should handle suspicious domains', async (tools
|
||||
// We just verify it responds appropriately
|
||||
const validResponses = ['250', '421', '550', '501'];
|
||||
const hasValidResponse = validResponses.some(code => response.includes(code));
|
||||
expect(hasValidResponse).toBeTrue();
|
||||
expect(hasValidResponse).toEqual(true);
|
||||
|
||||
// Clean up
|
||||
if (!socket.destroyed) {
|
||||
@ -151,7 +151,7 @@ tap.test('Connection Rejection - should handle overload conditions', async (tool
|
||||
|
||||
// Either behavior is acceptable - rejection shows overload protection,
|
||||
// acceptance shows high capacity
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
} finally {
|
||||
// Clean up all connections
|
||||
@ -225,7 +225,7 @@ tap.test('Connection Rejection - should reject invalid protocol', async (tools)
|
||||
const hasErrorResponse = errorResponses.some(code => response.includes(code));
|
||||
const closedWithoutResponse = response === 'CLOSED_WITHOUT_RESPONSE' || response === '';
|
||||
|
||||
expect(hasErrorResponse || closedWithoutResponse).toBeTrue();
|
||||
expect(hasErrorResponse || closedWithoutResponse).toEqual(true);
|
||||
|
||||
if (hasErrorResponse) {
|
||||
console.log('Server properly rejected with error response');
|
||||
@ -291,7 +291,7 @@ tap.test('Connection Rejection - should handle invalid commands gracefully', asy
|
||||
|
||||
tap.test('cleanup - stop SMTP server', async () => {
|
||||
await stopTestServer();
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
|
||||
tap.start();
|
@ -109,7 +109,7 @@ tap.test('CM-03: Active connection should not timeout', async () => {
|
||||
}
|
||||
|
||||
// Connection should still be active
|
||||
expect(isConnected).toBeTrue();
|
||||
expect(isConnected).toEqual(true);
|
||||
|
||||
// Close connection gracefully
|
||||
socket.write('QUIT\r\n');
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
const TEST_TIMEOUT = 60000; // Longer timeout for keepalive tests
|
||||
@ -211,7 +211,7 @@ tap.test('Keepalive - should detect connection loss', async (tools) => {
|
||||
await new Promise(resolve => setTimeout(resolve, 10000));
|
||||
|
||||
// Connection should be detected as lost
|
||||
expect(connectionLost).toBeTrue();
|
||||
expect(connectionLost).toEqual(true);
|
||||
console.log('Keepalive detected connection loss');
|
||||
|
||||
} finally {
|
||||
|
@ -1,13 +1,15 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
import { createConcurrentConnections, performSmtpHandshake, closeSmtpConnection } from '../../helpers/test.utils.js';
|
||||
import { createConcurrentConnections, performSmtpHandshake, closeSmtpConnection } from '../../helpers/utils.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
const CONCURRENT_COUNT = 10;
|
||||
|
||||
tap.test('setup - start SMTP server', async () => {
|
||||
testServer = await startTestServer();
|
||||
testServer = await startTestServer({
|
||||
port: 2526
|
||||
});
|
||||
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
expect(testServer.port).toEqual(2526);
|
||||
@ -101,7 +103,7 @@ tap.test('CM-02: Connection limit enforcement - verify max connections', async (
|
||||
});
|
||||
|
||||
tap.test('cleanup - stop SMTP server', async () => {
|
||||
await stopTestServer();
|
||||
await stopTestServer(testServer);
|
||||
console.log('✅ Test server stopped');
|
||||
});
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
const TEST_TIMEOUT = 30000;
|
||||
@ -25,7 +25,7 @@ tap.test('Plain Connection - should establish basic TCP connection', async (tool
|
||||
setTimeout(() => resolve(false), 5000);
|
||||
});
|
||||
|
||||
expect(connected).toBeTrue();
|
||||
expect(connected).toEqual(true);
|
||||
|
||||
if (connected) {
|
||||
console.log('Plain connection established:');
|
||||
@ -279,7 +279,7 @@ tap.test('Plain Connection - should work on standard SMTP port 25', async (tools
|
||||
}
|
||||
|
||||
// Test passes regardless - port 25 connectivity is environment-dependent
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
done.resolve();
|
||||
});
|
||||
|
@ -2,7 +2,7 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import * as tls from 'tls';
|
||||
import * as path from 'path';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
// Test configuration
|
||||
const TEST_PORT = 2525;
|
||||
@ -12,7 +12,10 @@ let testServer: SmtpServer;
|
||||
|
||||
// Setup
|
||||
tap.test('setup - start SMTP server with STARTTLS support', async () => {
|
||||
testServer = await startTestServer();
|
||||
testServer = await startTestServer({
|
||||
port: TEST_PORT,
|
||||
tlsEnabled: true // Enable TLS to advertise STARTTLS
|
||||
});
|
||||
|
||||
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
@ -73,7 +76,7 @@ tap.test('STARTTLS - should upgrade plain connection to TLS', async (tools) => {
|
||||
tlsSocket!.write('QUIT\r\n');
|
||||
setTimeout(() => {
|
||||
tlsSocket!.destroy();
|
||||
expect(tlsSocket!.encrypted).toBeTrue();
|
||||
expect(tlsSocket!.encrypted).toEqual(true);
|
||||
done.resolve();
|
||||
}, 100);
|
||||
}
|
||||
@ -441,7 +444,7 @@ tap.test('STARTTLS - should use secure TLS version and ciphers', async (tools) =
|
||||
// Teardown
|
||||
tap.test('teardown - stop SMTP server', async () => {
|
||||
if (testServer) {
|
||||
await stopTestServer();
|
||||
await stopTestServer(testServer);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import * as tls from 'tls';
|
||||
import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
const TEST_PORT_TLS = 30466;
|
||||
@ -61,7 +61,7 @@ tap.test('TLS Ciphers - should advertise STARTTLS for cipher negotiation', async
|
||||
socket.end();
|
||||
|
||||
// Either behavior is acceptable
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
} finally {
|
||||
await stopTestServer();
|
||||
@ -106,7 +106,7 @@ tap.test('TLS Ciphers - should negotiate secure cipher suites', async (tools) =>
|
||||
console.log('Cipher security analysis:', cipherSecurity);
|
||||
|
||||
expect(cipher.name).toBeDefined();
|
||||
expect(cipherSecurity.secure).toBeTrue();
|
||||
expect(cipherSecurity.secure).toEqual(true);
|
||||
|
||||
// Send SMTP command to verify encrypted communication
|
||||
const banner = await new Promise<string>((resolve) => {
|
||||
@ -187,7 +187,7 @@ tap.test('TLS Ciphers - should reject weak cipher suites', async (tools) => {
|
||||
}
|
||||
|
||||
// Either behavior is logged - some servers may support legacy ciphers
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
} finally {
|
||||
await stopTestServer();
|
||||
@ -249,7 +249,7 @@ tap.test('TLS Ciphers - should support forward secrecy', async (tools) => {
|
||||
socket.end();
|
||||
|
||||
// Forward secrecy is recommended but not required
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
} finally {
|
||||
await stopTestServer();
|
||||
|
@ -1,12 +1,15 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
import { connectToSmtp, performSmtpHandshake, closeSmtpConnection } from '../../helpers/test.utils.js';
|
||||
import { connectToSmtp, performSmtpHandshake, closeSmtpConnection } from '../../helpers/utils.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
|
||||
tap.test('setup - start SMTP server with TLS support', async () => {
|
||||
testServer = await startTestServer();
|
||||
testServer = await startTestServer({
|
||||
port: 2525,
|
||||
tlsEnabled: true // Enable TLS support
|
||||
});
|
||||
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
expect(testServer.port).toEqual(2525);
|
||||
@ -26,7 +29,7 @@ tap.test('CM-01: TLS Connection Test - server should advertise STARTTLS capabili
|
||||
|
||||
// Check for STARTTLS support
|
||||
const supportsStarttls = capabilities.some(cap => cap.toUpperCase().includes('STARTTLS'));
|
||||
expect(supportsStarttls).toBeTrue();
|
||||
expect(supportsStarttls).toEqual(true);
|
||||
|
||||
// Close connection gracefully
|
||||
await closeSmtpConnection(socket);
|
||||
@ -44,7 +47,7 @@ tap.test('CM-01: TLS Connection Test - server should advertise STARTTLS capabili
|
||||
|
||||
tap.test('CM-01: TLS Connection Test - verify TLS certificate configuration', async () => {
|
||||
// This test verifies that the server has TLS certificates configured
|
||||
expect(testServer.config.tlsEnabled).toBeTrue();
|
||||
expect(testServer.config.tlsEnabled).toEqual(true);
|
||||
|
||||
// The server should have loaded certificates during startup
|
||||
// In production, this would validate actual certificate properties
|
||||
@ -52,7 +55,7 @@ tap.test('CM-01: TLS Connection Test - verify TLS certificate configuration', as
|
||||
});
|
||||
|
||||
tap.test('cleanup - stop SMTP server', async () => {
|
||||
await stopTestServer();
|
||||
await stopTestServer(testServer);
|
||||
console.log('✅ Test server stopped');
|
||||
});
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import * as tls from 'tls';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
const TEST_PORT = 2525;
|
||||
const TEST_PORT_TLS = 30465;
|
||||
@ -82,7 +82,7 @@ tap.test('TLS Versions - should support STARTTLS capability', async (tools) => {
|
||||
socket.end();
|
||||
|
||||
// STARTTLS is optional but common
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
} finally {
|
||||
done.resolve();
|
||||
@ -105,7 +105,7 @@ tap.test('TLS Versions - should support modern TLS versions on secure port', asy
|
||||
|
||||
// At least one modern version should be supported
|
||||
const supportsModernTls = tls12Result.success || tls13Result.success;
|
||||
expect(supportsModernTls).toBeTrue();
|
||||
expect(supportsModernTls).toEqual(true);
|
||||
|
||||
if (tls12Result.success) {
|
||||
console.log('TLS 1.2 supported with cipher:', tls12Result.cipher);
|
||||
@ -137,7 +137,7 @@ tap.test('TLS Versions - should reject obsolete TLS versions', async (tools) =>
|
||||
console.log(`TLS 1.1 ${tls11Result.success ? 'accepted (legacy support)' : 'rejected (good)'}`);
|
||||
|
||||
// Either behavior is acceptable - log the results
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
} finally {
|
||||
done.resolve();
|
||||
@ -261,7 +261,7 @@ async function testTlsVersion(version: string, port: number): Promise<{success:
|
||||
tap.test('cleanup - stop SMTP servers', async () => {
|
||||
await stopTestServer();
|
||||
await stopTestServer(testServerTls);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
|
||||
tap.start();
|
||||
|
@ -66,7 +66,7 @@ tap.test('Empty Commands - should reject empty line (just CRLF)', async (tools)
|
||||
} else {
|
||||
// Server might ignore empty lines
|
||||
console.log('Server ignored empty line');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
}
|
||||
|
||||
// Test server is still responsive
|
||||
@ -425,7 +425,7 @@ tap.test('Empty Commands - server should remain stable after empty commands', as
|
||||
|
||||
tap.test('cleanup - stop SMTP server', async () => {
|
||||
await stopTestServer(testServer);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
|
||||
tap.start();
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
|
@ -93,7 +93,7 @@ tap.test('Extremely Long Lines - should handle lines exceeding RFC 5321 limit',
|
||||
const accepted = finalResponse.includes('250');
|
||||
const rejected = finalResponse.includes('552') || finalResponse.includes('500') || finalResponse.includes('554');
|
||||
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
if (accepted) {
|
||||
console.log('Server accepted long line (may wrap internally)');
|
||||
@ -419,7 +419,7 @@ tap.test('Extremely Long Lines - should handle line exactly at RFC limit', async
|
||||
|
||||
tap.test('cleanup - stop SMTP server', async () => {
|
||||
await stopTestServer(testServer);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
|
||||
tap.start();
|
@ -99,7 +99,7 @@ tap.test('Invalid Character Handling - should handle control characters in email
|
||||
const accepted = finalResponse.includes('250');
|
||||
const rejected = finalResponse.includes('550') || finalResponse.includes('554');
|
||||
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
if (rejected) {
|
||||
console.log('Server rejected control characters (strict security)');
|
||||
@ -376,7 +376,7 @@ tap.test('Invalid Character Handling - should handle bare LF and CR', async (too
|
||||
console.log('Server rejected bare LF/CR (strict SMTP compliance)');
|
||||
}
|
||||
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
// Clean up
|
||||
socket.write('QUIT\r\n');
|
||||
@ -473,7 +473,7 @@ tap.test('Invalid Character Handling - should handle long lines without proper f
|
||||
|
||||
tap.test('cleanup - stop SMTP server', async () => {
|
||||
await stopTestServer(testServer);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
|
||||
tap.start();
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
|
||||
import { connectToSmtp, waitForGreeting, sendSmtpCommand, closeSmtpConnection, generateRandomEmail } from '../../helpers/test.utils.js';
|
||||
import { connectToSmtp, waitForGreeting, sendSmtpCommand, closeSmtpConnection, generateRandomEmail } from '../../helpers/utils.js';
|
||||
|
||||
let testServer: ITestServer;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
@ -157,7 +157,7 @@ tap.test('Attachment Handling - Multiple file types', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with multiple attachments accepted successfully');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -253,7 +253,7 @@ tap.test('Attachment Handling - Large attachment', async (tools) => {
|
||||
const rejected = dataBuffer.includes('552'); // Size exceeded
|
||||
|
||||
console.log(`Large attachment: ${accepted ? 'accepted' : 'rejected (size limit)'}`);
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -361,7 +361,7 @@ tap.test('Attachment Handling - Inline vs attachment disposition', async (tools)
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with inline and attachment dispositions accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -472,7 +472,7 @@ tap.test('Attachment Handling - Filename encoding', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with various filename encodings accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -577,7 +577,7 @@ tap.test('Attachment Handling - Empty and malformed attachments', async (tools)
|
||||
completed = true;
|
||||
const result = dataBuffer.includes('250') ? 'accepted' : 'rejected';
|
||||
console.log(`Email with malformed attachments ${result}`);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
// Test configuration
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
@ -141,7 +141,7 @@ tap.test('DSN - Success notification request', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with DSN success request accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -228,7 +228,7 @@ tap.test('DSN - Multiple notification types', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with multiple DSN types accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -280,7 +280,7 @@ tap.test('DSN - Never notify', async (tools) => {
|
||||
const notSupported = dataBuffer.includes('501') || dataBuffer.includes('555');
|
||||
|
||||
console.log(`NOTIFY=NEVER: ${accepted ? 'accepted' : notSupported ? 'not supported' : 'error'}`);
|
||||
expect(accepted || notSupported).toBeTrue();
|
||||
expect(accepted || notSupported).toEqual(true);
|
||||
|
||||
if (notSupported) {
|
||||
socket.write('RCPT TO:<recipient@example.com>\r\n');
|
||||
@ -315,7 +315,7 @@ tap.test('DSN - Never notify', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with NOTIFY=NEVER accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -401,7 +401,7 @@ tap.test('DSN - Original recipient tracking', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with ORCPT tracking accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -464,7 +464,7 @@ tap.test('DSN - Return parameter handling', async (tools) => {
|
||||
const notSupported = dataBuffer.includes('501') || dataBuffer.includes('555');
|
||||
|
||||
console.log(`RET=FULL: ${accepted ? 'accepted' : notSupported ? 'not supported' : 'error'}`);
|
||||
expect(accepted || notSupported).toBeTrue();
|
||||
expect(accepted || notSupported).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
@ -79,7 +79,7 @@ tap.test('Email Routing - Local domain routing', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Local domain email routed successfully');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -162,7 +162,7 @@ tap.test('Email Routing - External domain routing', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('External domain email accepted for relay');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -246,7 +246,7 @@ tap.test('Email Routing - Multiple recipients', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with multiple recipients routed successfully');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -504,7 +504,7 @@ tap.test('Email Routing - Subdomain routing', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Subdomain routing test completed');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
// Test configuration
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import * as path from 'path';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
// Test configuration
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -130,7 +130,7 @@ tap.test('MIME Handling - Comprehensive multipart message', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Complex MIME message accepted successfully');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -207,7 +207,7 @@ tap.test('MIME Handling - Quoted-printable encoding', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Quoted-printable encoded email accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -296,7 +296,7 @@ tap.test('MIME Handling - Base64 encoding', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Base64 encoded email accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -396,7 +396,7 @@ tap.test('MIME Handling - Content-Disposition headers', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with various Content-Disposition headers accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -490,7 +490,7 @@ tap.test('MIME Handling - International character sets', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with international character sets accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import * as path from 'path';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
// Test configuration
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
|
||||
let testServer: any;
|
||||
|
||||
@ -107,7 +107,7 @@ tap.test('Special Character Handling - Comprehensive Unicode test', async (tools
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with special characters accepted successfully');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -195,7 +195,7 @@ tap.test('Special Character Handling - Control characters', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with control characters accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -266,7 +266,7 @@ tap.test('Special Character Handling - Subject header encoding', async (tools) =
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with encoded subject headers accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -338,7 +338,7 @@ tap.test('Special Character Handling - Address headers with special chars', asyn
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with special characters in addresses accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -435,7 +435,7 @@ tap.test('Special Character Handling - Mixed encodings', async (tools) => {
|
||||
if (!completed) {
|
||||
completed = true;
|
||||
console.log('Email with mixed character encodings accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
@ -299,7 +299,7 @@ tap.test('ERR-08: Error logging - Data transmission errors', async (tools) => {
|
||||
(finalResponse.includes('250') ||
|
||||
finalResponse.includes('5'));
|
||||
|
||||
expect(hasResponse).toBeTrue();
|
||||
expect(hasResponse).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
@ -120,7 +120,7 @@ tap.test('ERR-07: Exception handling - Invalid commands', async (tools) => {
|
||||
console.log('Server still responding:', serverStillResponding);
|
||||
|
||||
// Test passes if exceptions were handled OR server is still responding
|
||||
expect(exceptionHandled || serverStillResponding).toBeTrue();
|
||||
expect(exceptionHandled || serverStillResponding).toEqual(true);
|
||||
|
||||
if (socket.writable) {
|
||||
socket.write('QUIT\r\n');
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
@ -116,7 +116,7 @@ tap.test('ERR-06: Malformed MIME handling - Invalid boundary', async (tools) =>
|
||||
response.includes('malformed');
|
||||
|
||||
console.log('Malformed MIME response:', response.substring(0, 100));
|
||||
expect(validResponse).toBeTrue();
|
||||
expect(validResponse).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -228,7 +228,7 @@ tap.test('ERR-06: Malformed MIME handling - Missing headers', async (tools) => {
|
||||
response.includes('451');
|
||||
|
||||
console.log('Missing headers response:', response.substring(0, 100));
|
||||
expect(validResponse).toBeTrue();
|
||||
expect(validResponse).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -349,7 +349,7 @@ tap.test('ERR-06: Malformed MIME handling - Nested multipart errors', async (too
|
||||
response.includes('451');
|
||||
|
||||
console.log('Nested multipart response:', response.substring(0, 100));
|
||||
expect(validResponse).toBeTrue();
|
||||
expect(validResponse).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -73,7 +73,7 @@ tap.test('Permanent Failures - should return 5xx for invalid recipient syntax',
|
||||
const permanentFailureCodes = ['550', '551', '552', '553', '554', '501'];
|
||||
const isPermanentFailure = permanentFailureCodes.some(code => rcptResponse.includes(code));
|
||||
|
||||
expect(isPermanentFailure).toBeTrue();
|
||||
expect(isPermanentFailure).toEqual(true);
|
||||
|
||||
// Clean up
|
||||
socket.write('QUIT\r\n');
|
||||
@ -142,7 +142,7 @@ tap.test('Permanent Failures - should handle non-existent domain', async (tools)
|
||||
// 2. Reject with permanent failure (5xx)
|
||||
// Both are valid approaches
|
||||
const acceptedOrRejected = rcptResponse.includes('250') || /^5\d{2}/.test(rcptResponse);
|
||||
expect(acceptedOrRejected).toBeTrue();
|
||||
expect(acceptedOrRejected).toEqual(true);
|
||||
|
||||
if (rcptResponse.includes('250')) {
|
||||
console.log('Server accepts unknown domains (will handle bounces later)');
|
||||
@ -297,7 +297,7 @@ tap.test('Permanent Failures - should persist after RSET', async (tools) => {
|
||||
console.log('Permanent failures persist correctly after RSET');
|
||||
} else {
|
||||
console.log('Server accepts invalid syntax in MAIL FROM (lenient parsing)');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
}
|
||||
|
||||
// Clean up
|
||||
@ -311,7 +311,7 @@ tap.test('Permanent Failures - should persist after RSET', async (tools) => {
|
||||
|
||||
tap.test('cleanup - stop SMTP server', async () => {
|
||||
await stopTestServer(testServer);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
|
||||
tap.start();
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
@ -120,7 +120,7 @@ tap.test('ERR-05: Resource exhaustion handling - Connection limit', async (tools
|
||||
console.log(`Exhaustion detected: ${exhaustionDetected}`);
|
||||
if (lastError) console.log(`Last error: ${lastError}`);
|
||||
|
||||
expect(hasResourceProtection).toBeTrue();
|
||||
expect(hasResourceProtection).toEqual(true);
|
||||
done.resolve();
|
||||
} catch (error) {
|
||||
console.error('Test error:', error);
|
||||
@ -236,12 +236,12 @@ tap.test('ERR-05: Resource exhaustion handling - Memory limits', async (tools) =
|
||||
}
|
||||
|
||||
// Resource protection is working if we got an error or protective response
|
||||
expect(resourceError || endResponse.includes('552') || endResponse.includes('451')).toBeTrue();
|
||||
expect(resourceError || endResponse.includes('552') || endResponse.includes('451')).toEqual(true);
|
||||
|
||||
} catch (err) {
|
||||
// Errors during large data transmission indicate resource protection
|
||||
console.log('Expected resource protection error:', err);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
}
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
|
@ -135,7 +135,7 @@ tap.test('Temporary Failures - should allow retry after temporary failure', asyn
|
||||
const attempt2 = await attemptConnection(2);
|
||||
|
||||
// At least one attempt should work
|
||||
expect(attempt1.success || attempt2.success).toBeTrue();
|
||||
expect(attempt1.success || attempt2.success).toEqual(true);
|
||||
|
||||
done.resolve();
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
|
||||
import { createTestSmtpClient, sendConcurrentEmails, measureClientThroughput } from '../../helpers/smtp.client.js';
|
||||
import { connectToSmtp, sendSmtpCommand, waitForGreeting, createMimeMessage } from '../../helpers/test.utils.js';
|
||||
import { connectToSmtp, sendSmtpCommand, waitForGreeting, createMimeMessage } from '../../helpers/utils.js';
|
||||
|
||||
let testServer: ITestServer;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
@ -73,7 +73,7 @@ tap.test('REL-05: DNS resolution failure handling - Non-existent domains', async
|
||||
const mailFromHandled = mailResponse.includes('250') ||
|
||||
mailResponse.includes('450') ||
|
||||
mailResponse.includes('550');
|
||||
expect(mailFromHandled).toBeTrue();
|
||||
expect(mailFromHandled).toEqual(true);
|
||||
|
||||
// Reset if needed
|
||||
if (mailResponse.includes('250')) {
|
||||
@ -108,7 +108,7 @@ tap.test('REL-05: DNS resolution failure handling - Non-existent domains', async
|
||||
const rcptToHandled = rcptResponse.includes('450') || // Temporary failure
|
||||
rcptResponse.includes('550') || // Permanent failure
|
||||
rcptResponse.includes('553'); // Address error
|
||||
expect(rcptToHandled).toBeTrue();
|
||||
expect(rcptToHandled).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -182,7 +182,7 @@ tap.test('REL-05: DNS resolution failure handling - Malformed domains', async (t
|
||||
response.includes('553'); // Address error
|
||||
|
||||
console.log(` Response: ${response.trim().substring(0, 50)}`);
|
||||
expect(properlyHandled).toBeTrue();
|
||||
expect(properlyHandled).toEqual(true);
|
||||
|
||||
// Reset if needed
|
||||
if (!response.includes('5')) {
|
||||
@ -266,7 +266,7 @@ tap.test('REL-05: DNS resolution failure handling - Special cases', async (tools
|
||||
|
||||
console.log(' IP address response:', ipResponse.trim());
|
||||
const ipHandled = ipResponse.includes('250') || ipResponse.includes('501');
|
||||
expect(ipHandled).toBeTrue();
|
||||
expect(ipHandled).toEqual(true);
|
||||
|
||||
socket.write('RSET\r\n');
|
||||
await new Promise<void>((resolve) => {
|
||||
@ -368,7 +368,7 @@ tap.test('REL-05: DNS resolution failure handling - Mixed valid/invalid recipien
|
||||
const invalidHandled = invalidRcptResponse.includes('450') ||
|
||||
invalidRcptResponse.includes('550') ||
|
||||
invalidRcptResponse.includes('553');
|
||||
expect(invalidHandled).toBeTrue();
|
||||
expect(invalidHandled).toEqual(true);
|
||||
|
||||
// Try to send data (should work if at least one valid recipient)
|
||||
socket.write('DATA\r\n');
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
@ -119,7 +119,7 @@ tap.test('REL-04: Error recovery - Invalid command recovery', async (tools) => {
|
||||
const socket2 = await createConnection();
|
||||
const recoverySuccess = await testBasicSmtpFlow(socket2);
|
||||
|
||||
expect(recoverySuccess).toBeTrue();
|
||||
expect(recoverySuccess).toEqual(true);
|
||||
console.log('✓ Server recovered from invalid commands');
|
||||
done.resolve();
|
||||
} catch (error) {
|
||||
@ -173,7 +173,7 @@ tap.test('REL-04: Error recovery - Malformed data recovery', async (tools) => {
|
||||
const socket2 = await createConnection();
|
||||
const recoverySuccess = await testBasicSmtpFlow(socket2);
|
||||
|
||||
expect(recoverySuccess).toBeTrue();
|
||||
expect(recoverySuccess).toEqual(true);
|
||||
console.log('✓ Server recovered from malformed data');
|
||||
done.resolve();
|
||||
} catch (error) {
|
||||
@ -221,7 +221,7 @@ tap.test('REL-04: Error recovery - Premature disconnection recovery', async (too
|
||||
const socket2 = await createConnection();
|
||||
const recoverySuccess = await testBasicSmtpFlow(socket2);
|
||||
|
||||
expect(recoverySuccess).toBeTrue();
|
||||
expect(recoverySuccess).toEqual(true);
|
||||
console.log('✓ Server recovered from premature disconnections');
|
||||
done.resolve();
|
||||
} catch (error) {
|
||||
@ -283,7 +283,7 @@ tap.test('REL-04: Error recovery - Data corruption recovery', async (tools) => {
|
||||
const socket2 = await createConnection();
|
||||
const recoverySuccess = await testBasicSmtpFlow(socket2);
|
||||
|
||||
expect(recoverySuccess).toBeTrue();
|
||||
expect(recoverySuccess).toEqual(true);
|
||||
console.log('✓ Server recovered from data corruption');
|
||||
done.resolve();
|
||||
} catch (error) {
|
||||
@ -335,7 +335,7 @@ tap.test('REL-04: Error recovery - Connection flooding recovery', async (tools)
|
||||
const socket2 = await createConnection();
|
||||
const recoverySuccess = await testBasicSmtpFlow(socket2);
|
||||
|
||||
expect(recoverySuccess).toBeTrue();
|
||||
expect(recoverySuccess).toEqual(true);
|
||||
console.log('✓ Server recovered from connection flooding');
|
||||
done.resolve();
|
||||
} catch (error) {
|
||||
@ -392,7 +392,7 @@ tap.test('REL-04: Error recovery - Mixed error scenario', async (tools) => {
|
||||
const socket = await createConnection();
|
||||
const recoverySuccess = await testBasicSmtpFlow(socket);
|
||||
|
||||
expect(recoverySuccess).toBeTrue();
|
||||
expect(recoverySuccess).toEqual(true);
|
||||
console.log('✓ Server recovered from mixed error scenarios');
|
||||
done.resolve();
|
||||
} catch (error) {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
@ -121,7 +121,7 @@ tap.test('REL-06: Network interruption - Sudden connection drop', async (tools)
|
||||
const socket2 = await createConnection();
|
||||
const recoverySuccess = await testBasicSmtpFlow(socket2);
|
||||
|
||||
expect(recoverySuccess).toBeTrue();
|
||||
expect(recoverySuccess).toEqual(true);
|
||||
console.log('✓ Server recovered from sudden connection drop');
|
||||
done.resolve();
|
||||
} catch (error) {
|
||||
@ -178,7 +178,7 @@ tap.test('REL-06: Network interruption - Data transfer interruption', async (too
|
||||
const newSocket = await createConnection();
|
||||
const recoverySuccess = await testBasicSmtpFlow(newSocket);
|
||||
|
||||
expect(recoverySuccess).toBeTrue();
|
||||
expect(recoverySuccess).toEqual(true);
|
||||
console.log('✓ Server recovered from data transfer interruption');
|
||||
done.resolve();
|
||||
} catch (error) {
|
||||
@ -271,7 +271,7 @@ tap.test('REL-06: Network interruption - Partial command interruption', async (t
|
||||
const newSocket = await createConnection();
|
||||
const recoverySuccess = await testBasicSmtpFlow(newSocket);
|
||||
|
||||
expect(recoverySuccess).toBeTrue();
|
||||
expect(recoverySuccess).toEqual(true);
|
||||
console.log('✓ Server recovered from partial command interruption');
|
||||
done.resolve();
|
||||
} catch (error) {
|
||||
@ -401,7 +401,7 @@ tap.test('REL-06: Network interruption - Long delay recovery', async (tools) =>
|
||||
const newSocket = await createConnection();
|
||||
const recoverySuccess = await testBasicSmtpFlow(newSocket);
|
||||
|
||||
expect(recoverySuccess).toBeTrue();
|
||||
expect(recoverySuccess).toEqual(true);
|
||||
console.log('✓ Server recovered after long network interruption');
|
||||
done.resolve();
|
||||
} catch (error) {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
@ -236,8 +236,8 @@ tap.test('REL-03: Resource leak detection - Memory leak analysis', async (tools)
|
||||
console.log(`Memory leak detected: ${leakAnalysis.memoryLeakDetected}`);
|
||||
console.log(`Resources stable: ${leakAnalysis.resourcesStable}`);
|
||||
|
||||
expect(leakAnalysis.memoryLeakDetected).toBeFalse();
|
||||
expect(leakAnalysis.resourcesStable).toBeTrue();
|
||||
expect(leakAnalysis.memoryLeakDetected).toEqual(false);
|
||||
expect(leakAnalysis.resourcesStable).toEqual(true);
|
||||
done.resolve();
|
||||
} catch (error) {
|
||||
connections.forEach(conn => conn.destroy());
|
||||
|
@ -1,7 +1,7 @@
|
||||
import * as plugins from '@git.zone/tstest/tapbundle';
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js';
|
||||
|
||||
const TEST_PORT = 2525;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -88,7 +88,7 @@ tap.test('RFC 3461 DSN - MAIL FROM with DSN parameters', async (tools) => {
|
||||
const accepted = dataBuffer.includes('250');
|
||||
const properlyRejected = dataBuffer.includes('501') || dataBuffer.includes('555');
|
||||
|
||||
expect(accepted || properlyRejected).toBeTrue();
|
||||
expect(accepted || properlyRejected).toEqual(true);
|
||||
console.log(`DSN parameters in MAIL FROM ${accepted ? 'accepted' : 'rejected'}`);
|
||||
|
||||
if (accepted) {
|
||||
@ -158,7 +158,7 @@ tap.test('RFC 3461 DSN - RCPT TO with DSN parameters', async (tools) => {
|
||||
const accepted = dataBuffer.includes('250');
|
||||
const properlyRejected = dataBuffer.includes('501') || dataBuffer.includes('555');
|
||||
|
||||
expect(accepted || properlyRejected).toBeTrue();
|
||||
expect(accepted || properlyRejected).toEqual(true);
|
||||
console.log(`DSN parameters in RCPT TO ${accepted ? 'accepted' : 'rejected'}`);
|
||||
|
||||
if (accepted) {
|
||||
@ -319,7 +319,7 @@ tap.test('RFC 3461 DSN - Invalid DSN parameter handling', async (tools) => {
|
||||
|
||||
if (properlyRejected) {
|
||||
console.log('Invalid RET parameter properly rejected');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
} else if (dataBuffer.includes('250')) {
|
||||
// Server ignores unknown parameters (also acceptable)
|
||||
console.log('Server ignores invalid DSN parameters');
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -28,7 +28,7 @@ tap.test('RFC 5321 - Server greeting format', async (tools) => {
|
||||
const greeting = response.trim();
|
||||
const validGreeting = greeting.startsWith('220') && greeting.length > 10;
|
||||
|
||||
expect(validGreeting).toBeTrue();
|
||||
expect(validGreeting).toEqual(true);
|
||||
expect(greeting).toMatch(/^220\s+\S+/); // Should have hostname after 220
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
@ -170,7 +170,7 @@ tap.test('RFC 5321 - Line length limits', async (tools) => {
|
||||
const accepted = dataBuffer.includes('250');
|
||||
const rejected = dataBuffer.includes('501') || dataBuffer.includes('500');
|
||||
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
console.log(`Long line test ${accepted ? 'accepted' : 'rejected'}`);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
@ -244,7 +244,7 @@ tap.test('RFC 5321 - Standard SMTP verb compliance', async (tools) => {
|
||||
);
|
||||
|
||||
console.log('Supported verbs:', supportedVerbs);
|
||||
expect(hasRequired).toBeTrue();
|
||||
expect(hasRequired).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -73,7 +73,7 @@ tap.test('RFC 6376 DKIM - Server accepts email with DKIM signature', async (tool
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
|
||||
console.log('Email with DKIM signature accepted');
|
||||
expect(true).toBeTrue(); // Server accepts DKIM headers
|
||||
expect(true).toEqual(true); // Server accepts DKIM headers
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -74,7 +74,7 @@ tap.test('RFC 7208 SPF - Server handles SPF checks', async (tools) => {
|
||||
result.mailFromResponse !== undefined
|
||||
);
|
||||
|
||||
expect(allDomainsHandled).toBeTrue();
|
||||
expect(allDomainsHandled).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -149,7 +149,7 @@ tap.test('RFC 7208 SPF - SPF record syntax handling', async (tools) => {
|
||||
dataBuffer.includes('550') ||
|
||||
dataBuffer.includes('553');
|
||||
|
||||
expect(handled).toBeTrue();
|
||||
expect(handled).toEqual(true);
|
||||
console.log('SPF handling response:', dataBuffer.trim());
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
@ -263,7 +263,7 @@ tap.test('RFC 7208 SPF - IPv4 and IPv6 mechanism support', async (tools) => {
|
||||
dataBuffer.includes('550') ||
|
||||
dataBuffer.includes('553');
|
||||
|
||||
expect(handled).toBeTrue();
|
||||
expect(handled).toEqual(true);
|
||||
console.log('IP mechanism SPF response:', dataBuffer.trim());
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -75,7 +75,7 @@ tap.test('RFC 7489 DMARC - Server handles DMARC policies', async (tools) => {
|
||||
result.mailFromResponse !== undefined
|
||||
);
|
||||
|
||||
expect(allScenariosHandled).toBeTrue();
|
||||
expect(allScenariosHandled).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -2,7 +2,7 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import * as tls from 'tls';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -36,7 +36,7 @@ tap.test('RFC 8314 TLS - STARTTLS advertised in EHLO', async (tools) => {
|
||||
const advertisesStarttls = dataBuffer.toLowerCase().includes('starttls');
|
||||
|
||||
console.log('STARTTLS advertised:', advertisesStarttls);
|
||||
expect(advertisesStarttls).toBeTrue();
|
||||
expect(advertisesStarttls).toEqual(true);
|
||||
|
||||
// Parse other extensions
|
||||
const lines = dataBuffer.split('\r\n');
|
||||
@ -98,7 +98,7 @@ tap.test('RFC 8314 TLS - STARTTLS command functionality', async (tools) => {
|
||||
|
||||
// In a real test, we would upgrade to TLS here
|
||||
// For this test, we just verify the command is accepted
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.end();
|
||||
done.resolve();
|
||||
@ -144,7 +144,7 @@ tap.test('RFC 8314 TLS - Commands before STARTTLS', async (tools) => {
|
||||
console.log('Server allows MAIL FROM before STARTTLS');
|
||||
} else if (dataBuffer.includes('530') || dataBuffer.includes('554')) {
|
||||
console.log('Server requires STARTTLS before MAIL FROM (RFC 8314 compliant)');
|
||||
expect(true).toBeTrue(); // This is actually good for security
|
||||
expect(true).toEqual(true); // This is actually good for security
|
||||
}
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
|
||||
import { connectToSmtp, waitForGreeting, sendSmtpCommand, closeSmtpConnection } from '../../helpers/test.utils.js';
|
||||
import { connectToSmtp, waitForGreeting, sendSmtpCommand, closeSmtpConnection } from '../../helpers/utils.js';
|
||||
|
||||
let testServer: ITestServer;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -45,7 +45,7 @@ tap.test('Authorization - Valid sender domain', async (tools) => {
|
||||
const accepted = dataBuffer.includes('250');
|
||||
console.log(`Valid sender domain ${accepted ? 'accepted' : 'rejected'}`);
|
||||
|
||||
expect(accepted).toBeTrue();
|
||||
expect(accepted).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -94,7 +94,7 @@ tap.test('Authorization - External sender domain', async (tools) => {
|
||||
} else if (dataBuffer.includes('530')) {
|
||||
// Authentication required
|
||||
console.log('External sender requires authentication');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -102,7 +102,7 @@ tap.test('Authorization - External sender domain', async (tools) => {
|
||||
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
|
||||
// Rejected for policy reasons
|
||||
console.log('External sender rejected by policy');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -115,7 +115,7 @@ tap.test('Authorization - External sender domain', async (tools) => {
|
||||
const rejected = dataBuffer.includes('550') || dataBuffer.includes('553');
|
||||
|
||||
console.log(`External sender: accepted=${accepted}, authRequired=${authRequired}, rejected=${rejected}`);
|
||||
expect(accepted || authRequired || rejected).toBeTrue();
|
||||
expect(accepted || authRequired || rejected).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -165,7 +165,7 @@ tap.test('Authorization - Relay attempt rejection', async (tools) => {
|
||||
} else {
|
||||
// MAIL FROM already rejected
|
||||
console.log('External sender rejected at MAIL FROM');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -179,7 +179,7 @@ tap.test('Authorization - Relay attempt rejection', async (tools) => {
|
||||
dataBuffer.includes('554');
|
||||
|
||||
console.log(`Relay attempt ${rejected ? 'properly rejected' : 'unexpectedly accepted'}`);
|
||||
expect(rejected).toBeTrue();
|
||||
expect(rejected).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -230,7 +230,7 @@ tap.test('Authorization - IP-based restrictions', async (tools) => {
|
||||
const rejected = dataBuffer.includes('550') || dataBuffer.includes('553');
|
||||
|
||||
console.log(`IP-based authorization: ${accepted ? 'accepted' : 'rejected'}`);
|
||||
expect(accepted || rejected).toBeTrue(); // Either is valid based on server config
|
||||
expect(accepted || rejected).toEqual(true); // Either is valid based on server config
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -281,7 +281,7 @@ tap.test('Authorization - Case sensitivity in addresses', async (tools) => {
|
||||
const accepted = dataBuffer.includes('250');
|
||||
console.log(`Mixed case addresses ${accepted ? 'accepted' : 'rejected'}`);
|
||||
|
||||
expect(accepted).toBeTrue();
|
||||
expect(accepted).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -43,7 +43,7 @@ tap.test('Bounce Management - Invalid recipient domain', async (tools) => {
|
||||
} else if (step === 'rcpt') {
|
||||
if (dataBuffer.includes('550') || dataBuffer.includes('551') || dataBuffer.includes('553')) {
|
||||
console.log('Bounce management active - invalid recipient properly rejected');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -73,7 +73,7 @@ tap.test('Bounce Management - Invalid recipient domain', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
|
||||
console.log('Email accepted for processing - bounce will be generated');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -122,7 +122,7 @@ tap.test('Bounce Management - Empty return path (null sender)', async (tools) =>
|
||||
dataBuffer = '';
|
||||
} else {
|
||||
console.log('Null sender rejected');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -153,7 +153,7 @@ tap.test('Bounce Management - Empty return path (null sender)', async (tools) =>
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
|
||||
console.log('Bounce message with null sender accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -222,7 +222,7 @@ tap.test('Bounce Management - DSN headers', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
|
||||
console.log('Email with DSN headers accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -271,7 +271,7 @@ tap.test('Bounce Management - Bounce loop prevention', async (tools) => {
|
||||
} else if (step === 'rcpt') {
|
||||
if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
|
||||
console.log('Bounce loop prevented - mailer-daemon recipient rejected');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -302,7 +302,7 @@ tap.test('Bounce Management - Bounce loop prevention', async (tools) => {
|
||||
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
|
||||
const result = dataBuffer.includes('250') ? 'accepted' : 'rejected';
|
||||
console.log(`Bounce loop test: ${result}`);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -368,7 +368,7 @@ tap.test('Bounce Management - Valid email (control test)', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
|
||||
console.log('Valid email accepted - no bounce expected');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -76,7 +76,7 @@ tap.test('Content Scanning - Suspicious content patterns', async (tools) => {
|
||||
console.log('Content scanning operational - email processed');
|
||||
}
|
||||
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -159,7 +159,7 @@ tap.test('Content Scanning - Malware patterns', async (tools) => {
|
||||
const rejected = dataBuffer.includes('550');
|
||||
|
||||
console.log(`Malware pattern email: ${accepted ? 'accepted' : 'rejected'}`);
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -236,7 +236,7 @@ tap.test('Content Scanning - Spam keywords', async (tools) => {
|
||||
const rejected = dataBuffer.includes('550');
|
||||
|
||||
console.log(`Spam keyword email: ${accepted ? 'accepted' : 'rejected (spam detected)'}`);
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -308,7 +308,7 @@ tap.test('Content Scanning - Clean legitimate email', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
|
||||
console.log('Clean email accepted - content scanning allows legitimate emails');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -392,7 +392,7 @@ tap.test('Content Scanning - Large attachment', async (tools) => {
|
||||
const rejected = dataBuffer.includes('550') || dataBuffer.includes('552');
|
||||
|
||||
console.log(`Large attachment: ${accepted ? 'accepted' : 'rejected (size or content issue)'}`);
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -75,7 +75,7 @@ tap.test('DKIM Processing - Valid DKIM signature', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
|
||||
console.log('Email with valid DKIM signature accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -155,7 +155,7 @@ tap.test('DKIM Processing - Invalid DKIM signature', async (tools) => {
|
||||
const accepted = dataBuffer.includes('250');
|
||||
console.log(`Email with invalid DKIM signature ${accepted ? 'accepted' : 'rejected'}`);
|
||||
// Either response is valid - server may accept and mark as failed, or reject
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -222,7 +222,7 @@ tap.test('DKIM Processing - Missing DKIM signature', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
|
||||
console.log('Email without DKIM signature accepted (neutral)');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -302,7 +302,7 @@ tap.test('DKIM Processing - Multiple DKIM signatures', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
|
||||
console.log('Email with multiple DKIM signatures accepted');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -383,7 +383,7 @@ tap.test('DKIM Processing - Expired DKIM signature', async (tools) => {
|
||||
const accepted = dataBuffer.includes('250');
|
||||
console.log(`Email with expired DKIM signature ${accepted ? 'accepted' : 'rejected'}`);
|
||||
// Either response is valid
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -47,7 +47,7 @@ tap.test('DMARC Policy - Reject policy enforcement', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
|
||||
console.log('DMARC reject policy enforced at MAIL FROM');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -80,7 +80,7 @@ tap.test('DMARC Policy - Reject policy enforcement', async (tools) => {
|
||||
const rejected = dataBuffer.includes('550');
|
||||
|
||||
console.log(`DMARC reject policy: accepted=${accepted}, rejected=${rejected}`);
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -147,7 +147,7 @@ tap.test('DMARC Policy - Quarantine policy', async (tools) => {
|
||||
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
|
||||
const accepted = dataBuffer.includes('250');
|
||||
console.log(`DMARC quarantine policy: ${accepted ? 'accepted (may be quarantined)' : 'rejected'}`);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -213,7 +213,7 @@ tap.test('DMARC Policy - None policy', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('250 ') && dataBuffer.includes('Message accepted')) {
|
||||
console.log('DMARC none policy: email accepted (monitoring only)');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -283,7 +283,7 @@ tap.test('DMARC Policy - Alignment testing', async (tools) => {
|
||||
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
|
||||
const result = dataBuffer.includes('250') ? 'accepted' : 'rejected';
|
||||
console.log(`DMARC alignment test: ${result}`);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -350,7 +350,7 @@ tap.test('DMARC Policy - Percentage testing', async (tools) => {
|
||||
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
|
||||
const result = dataBuffer.includes('250') ? 'accepted' : 'rejected';
|
||||
console.log(`DMARC percentage policy: ${result} (may vary based on percentage)`);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -70,7 +70,7 @@ tap.test('Header Injection Prevention - CRLF injection in headers', async (tools
|
||||
console.log('Header injection prevention active - malicious headers detected');
|
||||
}
|
||||
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -118,7 +118,7 @@ tap.test('Header Injection Prevention - Command injection in MAIL FROM', async (
|
||||
dataBuffer.includes('500');
|
||||
|
||||
console.log('Command injection attempt handled');
|
||||
expect(properResponse).toBeTrue();
|
||||
expect(properResponse).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -191,7 +191,7 @@ tap.test('Header Injection Prevention - HTML/Script injection in body', async (t
|
||||
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
|
||||
const accepted = dataBuffer.includes('250');
|
||||
console.log(`HTML/Script content: ${accepted ? 'accepted (may be sanitized)' : 'rejected'}`);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -239,7 +239,7 @@ tap.test('Header Injection Prevention - Null byte injection', async (tools) => {
|
||||
dataBuffer.includes('550');
|
||||
|
||||
console.log('Null byte injection attempt handled');
|
||||
expect(handled).toBeTrue();
|
||||
expect(handled).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -308,7 +308,7 @@ tap.test('Header Injection Prevention - Unicode and encoding attacks', async (to
|
||||
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
|
||||
const result = dataBuffer.includes('250') ? 'accepted' : 'rejected';
|
||||
console.log(`Unicode/encoding attack: ${result}`);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -35,7 +35,7 @@ tap.test('IP Reputation - Suspicious hostname in EHLO', async (tools) => {
|
||||
const rejected = dataBuffer.includes('550') || dataBuffer.includes('521');
|
||||
|
||||
console.log(`Suspicious hostname: accepted=${accepted}, rejected=${rejected}`);
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
if (rejected) {
|
||||
console.log('IP reputation check working - suspicious host rejected at EHLO');
|
||||
@ -88,7 +88,7 @@ tap.test('IP Reputation - Blacklisted sender domain', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
|
||||
console.log('Blacklisted sender rejected - IP reputation check working');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -99,7 +99,7 @@ tap.test('IP Reputation - Blacklisted sender domain', async (tools) => {
|
||||
const rejected = dataBuffer.includes('550') || dataBuffer.includes('553');
|
||||
|
||||
console.log(`Blacklisted domain at RCPT: accepted=${accepted}, rejected=${rejected}`);
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -146,7 +146,7 @@ tap.test('IP Reputation - Known good sender', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (step === 'rcpt' && dataBuffer.includes('250')) {
|
||||
console.log('Good sender accepted - IP reputation allows legitimate senders');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -198,7 +198,7 @@ tap.test('IP Reputation - Multiple connections from same IP', async (tools) => {
|
||||
completedConnections++;
|
||||
if (completedConnections === totalConnections) {
|
||||
console.log('All connections completed');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
done.resolve();
|
||||
}
|
||||
});
|
||||
@ -264,7 +264,7 @@ tap.test('IP Reputation - Suspicious patterns in email', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('452') || dataBuffer.includes('550')) {
|
||||
console.log('Multiple recipients limited - reputation control active');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -291,7 +291,7 @@ tap.test('IP Reputation - Suspicious patterns in email', async (tools) => {
|
||||
} else if (dataBuffer.includes('250 ') || dataBuffer.includes('550 ')) {
|
||||
const result = dataBuffer.includes('250') ? 'accepted' : 'rejected';
|
||||
console.log(`Suspicious content email ${result}`);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -108,7 +108,7 @@ tap.test('Rate Limiting - should limit rapid consecutive connections', async (to
|
||||
|
||||
// Note: We consider the test passed if rate limiting is either working OR not configured
|
||||
// Many SMTP servers don't have rate limiting, which is also valid
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
} finally {
|
||||
done.resolve();
|
||||
@ -219,11 +219,11 @@ tap.test('Rate Limiting - should allow connections after rate limit period', asy
|
||||
} catch (error) {
|
||||
console.log('Retry connection failed:', error);
|
||||
// Some servers might have longer rate limit periods
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
}
|
||||
} else {
|
||||
console.log('Rate limiting not triggered or not configured');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
}
|
||||
|
||||
} finally {
|
||||
@ -309,7 +309,7 @@ tap.test('Rate Limiting - should limit rapid MAIL FROM commands', async (tools)
|
||||
socket.end();
|
||||
|
||||
// Test passes regardless - rate limiting is optional
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
} finally {
|
||||
done.resolve();
|
||||
@ -318,7 +318,7 @@ tap.test('Rate Limiting - should limit rapid MAIL FROM commands', async (tools)
|
||||
|
||||
tap.test('cleanup - stop SMTP server', async () => {
|
||||
await stopTestServer(testServer);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
});
|
||||
|
||||
tap.start();
|
@ -1,7 +1,7 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -44,7 +44,7 @@ tap.test('SPF Checking - Authorized IP from local domain', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
|
||||
console.log('Local domain sender rejected (SPF fail)');
|
||||
expect(true).toBeTrue(); // Either result shows SPF processing
|
||||
expect(true).toEqual(true); // Either result shows SPF processing
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -52,7 +52,7 @@ tap.test('SPF Checking - Authorized IP from local domain', async (tools) => {
|
||||
}
|
||||
} else if (step === 'rcpt' && dataBuffer.includes('250')) {
|
||||
console.log('Email accepted - SPF likely passed or neutral');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -101,7 +101,7 @@ tap.test('SPF Checking - External domain sender', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
|
||||
console.log('External domain sender rejected (SPF fail)');
|
||||
expect(true).toBeTrue(); // Shows SPF is working
|
||||
expect(true).toEqual(true); // Shows SPF is working
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -112,7 +112,7 @@ tap.test('SPF Checking - External domain sender', async (tools) => {
|
||||
const rejected = dataBuffer.includes('550') || dataBuffer.includes('553');
|
||||
|
||||
console.log(`External domain: accepted=${accepted}, rejected=${rejected}`);
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -161,7 +161,7 @@ tap.test('SPF Checking - Known SPF fail domain', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
|
||||
console.log('SPF fail domain properly rejected');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -170,7 +170,7 @@ tap.test('SPF Checking - Known SPF fail domain', async (tools) => {
|
||||
} else if (step === 'rcpt') {
|
||||
// Either accepted or rejected is valid
|
||||
const response = dataBuffer.includes('250') || dataBuffer.includes('550') || dataBuffer.includes('553');
|
||||
expect(response).toBeTrue();
|
||||
expect(response).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -217,7 +217,7 @@ tap.test('SPF Checking - IPv4 literal in HELO', async (tools) => {
|
||||
const rejected = dataBuffer.includes('550') || dataBuffer.includes('553');
|
||||
|
||||
console.log(`IP literal sender: accepted=${accepted}, rejected=${rejected}`);
|
||||
expect(accepted || rejected).toBeTrue();
|
||||
expect(accepted || rejected).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -266,7 +266,7 @@ tap.test('SPF Checking - Subdomain sender', async (tools) => {
|
||||
dataBuffer = '';
|
||||
} else if (dataBuffer.includes('550') || dataBuffer.includes('553')) {
|
||||
console.log('Subdomain sender rejected');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
@ -275,7 +275,7 @@ tap.test('SPF Checking - Subdomain sender', async (tools) => {
|
||||
} else if (step === 'rcpt') {
|
||||
const accepted = dataBuffer.includes('250');
|
||||
console.log(`Subdomain SPF test: ${accepted ? 'passed' : 'failed'}`);
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
socket.write('QUIT\r\n');
|
||||
socket.end();
|
||||
|
@ -2,7 +2,7 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import * as plugins from '../plugins.js';
|
||||
import * as net from 'net';
|
||||
import * as tls from 'tls';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
|
||||
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../../helpers/server.loader.js';
|
||||
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
|
||||
|
||||
let testServer: SmtpServer;
|
||||
@ -78,7 +78,7 @@ tap.test('TLS Certificate Validation - STARTTLS certificate check', async (tools
|
||||
const isValid = now >= validFrom && now <= validTo;
|
||||
|
||||
console.log('Certificate currently valid:', isValid);
|
||||
expect(true).toBeTrue(); // Certificate present
|
||||
expect(true).toEqual(true); // Certificate present
|
||||
}
|
||||
|
||||
// Test EHLO over TLS
|
||||
@ -91,7 +91,7 @@ tap.test('TLS Certificate Validation - STARTTLS certificate check', async (tools
|
||||
|
||||
if (response.includes('250')) {
|
||||
console.log('EHLO over TLS successful');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
|
||||
tlsSocket.write('QUIT\r\n');
|
||||
tlsSocket.end();
|
||||
@ -133,7 +133,7 @@ tap.test('TLS Certificate Validation - Direct TLS connection', async (tools) =>
|
||||
const cert = socket.getPeerCertificate();
|
||||
if (cert && Object.keys(cert).length > 0) {
|
||||
console.log('Certificate found on direct TLS connection');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
}
|
||||
|
||||
socket.end();
|
||||
@ -143,7 +143,7 @@ tap.test('TLS Certificate Validation - Direct TLS connection', async (tools) =>
|
||||
socket.on('error', (err) => {
|
||||
// Direct TLS might not be supported, try plain connection
|
||||
console.log('Direct TLS not supported, this is expected for STARTTLS servers');
|
||||
expect(true).toBeTrue();
|
||||
expect(true).toEqual(true);
|
||||
done.resolve();
|
||||
});
|
||||
|
||||
@ -205,7 +205,7 @@ tap.test('TLS Certificate Validation - Certificate verification with strict mode
|
||||
console.log('Authorization error:', tlsSocket.authorizationError);
|
||||
}
|
||||
|
||||
expect(true).toBeTrue(); // Connection established
|
||||
expect(true).toEqual(true); // Connection established
|
||||
tlsSocket.write('QUIT\r\n');
|
||||
tlsSocket.end();
|
||||
done.resolve();
|
||||
@ -213,7 +213,7 @@ tap.test('TLS Certificate Validation - Certificate verification with strict mode
|
||||
|
||||
tlsSocket.on('error', (err) => {
|
||||
console.log('Certificate verification error (expected for self-signed):', err.message);
|
||||
expect(true).toBeTrue(); // Error is expected for self-signed certificates
|
||||
expect(true).toEqual(true); // Error is expected for self-signed certificates
|
||||
socket.end();
|
||||
done.resolve();
|
||||
});
|
||||
|
@ -1,214 +0,0 @@
|
||||
/**
|
||||
* Test server loader for SMTP test suite
|
||||
* Provides simplified server lifecycle management for tests
|
||||
*/
|
||||
|
||||
import { DcRouter } from '../../ts/classes.dcrouter.js';
|
||||
import { UnifiedEmailServer } from '../../ts/mail/routing/classes.unified.email.server.js';
|
||||
import { createSmtpServer } from '../../ts/mail/delivery/smtpserver/index.js';
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import * as net from 'net';
|
||||
|
||||
let activeServer = null;
|
||||
let activePort = null;
|
||||
|
||||
/**
|
||||
* Start test server on default port 2525
|
||||
*/
|
||||
async function startTestServer(port = 2525) {
|
||||
if (activeServer) {
|
||||
console.log('Test server already running, stopping it first...');
|
||||
await stopTestServer();
|
||||
}
|
||||
|
||||
console.log(`Starting test SMTP server on port ${port}...`);
|
||||
|
||||
try {
|
||||
// Create a minimal email server for testing
|
||||
const mockEmailServer = {
|
||||
processEmailByMode: async (emailData: any) => {
|
||||
console.log('📧 Processed test email:', emailData.subject || 'No subject');
|
||||
return emailData;
|
||||
}
|
||||
} as any; // Type assertion for test purposes
|
||||
|
||||
// Load test certificates if available
|
||||
let key = '';
|
||||
let cert = '';
|
||||
try {
|
||||
const __dirname = path.dirname(new URL(import.meta.url).pathname);
|
||||
key = fs.readFileSync(path.join(__dirname, '../../../test/smtp-prod/certs/test.key'), 'utf8');
|
||||
cert = fs.readFileSync(path.join(__dirname, '../../../test/smtp-prod/certs/test.cert'), 'utf8');
|
||||
} catch (e) {
|
||||
console.log('Test certificates not found, running without TLS');
|
||||
}
|
||||
|
||||
// SMTP server options
|
||||
const smtpOptions = {
|
||||
port: port,
|
||||
hostname: 'localhost',
|
||||
key: key,
|
||||
cert: cert,
|
||||
maxConnections: 100,
|
||||
size: 10 * 1024 * 1024, // 10MB
|
||||
maxRecipients: 100,
|
||||
socketTimeout: 30000,
|
||||
connectionTimeout: 60000,
|
||||
cleanupInterval: 300000,
|
||||
auth: {
|
||||
required: false,
|
||||
methods: [] as ('PLAIN' | 'LOGIN' | 'OAUTH2')[]
|
||||
}
|
||||
};
|
||||
|
||||
// Create and start SMTP server
|
||||
const smtpServer = createSmtpServer(mockEmailServer, smtpOptions);
|
||||
await smtpServer.listen();
|
||||
|
||||
activeServer = smtpServer;
|
||||
activePort = port;
|
||||
|
||||
// Wait for server to be ready
|
||||
await waitForServerReady('localhost', port, 10000);
|
||||
|
||||
console.log(`✅ Test SMTP server started on port ${port}`);
|
||||
return smtpServer;
|
||||
|
||||
} catch (error) {
|
||||
console.error('Failed to start test server:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop test server
|
||||
*/
|
||||
async function stopTestServer() {
|
||||
if (!activeServer) {
|
||||
console.log('No active test server to stop');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`Stopping test SMTP server on port ${activePort}...`);
|
||||
|
||||
try {
|
||||
if (activeServer.close && typeof activeServer.close === 'function') {
|
||||
await activeServer.close();
|
||||
} else if (activeServer.destroy && typeof activeServer.destroy === 'function') {
|
||||
await activeServer.destroy();
|
||||
} else if (activeServer.stop && typeof activeServer.stop === 'function') {
|
||||
await activeServer.stop();
|
||||
}
|
||||
|
||||
// Force close any remaining connections
|
||||
if (activeServer._connections) {
|
||||
for (const conn of activeServer._connections) {
|
||||
if (conn && !conn.destroyed) {
|
||||
conn.destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
activeServer = null;
|
||||
const port = activePort;
|
||||
activePort = null;
|
||||
|
||||
// Wait for port to be free
|
||||
await waitForPortFree(port, 3000);
|
||||
|
||||
console.log(`✅ Test SMTP server stopped`);
|
||||
} catch (error) {
|
||||
console.error('Error stopping test server:', error);
|
||||
activeServer = null;
|
||||
activePort = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for server to be ready to accept connections
|
||||
*/
|
||||
async function waitForServerReady(hostname, port, timeout) {
|
||||
const startTime = Date.now();
|
||||
const maxRetries = 20;
|
||||
let retries = 0;
|
||||
|
||||
while (retries < maxRetries) {
|
||||
try {
|
||||
await new Promise((resolve, reject) => {
|
||||
const socket = net.createConnection({ port, host: hostname });
|
||||
|
||||
socket.on('connect', () => {
|
||||
socket.end();
|
||||
resolve(undefined);
|
||||
});
|
||||
|
||||
socket.on('error', (error) => {
|
||||
socket.destroy();
|
||||
reject(error);
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
socket.destroy();
|
||||
reject(new Error('Connection timeout'));
|
||||
}, 1000);
|
||||
});
|
||||
|
||||
return; // Server is ready
|
||||
|
||||
} catch (error) {
|
||||
retries++;
|
||||
|
||||
if (Date.now() - startTime > timeout) {
|
||||
throw new Error(`Server did not become ready within ${timeout}ms`);
|
||||
}
|
||||
|
||||
// Wait before retrying
|
||||
await new Promise(resolve => setTimeout(resolve, 500));
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error(`Server did not become ready after ${maxRetries} retries`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for port to be free
|
||||
*/
|
||||
async function waitForPortFree(port, timeout) {
|
||||
const startTime = Date.now();
|
||||
|
||||
while (Date.now() - startTime < timeout) {
|
||||
const isFree = await isPortFree(port);
|
||||
if (isFree) {
|
||||
return true;
|
||||
}
|
||||
await new Promise(resolve => setTimeout(resolve, 100));
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if port is free
|
||||
*/
|
||||
async function isPortFree(port) {
|
||||
return new Promise((resolve) => {
|
||||
const server = net.createServer();
|
||||
|
||||
server.listen(port, () => {
|
||||
server.close(() => {
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
|
||||
server.on('error', () => {
|
||||
resolve(false);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Export functions
|
||||
export {
|
||||
startTestServer,
|
||||
stopTestServer
|
||||
};
|
@ -87,7 +87,7 @@ tap.test('should allocate IPs using balanced policy', async () => {
|
||||
}
|
||||
|
||||
// We should use at least 2 different IPs with balanced policy
|
||||
expect(usedIPs.size >= 2).toBeTrue();
|
||||
expect(usedIPs.size >= 2).toEqual(true);
|
||||
});
|
||||
|
||||
// Test round robin allocation policy
|
||||
@ -122,7 +122,7 @@ tap.test('should allocate IPs using round robin policy', async () => {
|
||||
});
|
||||
|
||||
// Round robin should give us different IPs for consecutive calls
|
||||
expect(firstIP !== secondIP).toBeTrue();
|
||||
expect(firstIP !== secondIP).toEqual(true);
|
||||
|
||||
// With 3 IPs, the fourth call should cycle back to one of the IPs
|
||||
const fourthIP = ipWarmupManager.getBestIPForSending({
|
||||
@ -132,7 +132,7 @@ tap.test('should allocate IPs using round robin policy', async () => {
|
||||
});
|
||||
|
||||
// Check that the fourth IP is one of the 3 valid IPs
|
||||
expect(['192.168.1.1', '192.168.1.2', '192.168.1.3'].includes(fourthIP)).toBeTrue();
|
||||
expect(['192.168.1.1', '192.168.1.2', '192.168.1.3'].includes(fourthIP)).toEqual(true);
|
||||
});
|
||||
|
||||
// Test dedicated domain allocation policy
|
||||
@ -219,7 +219,7 @@ tap.test('should enforce daily sending limits', async () => {
|
||||
domain: 'example.com'
|
||||
});
|
||||
|
||||
expect(ip === '192.168.1.1').toBeTrue();
|
||||
expect(ip === '192.168.1.1').toEqual(true);
|
||||
|
||||
// Record 5 sends to reach the daily limit
|
||||
for (let i = 0; i < 5; i++) {
|
||||
@ -238,7 +238,7 @@ tap.test('should enforce daily sending limits', async () => {
|
||||
domain: 'example.com'
|
||||
});
|
||||
|
||||
expect(sixthIP === null).toBeTrue();
|
||||
expect(sixthIP === null).toEqual(true);
|
||||
});
|
||||
|
||||
// Test recording sends
|
||||
@ -307,7 +307,7 @@ tap.test('should assign IPs using dedicated domain policy', async () => {
|
||||
domain: 'example.com'
|
||||
});
|
||||
|
||||
expect(ip1again === ip1).toBeTrue();
|
||||
expect(ip1again === ip1).toEqual(true);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -47,7 +47,7 @@ tap.test('verify that SenderReputationMonitor and IPWarmupManager are functionin
|
||||
if (bestIP) {
|
||||
ipWarmupManager.recordSend(bestIP);
|
||||
const canSendMore = ipWarmupManager.canSendMoreToday(bestIP);
|
||||
expect(canSendMore !== undefined).toBeTrue();
|
||||
expect(canSendMore !== undefined).toEqual(true);
|
||||
}
|
||||
|
||||
const stageCount = ipWarmupManager.getStageCount();
|
||||
|
@ -120,14 +120,14 @@ tap.test('should calculate reputation scores correctly', async () => {
|
||||
|
||||
// Get reputation summary
|
||||
const summary = reputationMonitor.getReputationSummary();
|
||||
expect(Array.isArray(summary)).toBeTrue();
|
||||
expect(summary.length >= 3).toBeTrue();
|
||||
expect(Array.isArray(summary)).toEqual(true);
|
||||
expect(summary.length >= 3).toEqual(true);
|
||||
|
||||
// Check that domains are included in the summary
|
||||
const domains = summary.map(item => item.domain);
|
||||
expect(domains.includes('high.com')).toBeTrue();
|
||||
expect(domains.includes('medium.com')).toBeTrue();
|
||||
expect(domains.includes('low.com')).toBeTrue();
|
||||
expect(domains.includes('high.com')).toEqual(true);
|
||||
expect(domains.includes('medium.com')).toEqual(true);
|
||||
expect(domains.includes('low.com')).toEqual(true);
|
||||
});
|
||||
|
||||
// Test adding and removing domains
|
||||
@ -154,7 +154,7 @@ tap.test('should add and remove domains for monitoring', async () => {
|
||||
|
||||
// Check that data is no longer available
|
||||
const removedMetrics = reputationMonitor.getReputationData('newdomain.com');
|
||||
expect(removedMetrics === null).toBeTrue();
|
||||
expect(removedMetrics === null).toEqual(true);
|
||||
});
|
||||
|
||||
// Test handling open and click events
|
||||
|
@ -14,15 +14,15 @@ tap.test('EmailValidator - should validate email formats correctly', async (tool
|
||||
const validator = new EmailValidator();
|
||||
|
||||
// Test valid email formats
|
||||
expect(validator.isValidFormat('user@example.com')).toBeTrue();
|
||||
expect(validator.isValidFormat('firstname.lastname@example.com')).toBeTrue();
|
||||
expect(validator.isValidFormat('user+tag@example.com')).toBeTrue();
|
||||
expect(validator.isValidFormat('user@example.com')).toEqual(true);
|
||||
expect(validator.isValidFormat('firstname.lastname@example.com')).toEqual(true);
|
||||
expect(validator.isValidFormat('user+tag@example.com')).toEqual(true);
|
||||
|
||||
// Test invalid email formats
|
||||
expect(validator.isValidFormat('user@')).toBeFalse();
|
||||
expect(validator.isValidFormat('@example.com')).toBeFalse();
|
||||
expect(validator.isValidFormat('user@example')).toBeFalse();
|
||||
expect(validator.isValidFormat('user.example.com')).toBeFalse();
|
||||
expect(validator.isValidFormat('user@')).toEqual(false);
|
||||
expect(validator.isValidFormat('@example.com')).toEqual(false);
|
||||
expect(validator.isValidFormat('user@example')).toEqual(false);
|
||||
expect(validator.isValidFormat('user.example.com')).toEqual(false);
|
||||
});
|
||||
|
||||
tap.test('EmailValidator - should perform comprehensive validation', async (tools) => {
|
||||
@ -30,8 +30,8 @@ tap.test('EmailValidator - should perform comprehensive validation', async (tool
|
||||
|
||||
// Test basic validation (syntax-only)
|
||||
const basicResult = await validator.validate('user@example.com', { checkSyntaxOnly: true });
|
||||
expect(basicResult.isValid).toBeTrue();
|
||||
expect(basicResult.details.formatValid).toBeTrue();
|
||||
expect(basicResult.isValid).toEqual(true);
|
||||
expect(basicResult.details.formatValid).toEqual(true);
|
||||
|
||||
// We can't reliably test MX validation in all environments, but the function should run
|
||||
const mxResult = await validator.validate('user@example.com', { checkMx: true });
|
||||
@ -43,8 +43,8 @@ tap.test('EmailValidator - should detect invalid emails', async (tools) => {
|
||||
const validator = new EmailValidator();
|
||||
|
||||
const invalidResult = await validator.validate('invalid@@example.com', { checkSyntaxOnly: true });
|
||||
expect(invalidResult.isValid).toBeFalse();
|
||||
expect(invalidResult.details.formatValid).toBeFalse();
|
||||
expect(invalidResult.isValid).toEqual(false);
|
||||
expect(invalidResult.details.formatValid).toEqual(false);
|
||||
});
|
||||
|
||||
tap.test('TemplateManager - should register and retrieve templates', async (tools) => {
|
||||
@ -72,8 +72,8 @@ tap.test('TemplateManager - should register and retrieve templates', async (tool
|
||||
|
||||
// List templates
|
||||
const templates = templateManager.listTemplates();
|
||||
expect(templates.length > 0).toBeTrue();
|
||||
expect(templates.some(t => t.id === 'test-template')).toBeTrue();
|
||||
expect(templates.length > 0).toEqual(true);
|
||||
expect(templates.some(t => t.id === 'test-template')).toEqual(true);
|
||||
});
|
||||
|
||||
tap.test('TemplateManager - should create smartmail from template', async (tools) => {
|
||||
@ -101,7 +101,7 @@ tap.test('TemplateManager - should create smartmail from template', async (tools
|
||||
expect(smartmail).toBeTruthy();
|
||||
expect(smartmail.options.from).toEqual('welcome@example.com');
|
||||
expect(smartmail.getSubject()).toEqual('Welcome, John Doe!');
|
||||
expect(smartmail.getBody(true).indexOf('Hello, John Doe!') > -1).toBeTrue();
|
||||
expect(smartmail.getBody(true).indexOf('Hello, John Doe!') > -1).toEqual(true);
|
||||
});
|
||||
|
||||
tap.test('Email - should handle template variables', async (tools) => {
|
||||
@ -121,7 +121,7 @@ tap.test('Email - should handle template variables', async (tools) => {
|
||||
// Test variable substitution
|
||||
expect(email.getSubjectWithVariables()).toEqual('Hello John Doe!');
|
||||
expect(email.getTextWithVariables()).toEqual('Welcome, John Doe! Your order #12345 has been processed.');
|
||||
expect(email.getHtmlWithVariables().indexOf('<strong>John Doe</strong>') > -1).toBeTrue();
|
||||
expect(email.getHtmlWithVariables().indexOf('<strong>John Doe</strong>') > -1).toEqual(true);
|
||||
|
||||
// Test with additional variables
|
||||
const additionalVars = {
|
||||
@ -133,7 +133,7 @@ tap.test('Email - should handle template variables', async (tools) => {
|
||||
|
||||
// Add a new variable
|
||||
email.setVariable('trackingNumber', 'TRK123456');
|
||||
expect(email.getTextWithVariables().indexOf('12345') > -1).toBeTrue();
|
||||
expect(email.getTextWithVariables().indexOf('12345') > -1).toEqual(true);
|
||||
|
||||
// Update multiple variables at once
|
||||
email.setVariables({
|
||||
@ -141,7 +141,7 @@ tap.test('Email - should handle template variables', async (tools) => {
|
||||
status: 'delivered'
|
||||
});
|
||||
|
||||
expect(email.getTextWithVariables().indexOf('67890') > -1).toBeTrue();
|
||||
expect(email.getTextWithVariables().indexOf('67890') > -1).toEqual(true);
|
||||
});
|
||||
|
||||
tap.test('Email and Smartmail compatibility - should convert between formats', async (tools) => {
|
||||
@ -172,9 +172,9 @@ tap.test('Email and Smartmail compatibility - should convert between formats', a
|
||||
|
||||
// Verify first conversion (Smartmail to Email)
|
||||
expect(email.from).toEqual('smartmail@example.com');
|
||||
expect(email.to.indexOf('recipient@example.com') > -1).toBeTrue();
|
||||
expect(email.to.indexOf('recipient@example.com') > -1).toEqual(true);
|
||||
expect(email.subject).toEqual('Test Subject');
|
||||
expect(email.html?.indexOf('This is a test email') > -1).toBeTrue();
|
||||
expect(email.html?.indexOf('This is a test email') > -1).toEqual(true);
|
||||
expect(email.attachments.length).toEqual(1);
|
||||
|
||||
// Convert back to Smartmail
|
||||
@ -182,10 +182,10 @@ tap.test('Email and Smartmail compatibility - should convert between formats', a
|
||||
|
||||
// Verify second conversion (Email back to Smartmail) with simplified assertions
|
||||
expect(convertedSmartmail.options.from).toEqual('smartmail@example.com');
|
||||
expect(Array.isArray(convertedSmartmail.options.to)).toBeTrue();
|
||||
expect(Array.isArray(convertedSmartmail.options.to)).toEqual(true);
|
||||
expect(convertedSmartmail.options.to.length).toEqual(1);
|
||||
expect(convertedSmartmail.getSubject()).toEqual('Test Subject');
|
||||
expect(convertedSmartmail.getBody(true).indexOf('This is a test email') > -1).toBeTrue();
|
||||
expect(convertedSmartmail.getBody(true).indexOf('This is a test email') > -1).toEqual(true);
|
||||
expect(convertedSmartmail.attachments.length).toEqual(1);
|
||||
});
|
||||
|
||||
@ -202,10 +202,10 @@ tap.test('Email - should validate email addresses', async (tools) => {
|
||||
});
|
||||
} catch (error) {
|
||||
errorThrown = true;
|
||||
expect(error.message.indexOf('Invalid sender email address') > -1).toBeTrue();
|
||||
expect(error.message.indexOf('Invalid sender email address') > -1).toEqual(true);
|
||||
}
|
||||
|
||||
expect(errorThrown).toBeTrue();
|
||||
expect(errorThrown).toEqual(true);
|
||||
|
||||
// Attempt with invalid recipient
|
||||
errorThrown = false;
|
||||
@ -219,10 +219,10 @@ tap.test('Email - should validate email addresses', async (tools) => {
|
||||
});
|
||||
} catch (error) {
|
||||
errorThrown = true;
|
||||
expect(error.message.indexOf('Invalid recipient email address') > -1).toBeTrue();
|
||||
expect(error.message.indexOf('Invalid recipient email address') > -1).toEqual(true);
|
||||
}
|
||||
|
||||
expect(errorThrown).toBeTrue();
|
||||
expect(errorThrown).toEqual(true);
|
||||
|
||||
// Valid email should not throw
|
||||
let validEmail: Email;
|
||||
@ -237,7 +237,7 @@ tap.test('Email - should validate email addresses', async (tools) => {
|
||||
expect(validEmail).toBeTruthy();
|
||||
expect(validEmail.from).toEqual('sender@example.com');
|
||||
} catch (error) {
|
||||
expect(error === undefined).toBeTrue(); // This should not happen
|
||||
expect(error === undefined).toEqual(true); // This should not happen
|
||||
}
|
||||
});
|
||||
|
||||
|
Reference in New Issue
Block a user