180 lines
5.4 KiB
TypeScript
180 lines
5.4 KiB
TypeScript
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
|
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js';
|
|
import { createSmtpClient } from '../../../ts/mail/delivery/smtpclient/index.js';
|
|
import { Email } from '../../../ts/mail/core/classes.email.js';
|
|
|
|
let testServer: ITestServer;
|
|
|
|
tap.test('setup test SMTP server', async () => {
|
|
testServer = await startTestServer({
|
|
port: 2575,
|
|
tlsEnabled: false,
|
|
authRequired: false
|
|
});
|
|
expect(testServer).toBeTruthy();
|
|
expect(testServer.port).toEqual(2575);
|
|
});
|
|
|
|
tap.test('CEDGE-06: Very long subject lines', async () => {
|
|
console.log('Testing very long subject lines');
|
|
|
|
const smtpClient = createSmtpClient({
|
|
host: testServer.hostname,
|
|
port: testServer.port,
|
|
secure: false,
|
|
connectionTimeout: 5000,
|
|
debug: true
|
|
});
|
|
|
|
// Test various subject line lengths
|
|
const testSubjects = [
|
|
'Normal Subject Line',
|
|
'A'.repeat(100), // 100 chars
|
|
'B'.repeat(500), // 500 chars
|
|
'C'.repeat(1000), // 1000 chars
|
|
'D'.repeat(2000), // 2000 chars - very long
|
|
];
|
|
|
|
for (const subject of testSubjects) {
|
|
console.log(` Testing subject length: ${subject.length} chars`);
|
|
|
|
const email = new Email({
|
|
from: 'sender@example.com',
|
|
to: ['recipient@example.com'],
|
|
subject: subject,
|
|
text: 'Testing large subject headers'
|
|
});
|
|
|
|
const result = await smtpClient.sendMail(email);
|
|
expect(result).toBeDefined();
|
|
expect(result.messageId).toBeDefined();
|
|
}
|
|
|
|
await smtpClient.close();
|
|
});
|
|
|
|
tap.test('CEDGE-06: Multiple large headers', async () => {
|
|
console.log('Testing multiple large headers');
|
|
|
|
const smtpClient = createSmtpClient({
|
|
host: testServer.hostname,
|
|
port: testServer.port,
|
|
secure: false,
|
|
connectionTimeout: 5000,
|
|
debug: true
|
|
});
|
|
|
|
// Create email with multiple large headers
|
|
const largeValue = 'X'.repeat(500);
|
|
const email = new Email({
|
|
from: 'sender@example.com',
|
|
to: ['recipient@example.com'],
|
|
subject: 'Multiple large headers test',
|
|
text: 'Testing multiple large headers',
|
|
headers: {
|
|
'X-Large-Header-1': largeValue,
|
|
'X-Large-Header-2': largeValue,
|
|
'X-Large-Header-3': largeValue,
|
|
'X-Large-Header-4': largeValue,
|
|
'X-Large-Header-5': largeValue,
|
|
'X-Very-Long-Header-Name-That-Exceeds-Normal-Limits': 'Value for long header name',
|
|
'X-Mixed-Content': `Start-${largeValue}-Middle-${largeValue}-End`
|
|
}
|
|
});
|
|
|
|
const result = await smtpClient.sendMail(email);
|
|
console.log(`Result: ${result.messageId ? 'Success' : 'Failed'}`);
|
|
expect(result).toBeDefined();
|
|
expect(result.messageId).toBeDefined();
|
|
|
|
await smtpClient.close();
|
|
});
|
|
|
|
tap.test('CEDGE-06: Header folding and wrapping', async () => {
|
|
console.log('Testing header folding and wrapping');
|
|
|
|
const smtpClient = createSmtpClient({
|
|
host: testServer.hostname,
|
|
port: testServer.port,
|
|
secure: false,
|
|
connectionTimeout: 5000,
|
|
debug: true
|
|
});
|
|
|
|
// Create headers that should be folded
|
|
const longHeaderValue = 'This is a very long header value that should exceed the recommended 78 character line limit and force the header to be folded across multiple lines according to RFC 5322 specifications';
|
|
|
|
const email = new Email({
|
|
from: 'sender@example.com',
|
|
to: ['recipient@example.com'],
|
|
subject: 'Header folding test with a very long subject line that should also be folded properly',
|
|
text: 'Testing header folding',
|
|
headers: {
|
|
'X-Long-Header': longHeaderValue,
|
|
'X-Multi-Line': `Line 1 ${longHeaderValue}\nLine 2 ${longHeaderValue}\nLine 3 ${longHeaderValue}`,
|
|
'X-Special-Chars': `Header with special chars: \t\r\n\x20 and unicode: 🎉 émojis`
|
|
}
|
|
});
|
|
|
|
const result = await smtpClient.sendMail(email);
|
|
console.log(`Result: ${result.messageId ? 'Success' : 'Failed'}`);
|
|
expect(result).toBeDefined();
|
|
expect(result.messageId).toBeDefined();
|
|
|
|
await smtpClient.close();
|
|
});
|
|
|
|
tap.test('CEDGE-06: Maximum header size limits', async () => {
|
|
console.log('Testing maximum header size limits');
|
|
|
|
const smtpClient = createSmtpClient({
|
|
host: testServer.hostname,
|
|
port: testServer.port,
|
|
secure: false,
|
|
connectionTimeout: 5000,
|
|
debug: true
|
|
});
|
|
|
|
// Test near RFC limits (recommended 998 chars per line)
|
|
const nearMaxValue = 'Y'.repeat(900); // Near but under limit
|
|
const overMaxValue = 'Z'.repeat(1500); // Over recommended limit
|
|
|
|
const testCases = [
|
|
{ name: 'Near limit', value: nearMaxValue },
|
|
{ name: 'Over limit', value: overMaxValue }
|
|
];
|
|
|
|
for (const testCase of testCases) {
|
|
console.log(` Testing ${testCase.name}: ${testCase.value.length} chars`);
|
|
|
|
const email = new Email({
|
|
from: 'sender@example.com',
|
|
to: ['recipient@example.com'],
|
|
subject: `Header size test: ${testCase.name}`,
|
|
text: 'Testing header size limits',
|
|
headers: {
|
|
'X-Size-Test': testCase.value
|
|
}
|
|
});
|
|
|
|
try {
|
|
const result = await smtpClient.sendMail(email);
|
|
console.log(` ${testCase.name}: Success`);
|
|
expect(result).toBeDefined();
|
|
} catch (error) {
|
|
console.log(` ${testCase.name}: Failed (${error.message})`);
|
|
// Some failures might be expected for oversized headers
|
|
expect(error).toBeDefined();
|
|
}
|
|
}
|
|
|
|
await smtpClient.close();
|
|
});
|
|
|
|
tap.test('cleanup test SMTP server', async () => {
|
|
if (testServer) {
|
|
await stopTestServer(testServer);
|
|
}
|
|
});
|
|
|
|
export default tap.start(); |