import { test, expect, jest } from '@jest/globals'; import { Email, Outbox, Inbox, IRecv, ISend } from '@emprespresso/uptime'; import { LogMetricTraceable, Either } from '@emprespresso/pengueno'; import { FetchMessageObject, MailboxLockObject } from 'imapflow'; const createMockRecv = (): IRecv => ({ connect: jest.fn(), logout: jest.fn(), getMailboxLock: jest.fn(), mailboxClose: jest.fn(), fetchAll: jest.fn(), messageDelete: jest.fn(), }); const createMockSend = (): ISend => ({ sendMail: jest.fn(), }); const from = { send_port: 465, email: 'test@localhost', username: 'test', password: 'password', send_host: 'localhost', }; const to = { read_port: 993, email: 'test@localhost', username: 'test', password: 'password', read_host: 'localhost', }; test('failure to send message goes left', async () => { const send = createMockSend(); send.sendMail.mockRejectedValue(new Error('fail')); const outbox = new Outbox(send); const email = LogMetricTraceable.of({ from: from.email, to: to.email, subject: 'test', text: 'test', }); const result = await outbox.send(email); expect(result.left().present()).toBe(true); expect(result.left().get().message).toBe('fail'); }); test('goes left when message not ever received', async () => { const recv = createMockRecv(); recv.fetchAll.mockResolvedValue([]); const lock: MailboxLockObject = { path: 'INBOX', release: jest.fn() }; const inbox = new Inbox(recv, LogMetricTraceable.of(lock)); const email = LogMetricTraceable.of({ from: from.email, to: to.email, subject: 'test', text: 'test', }); const result = await inbox.find(email); expect(result.left().present()).toBe(true); }); test('releases lock on failure', async () => { const recv = createMockRecv(); recv.fetchAll.mockResolvedValue([]); const lock: MailboxLockObject = { path: 'INBOX', release: jest.fn() }; // Mock mailboxClose and logout to resolve properly recv.mailboxClose.mockResolvedValue(true); recv.logout.mockResolvedValue(); const inbox = new Inbox(recv, LogMetricTraceable.of(lock)); const email = LogMetricTraceable.of({ from: from.email, to: to.email, subject: 'test', text: 'test', }); await inbox.find(email); await inbox.close(); expect(lock.release).toHaveBeenCalledTimes(1); expect(recv.mailboxClose).toHaveBeenCalledTimes(1); expect(recv.logout).toHaveBeenCalledTimes(1); });