import { tap, expect } from '@git.zone/tstest/tapbundle'; import * as plugins from '../ts/plugins.js'; import * as path from 'path'; import * as fs from 'fs'; import { DcRouter, type IDcRouterOptions } from '../ts/classes.dcrouter.js'; import type { IUnifiedEmailServerOptions } from '@push.rocks/smartmta'; tap.test('DcRouter class - Custom email port configuration', async () => { // Define custom port mapping const customPortMapping: Record = { 25: 11025, // Custom SMTP port mapping 587: 11587, // Custom submission port mapping 465: 11465, // Custom SMTPS port mapping 2525: 12525 // Additional custom port }; // Create a custom email configuration using smartmta interfaces const emailConfig: IUnifiedEmailServerOptions = { ports: [25, 587, 465, 2525], hostname: 'mail.example.com', maxMessageSize: 50 * 1024 * 1024, // 50MB domains: [ { domain: 'example.com', dnsMode: 'external-dns', }, { domain: 'example.org', dnsMode: 'external-dns', } ], routes: [ { name: 'forward-example-com', match: { recipients: '*@example.com', }, action: { type: 'forward', forward: { host: 'mail1.example.com', port: 25, } } }, { name: 'deliver-example-org', match: { recipients: '*@example.org', }, action: { type: 'deliver', process: { dkim: true, } } } ] }; // Create DcRouter options with custom email port configuration const options: IDcRouterOptions = { emailConfig, emailPortConfig: { portMapping: customPortMapping, portSettings: { 2525: { terminateTls: false, routeName: 'custom-smtp-route' } }, }, tls: { contactEmail: 'test@example.com' } }; // Create DcRouter instance const router = new DcRouter(options); // Verify the options are correctly set expect(router.options.emailPortConfig).toBeTruthy(); expect(router.options.emailPortConfig!.portMapping).toEqual(customPortMapping); // Test the generateEmailRoutes method if (typeof (router as any)['generateEmailRoutes'] === 'function') { const routes = (router as any)['generateEmailRoutes'](emailConfig); // Verify that all ports are configured expect(routes.length).toBeGreaterThan(0); // Check the custom port configuration const customPortRoute = routes.find((r: any) => { const ports = r.match.ports; return ports === 2525 || (Array.isArray(ports) && (ports as number[]).includes(2525)); }); expect(customPortRoute).toBeTruthy(); expect(customPortRoute?.name).toEqual('custom-smtp-route'); expect(customPortRoute?.action.targets[0].port).toEqual(12525); // Check standard port mappings const smtpRoute = routes.find((r: any) => { const ports = r.match.ports; return ports === 25 || (Array.isArray(ports) && (ports as number[]).includes(25)); }); expect(smtpRoute?.action.targets[0].port).toEqual(11025); const submissionRoute = routes.find((r: any) => { const ports = r.match.ports; return ports === 587 || (Array.isArray(ports) && (ports as number[]).includes(587)); }); expect(submissionRoute?.action.targets[0].port).toEqual(11587); } }); tap.test('DcRouter class - Email config with domains and routes', async () => { // Create a basic email configuration const emailConfig: IUnifiedEmailServerOptions = { ports: [2525], hostname: 'mail.example.com', domains: [], routes: [] }; // Create DcRouter options const options: IDcRouterOptions = { emailConfig, tls: { contactEmail: 'test@example.com' }, cacheConfig: { enabled: false, } }; // Create DcRouter instance const router = new DcRouter(options); // Start the router to initialize email services await router.start(); // Verify unified email server was initialized expect(router.emailServer).toBeTruthy(); // Stop the router await router.stop(); }); // Final clean-up test tap.test('clean up after tests', async () => { // No-op }); tap.test('stop', async () => { await tap.stopForcefully(); }); export default tap.start();