@snehal96/unimail
Version:
Unified email fetching & document extraction layer for modern web apps
73 lines (72 loc) • 3.41 kB
JavaScript
import { EmailParserService } from '../../src/services/EmailParserService';
import * as mailparser from 'mailparser';
// Mock mailparser
jest.mock('mailparser', () => ({
simpleParser: jest.fn()
}));
describe('EmailParserService', () => {
let emailParserService;
const simpleParserMock = mailparser.simpleParser;
beforeEach(() => {
emailParserService = new EmailParserService();
jest.clearAllMocks();
// Setup default mock implementation
simpleParserMock.mockResolvedValue({
from: { text: 'sender@example.com' },
to: [{ text: 'recipient@example.com' }],
subject: 'Test Email',
text: 'Plain text content',
html: '<p>HTML content</p>',
attachments: [
{
filename: 'attachment.pdf',
contentType: 'application/pdf',
size: 12345,
content: Buffer.from('test content'),
contentId: 'test-id'
}
],
messageId: 'test-message-id',
date: new Date(),
references: ['ref1']
});
});
test('should parse email correctly', async () => {
const result = await emailParserService.parseEmail('raw email data', 'email-id', 'gmail');
expect(simpleParserMock).toHaveBeenCalledWith('raw email data');
expect(result.id).toBe('email-id');
expect(result.provider).toBe('gmail');
expect(result.attachments).toHaveLength(1);
expect(result.attachments[0].filename).toBe('attachment.pdf');
});
test('should handle parsing errors correctly', async () => {
simpleParserMock.mockRejectedValueOnce(new Error('Parsing error'));
await expect(emailParserService.parseEmail('invalid email data', 'email-id', 'gmail'))
.rejects.toThrow('Failed to parse email: Parsing error');
});
test('should handle email with no attachments', async () => {
simpleParserMock.mockResolvedValueOnce({
from: { text: 'sender@example.com' },
to: [{ text: 'recipient@example.com' }],
subject: 'Test Email',
text: 'Plain text content',
html: '<p>HTML content</p>',
messageId: 'test-message-id',
date: new Date(),
references: ['ref1'],
// No attachments field
});
const result = await emailParserService.parseEmail('email data', 'email-id', 'gmail');
expect(result.attachments).toHaveLength(0);
});
test('isInlineAttachment static method works correctly', () => {
const inlineAttachment = { contentDisposition: 'inline', contentId: '<test>' };
const regularAttachment = { contentDisposition: 'attachment' };
const missingContentDisposition = { contentId: '<test>' };
const missingContentId = { contentDisposition: 'inline' };
expect(EmailParserService.isInlineAttachment(inlineAttachment)).toBe(true);
expect(EmailParserService.isInlineAttachment(regularAttachment)).toBe(false);
expect(EmailParserService.isInlineAttachment(missingContentDisposition)).toBe(true); // Will be true because it has contentId with '<'
expect(EmailParserService.isInlineAttachment(missingContentId)).toBe(true); // Will be true because it has contentDisposition 'inline'
});
});