import { describe, expect, it } from 'vitest' import { parseMessageContent } from '../../src/main/message-parser' describe('message parser', () => { it('parses image, voice and sticker messages without confusing their types', () => { expect(parseMessageContent('', 3)).toMatchObject({ type: 'image', md5: '0123456789abcdef0123456789abcdef' }) expect(parseMessageContent('voice fixture', 34)).toEqual({ type: 'voice' }) expect( parseMessageContent( '', 47 ) ).toMatchObject({ type: 'sticker', md5: 'abcdefabcdefabcdefabcdefabcdefab' }) }) it('parses merged forwards and preserves nested visible text', () => { const parsed = parseMessageContent( '19转发多条内容测试成员脱敏内容', 49 ) expect(parsed.type).toBe('forwardBundle') if (parsed.type === 'forwardBundle') { expect(parsed.title).toBe('转发多条内容') expect(parsed.items.map((item) => item.text).join(' ')).toContain('脱敏内容') } }) it.each([ ['6', '测试附件.pdf'], ['74', '发送中的附件.zip'] ])( 'keeps file app message type %s when attachment metadata contains record tags', (typeVal, title) => { const parsed = parseMessageContent( `${typeVal}${title}1 MBlegacy metadata${title}`, 49 ) expect(parsed).toMatchObject({ type: 'share', title, typeVal }) } ) it('decodes XML entities in file titles used for attachment lookup', () => { const parsed = parseMessageContent( '6Check-in Voucher (Samabe Bali Suites & Villas).pdf', 49 ) expect(parsed).toMatchObject({ type: 'share', title: 'Check-in Voucher (Samabe Bali Suites & Villas).pdf', typeVal: '6' }) }) it('does not classify empty incidental record metadata as a merged forward', () => { const parsed = parseMessageContent( '5普通分享legacy metadata', 49 ) expect(parsed).toMatchObject({ type: 'share', title: '普通分享', typeVal: '5' }) }) it('uses the quoted group member id instead of the chatroom id', () => { const parsed = parseMessageContent( '57回复内容1123456789@chatroomwxid_fixture_member被引用内容', 49 ) expect(parsed).toMatchObject({ type: 'quote', quotedSender: 'wxid_fixture_member', quotedContent: '被引用内容' }) }) it('uses an explicit unknown type for unsupported messages', () => { expect(parseMessageContent('opaque fixture payload', 999)).toEqual({ type: 'unknown', raw: 'opaque fixture payload', messageType: 999 }) }) })