import { describe, it, expect, vi, beforeEach } from 'vitest'; import { GmailChannel, GmailChannelOpts } from './gmail.js'; function makeOpts(overrides?: Partial): GmailChannelOpts { return { onMessage: vi.fn(), onChatMetadata: vi.fn(), registeredGroups: () => ({}), ...overrides, }; } describe('GmailChannel', () => { let channel: GmailChannel; beforeEach(() => { channel = new GmailChannel(makeOpts()); }); describe('ownsJid', () => { it('returns true for gmail: prefixed JIDs', () => { expect(channel.ownsJid('gmail:abc123')).toBe(true); expect(channel.ownsJid('gmail:thread-id-456')).toBe(true); }); it('returns false for non-gmail JIDs', () => { expect(channel.ownsJid('12345@g.us')).toBe(false); expect(channel.ownsJid('tg:123')).toBe(false); expect(channel.ownsJid('dc:456')).toBe(false); expect(channel.ownsJid('user@s.whatsapp.net')).toBe(false); }); }); describe('name', () => { it('is gmail', () => { expect(channel.name).toBe('gmail'); }); }); describe('isConnected', () => { it('returns false before connect', () => { expect(channel.isConnected()).toBe(false); }); }); describe('disconnect', () => { it('sets connected to false', async () => { await channel.disconnect(); expect(channel.isConnected()).toBe(false); }); }); describe('constructor options', () => { it('accepts custom poll interval', () => { const ch = new GmailChannel(makeOpts(), 30000); expect(ch.name).toBe('gmail'); }); it('defaults to unread query when no filter configured', () => { const ch = new GmailChannel(makeOpts()); const query = (ch as unknown as { buildQuery: () => string }).buildQuery(); expect(query).toBe('is:unread category:primary'); }); it('defaults with no options provided', () => { const ch = new GmailChannel(makeOpts()); expect(ch.name).toBe('gmail'); }); }); });