import { DyFM_Error, DyFM_EnvironmentFlag } from '@futdevpro/fsm-dynamo';
import { DyNTS_EmailService, DyNTS_EmailService_Settings, DyNTS_EmailTemplateComponent, DyNTS_SendEmail_Settings } from './email.service';
import { DyNTS_global_settings } from '../../_collections/global-settings.const';
describe('| DyNTS_EmailService', () => {
let emailService: DyNTS_EmailService;
const settings: DyNTS_EmailService_Settings = {
host: 'smtp.example.com',
port: 587,
email: 'test@example.com',
pass: 'password',
senderName: 'Test Sender',
rootPath: '/path/to/templates',
templateComponents: [
new DyNTS_EmailTemplateComponent({
name: 'testComponent',
selector: 'test-selector',
template: '
{{property}}
',
properties: [ 'property' ],
}),
],
};
beforeAll(() => {
if (!DyNTS_global_settings.systemShortCodeName) (DyNTS_global_settings as { systemShortCodeName?: string }).systemShortCodeName = 'TEST';
if (!DyNTS_global_settings.env_settings) (DyNTS_global_settings as { env_settings?: unknown }).env_settings = { environment: DyFM_EnvironmentFlag.local };
});
beforeEach(() => {
(DyNTS_global_settings as { env_settings: unknown }).env_settings = {
environment: DyFM_EnvironmentFlag.local,
mongoUri: 'mongodb://localhost:27017/test',
discord: undefined,
openAi: undefined,
};
emailService = new DyNTS_EmailService(settings);
});
it('| should initialize with correct settings', () => {
expect(emailService.serviceName).toBe('DyNTS_EmailService');
expect(emailService['senderName']).toBe(settings.senderName);
expect(emailService['senderNEmail']).toBe(`${settings.senderName} <${settings.email}>`);
});
it('| should load email template components', async () => {
await emailService.asyncPostConstruct();
expect(emailService['componentsByName']['testComponent']).toBeDefined();
expect(emailService['componentsBySelector']['test-selector']).toBeDefined();
});
it('| should throw error if no template component name is provided', async () => {
const sendEmailSettings: DyNTS_SendEmail_Settings = {
to: 'recipient@example.com',
subject: 'Test Subject',
};
await expectAsync(emailService.sendEmail(sendEmailSettings, 'testIssuer'))
.toBeRejectedWith(jasmine.any(DyFM_Error));
});
it('| should throw error if template component is not found', async () => {
const sendEmailSettings: DyNTS_SendEmail_Settings = {
to: 'recipient@example.com',
subject: 'Test Subject',
templateComponentName: 'nonExistentComponent',
};
await expectAsync(emailService.sendEmail(sendEmailSettings, 'testIssuer'))
.toBeRejectedWith(jasmine.any(DyFM_Error));
});
it('| should throw error if template property is missing', async () => {
const component = new DyNTS_EmailTemplateComponent({
name: 'testComponent',
selector: 'test-selector',
template: '{{missingProperty}}
',
properties: [ 'missingProperty' ],
});
await expectAsync(emailService['compileComponentProperties'](component, {}, '', 'testIssuer'))
.toBeRejectedWith(jasmine.any(DyFM_Error));
});
});