2025-05-26 04:09:29 +00:00
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 ` ) ;
2025-05-24 17:00:59 +00:00
2025-05-26 04:09:29 +00:00
const email = new Email ( {
2025-05-24 17:00:59 +00:00
from : 'sender@example.com' ,
to : [ 'recipient@example.com' ] ,
2025-05-26 04:09:29 +00:00
subject : subject ,
text : 'Testing large subject headers'
2025-05-24 17:00:59 +00:00
} ) ;
const result = await smtpClient . sendMail ( email ) ;
expect ( result ) . toBeDefined ( ) ;
expect ( result . messageId ) . toBeDefined ( ) ;
2025-05-26 04:09:29 +00:00
}
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 ` ) ;
2025-05-24 17:00:59 +00:00
2025-05-26 04:09:29 +00:00
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
2025-05-24 17:00:59 +00:00
}
} ) ;
2025-05-26 04:09:29 +00:00
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 ( ) ;
2025-05-24 17:00:59 +00:00
}
2025-05-26 04:09:29 +00:00
}
await smtpClient . close ( ) ;
} ) ;
2025-05-24 17:00:59 +00:00
2025-05-26 04:09:29 +00:00
tap . test ( 'cleanup test SMTP server' , async ( ) = > {
if ( testServer ) {
await stopTestServer ( testServer ) ;
}
} ) ;
2025-05-24 17:00:59 +00:00
2025-05-26 04:09:29 +00:00
export default tap . start ( ) ;