diff --git a/src/main/services/chat-service.ts b/src/main/services/chat-service.ts index 10c4686..13494b3 100644 --- a/src/main/services/chat-service.ts +++ b/src/main/services/chat-service.ts @@ -179,7 +179,9 @@ export function listContacts(filter?: string): FormattedContact[] { export async function listContactsAsync(filter?: string): Promise { if (!dbRef) return [] await dbRef.getWcdb4Client().getSessionsAsync({ - hydrateDisplayNames: false, + // macOS session rows frequently contain only wxid/chatroom ids. Hydrate + // contact display names before exposing the list to the renderer. + hydrateDisplayNames: true, hydrateStatuses: true }) return listContacts(filter) diff --git a/tests/unit/chat-service.test.ts b/tests/unit/chat-service.test.ts new file mode 100644 index 0000000..a24409d --- /dev/null +++ b/tests/unit/chat-service.test.ts @@ -0,0 +1,39 @@ +import { afterEach, describe, expect, it, vi } from 'vitest' +import type { WechatDb } from '../../src/main/wechat-db' +import { listContactsAsync, setChatDb } from '../../src/main/services/chat-service' + +describe('chat service contacts', () => { + afterEach(() => setChatDb(null)) + + it('hydrates display names before returning macOS-style session ids', async () => { + const session = { + username: '57101206391@chatroom', + nickname: '57101206391@chatroom' + } + const getSessionsAsync = vi.fn(async (options: { hydrateDisplayNames?: boolean }) => { + if (options.hydrateDisplayNames) session.nickname = '测试群聊' + return [session] + }) + const fakeDb = { + close: vi.fn(), + md5: () => 'fixture-md5', + getAllGroupContacts: () => ({ fixture: session.nickname }), + getUserList: () => [ + { + m_nsUsrName: session.username, + nickname: session.nickname + } + ], + getWcdb4Client: () => ({ getSessionsAsync }) + } as unknown as WechatDb + + setChatDb(fakeDb) + const contacts = await listContactsAsync() + + expect(getSessionsAsync).toHaveBeenCalledWith({ + hydrateDisplayNames: true, + hydrateStatuses: true + }) + expect(contacts[0]?.m_nsNickName).toBe('测试群聊') + }) +})