import { describe, it, expect, beforeEach, vi } from 'vitest'; import { EmailNotificationAdapter } from './EmailNotificationGateway'; import { Notification } from '@core/notifications/domain/entities/Notification'; describe('EmailNotificationAdapter', () => { const config = { smtpHost: 'smtp.example.com', fromAddress: 'noreply@gridpilot.com', }; let adapter: EmailNotificationAdapter; beforeEach(() => { adapter = new EmailNotificationAdapter(config); vi.spyOn(console, 'log').mockImplementation(() => {}); }); const createNotification = (overrides: any = {}) => { return Notification.create({ id: 'notif-123', recipientId: 'driver-456', type: 'protest_filed', title: 'New Protest', body: 'A new protest has been filed against you.', channel: 'email', ...overrides, }); }; describe('send', () => { it('should return success when configured', async () => { // Given const notification = createNotification(); // When const result = await adapter.send(notification); // Then expect(result.success).toBe(true); expect(result.channel).toBe('email'); expect(result.externalId).toContain('email-stub-'); expect(result.attemptedAt).toBeInstanceOf(Date); }); it('should return failure when not configured', async () => { // Given const unconfiguredAdapter = new EmailNotificationAdapter(); const notification = createNotification(); // When const result = await unconfiguredAdapter.send(notification); // Then expect(result.success).toBe(false); expect(result.error).toBe('Email SMTP not configured'); }); }); describe('supportsChannel', () => { it('should return true for email channel', () => { expect(adapter.supportsChannel('email')).toBe(true); }); it('should return false for other channels', () => { expect(adapter.supportsChannel('discord' as any)).toBe(false); }); }); describe('isConfigured', () => { it('should return true when smtpHost and fromAddress are set', () => { expect(adapter.isConfigured()).toBe(true); }); it('should return false when config is missing', () => { const unconfigured = new EmailNotificationAdapter(); expect(unconfigured.isConfigured()).toBe(false); }); }); describe('configure', () => { it('should update the configuration', () => { const unconfigured = new EmailNotificationAdapter(); unconfigured.configure(config); expect(unconfigured.isConfigured()).toBe(true); }); }); });