2025-05-22 10:18:02 +00:00
|
|
|
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
2025-05-27 10:39:29 +00:00
|
|
|
import { smtpClientMod } from '../ts/mail/delivery/index.js';
|
|
|
|
import type { ISmtpClientOptions, SmtpClient } from '../ts/mail/delivery/smtpclient/index.js';
|
2025-05-22 10:18:02 +00:00
|
|
|
import { Email } from '../ts/mail/core/classes.email.js';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Compatibility tests for the legacy SMTP client facade
|
|
|
|
*/
|
|
|
|
|
|
|
|
tap.test('verify backward compatibility - client creation', async () => {
|
|
|
|
// Create test configuration
|
|
|
|
const options: ISmtpClientOptions = {
|
|
|
|
host: 'smtp.example.com',
|
|
|
|
port: 587,
|
|
|
|
secure: false,
|
|
|
|
connectionTimeout: 10000,
|
|
|
|
domain: 'test.example.com'
|
|
|
|
};
|
|
|
|
|
|
|
|
// Create SMTP client instance using legacy constructor
|
2025-05-27 10:39:29 +00:00
|
|
|
const smtpClient = smtpClientMod.createSmtpClient(options);
|
2025-05-22 10:18:02 +00:00
|
|
|
|
|
|
|
// Verify instance was created correctly
|
|
|
|
expect(smtpClient).toBeTruthy();
|
|
|
|
expect(smtpClient.isConnected()).toBeFalsy(); // Should start disconnected
|
|
|
|
});
|
|
|
|
|
|
|
|
tap.test('verify backward compatibility - methods exist', async () => {
|
|
|
|
const options: ISmtpClientOptions = {
|
|
|
|
host: 'smtp.example.com',
|
|
|
|
port: 587,
|
|
|
|
secure: false
|
|
|
|
};
|
|
|
|
|
2025-05-27 10:39:29 +00:00
|
|
|
const smtpClient = smtpClientMod.createSmtpClient(options);
|
2025-05-22 10:18:02 +00:00
|
|
|
|
|
|
|
// Verify all expected methods exist
|
|
|
|
expect(typeof smtpClient.sendMail === 'function').toBeTruthy();
|
|
|
|
expect(typeof smtpClient.verify === 'function').toBeTruthy();
|
|
|
|
expect(typeof smtpClient.isConnected === 'function').toBeTruthy();
|
|
|
|
expect(typeof smtpClient.getPoolStatus === 'function').toBeTruthy();
|
|
|
|
expect(typeof smtpClient.updateOptions === 'function').toBeTruthy();
|
|
|
|
expect(typeof smtpClient.close === 'function').toBeTruthy();
|
|
|
|
expect(typeof smtpClient.on === 'function').toBeTruthy();
|
|
|
|
expect(typeof smtpClient.off === 'function').toBeTruthy();
|
|
|
|
expect(typeof smtpClient.emit === 'function').toBeTruthy();
|
|
|
|
});
|
|
|
|
|
|
|
|
tap.test('verify backward compatibility - options update', async () => {
|
|
|
|
const options: ISmtpClientOptions = {
|
|
|
|
host: 'smtp.example.com',
|
|
|
|
port: 587,
|
|
|
|
secure: false
|
|
|
|
};
|
|
|
|
|
2025-05-27 10:39:29 +00:00
|
|
|
const smtpClient = smtpClientMod.createSmtpClient(options);
|
2025-05-22 10:18:02 +00:00
|
|
|
|
|
|
|
// Test option updates don't throw
|
|
|
|
expect(() => smtpClient.updateOptions({
|
|
|
|
host: 'new-smtp.example.com',
|
|
|
|
port: 465,
|
|
|
|
secure: true
|
|
|
|
})).not.toThrow();
|
|
|
|
|
|
|
|
expect(() => smtpClient.updateOptions({
|
|
|
|
debug: true,
|
|
|
|
connectionTimeout: 5000
|
|
|
|
})).not.toThrow();
|
|
|
|
});
|
|
|
|
|
|
|
|
tap.test('verify backward compatibility - connection failure handling', async () => {
|
|
|
|
const options: ISmtpClientOptions = {
|
|
|
|
host: 'nonexistent.invalid.domain',
|
|
|
|
port: 587,
|
|
|
|
secure: false,
|
|
|
|
connectionTimeout: 1000 // Short timeout for faster test
|
|
|
|
};
|
|
|
|
|
2025-05-27 10:39:29 +00:00
|
|
|
const smtpClient = smtpClientMod.createSmtpClient(options);
|
2025-05-22 10:18:02 +00:00
|
|
|
|
|
|
|
// verify() should return false for invalid hosts
|
|
|
|
const isValid = await smtpClient.verify();
|
|
|
|
expect(isValid).toBeFalsy();
|
|
|
|
|
|
|
|
// sendMail should fail gracefully for invalid hosts
|
|
|
|
const email = new Email({
|
|
|
|
from: 'test@example.com',
|
|
|
|
to: 'recipient@example.com',
|
|
|
|
subject: 'Test Email',
|
|
|
|
text: 'This is a test email'
|
|
|
|
});
|
|
|
|
|
|
|
|
try {
|
|
|
|
const result = await smtpClient.sendMail(email);
|
|
|
|
expect(result.success).toBeFalsy();
|
|
|
|
expect(result.error).toBeTruthy();
|
|
|
|
} catch (error) {
|
|
|
|
// Connection errors are expected for invalid domains
|
|
|
|
expect(error).toBeTruthy();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
tap.test('verify backward compatibility - pool status', async () => {
|
|
|
|
const options: ISmtpClientOptions = {
|
|
|
|
host: 'smtp.example.com',
|
|
|
|
port: 587,
|
|
|
|
secure: false,
|
|
|
|
pool: true,
|
|
|
|
maxConnections: 5
|
|
|
|
};
|
|
|
|
|
2025-05-27 10:39:29 +00:00
|
|
|
const smtpClient = smtpClientMod.createSmtpClient(options);
|
2025-05-22 10:18:02 +00:00
|
|
|
|
|
|
|
// Get pool status
|
|
|
|
const status = smtpClient.getPoolStatus();
|
|
|
|
expect(status).toBeTruthy();
|
|
|
|
expect(typeof status.total === 'number').toBeTruthy();
|
|
|
|
expect(typeof status.active === 'number').toBeTruthy();
|
|
|
|
expect(typeof status.idle === 'number').toBeTruthy();
|
|
|
|
expect(typeof status.pending === 'number').toBeTruthy();
|
|
|
|
|
|
|
|
// Initially should have no connections
|
|
|
|
expect(status.total).toEqual(0);
|
|
|
|
expect(status.active).toEqual(0);
|
|
|
|
expect(status.idle).toEqual(0);
|
|
|
|
expect(status.pending).toEqual(0);
|
|
|
|
});
|
|
|
|
|
|
|
|
tap.test('verify backward compatibility - event handling', async () => {
|
|
|
|
const options: ISmtpClientOptions = {
|
|
|
|
host: 'smtp.example.com',
|
|
|
|
port: 587,
|
|
|
|
secure: false
|
|
|
|
};
|
|
|
|
|
2025-05-27 10:39:29 +00:00
|
|
|
const smtpClient = smtpClientMod.createSmtpClient(options);
|
2025-05-22 10:18:02 +00:00
|
|
|
|
|
|
|
// Test event listener methods don't throw
|
|
|
|
const testListener = () => {};
|
|
|
|
|
|
|
|
expect(() => smtpClient.on('test', testListener)).not.toThrow();
|
|
|
|
expect(() => smtpClient.off('test', testListener)).not.toThrow();
|
|
|
|
expect(() => smtpClient.emit('test')).not.toThrow();
|
|
|
|
});
|
|
|
|
|
|
|
|
tap.test('clean up after compatibility tests', async () => {
|
|
|
|
// No-op - just to make sure everything is cleaned up properly
|
|
|
|
});
|
|
|
|
|
|
|
|
tap.test('stop', async () => {
|
|
|
|
await tap.stopForcefully();
|
|
|
|
});
|
|
|
|
|
|
|
|
export default tap.start();
|