diff --git a/packages/web/src/stores/spaceStore.deletedUser.test.ts b/packages/web/src/stores/spaceStore.deletedUser.test.ts new file mode 100644 index 00000000..383aff3b --- /dev/null +++ b/packages/web/src/stores/spaceStore.deletedUser.test.ts @@ -0,0 +1,58 @@ +import { describe, it, expect, beforeEach, vi } from 'vitest'; + +vi.mock('../audio/AudioManager', () => ({ + AudioManager: { + getInstance: vi.fn().mockReturnValue({ + setOutputDevice: vi.fn(), + setVolume: vi.fn(), + }), + }, +})); + +vi.mock('./instanceStore', () => ({ + useInstanceStore: Object.assign( + (selector: (s: unknown) => unknown) => selector({ instances: [], _autoConnectDone: true }), + { + getState: () => ({ instances: [], _autoConnectDone: true }), + setState: vi.fn(), + subscribe: vi.fn(), + } + ), +})); + +vi.mock('./authStore', () => ({ + useAuthStore: Object.assign( + (selector: (s: unknown) => unknown) => selector({ user: null, token: null }), + { + getState: () => ({ user: null, token: null }), + setState: vi.fn(), + subscribe: vi.fn(), + } + ), +})); + +import { useSpaceStore } from './spaceStore'; +import type { DmChannel, User } from '@backspace/shared'; + +describe('updateUserEverywhere → DM member patch (drives the live Deleted-User update)', () => { + beforeEach(() => { + useSpaceStore.setState({ + dmChannels: [{ + id: 'd1', ownerId: null, createdAt: 0, + members: [ + { id: 'me', username: 'me' } as User, + { id: 'partner', username: 'partner', displayName: 'Partner', isDeleted: false } as User, + ], + } as DmChannel], + }); + }); + + it('rewrites the matching member to the sanitized deleted user', () => { + const deleted = { id: 'partner', username: 'Deleted User', displayName: null, isDeleted: true } as User; + useSpaceStore.getState().updateUserEverywhere(deleted); + const member = useSpaceStore.getState().dmChannels[0].members.find(m => m.id === 'partner')!; + expect(member.username).toBe('Deleted User'); + expect(member.isDeleted).toBe(true); + expect(member.displayName).toBeNull(); + }); +}); diff --git a/packages/web/src/utils/dmFormatters.test.ts b/packages/web/src/utils/dmFormatters.test.ts index f7a4171d..ecec5236 100644 --- a/packages/web/src/utils/dmFormatters.test.ts +++ b/packages/web/src/utils/dmFormatters.test.ts @@ -383,6 +383,19 @@ describe('formatDmInputLabel', () => { }); }); +describe('deleted 1-on-1 partner', () => { + const me: User = { id: 'me', username: 'me', displayName: 'Me' } as User; + const deleted: User = { id: 'x', username: 'Deleted User', displayName: null, isDeleted: true } as User; + const dm = { id: 'd', ownerId: null, members: [me, deleted], createdAt: 0 } as unknown as DmChannel; + + it('header shows Deleted User', () => { + expect(formatDmHeaderName(dm, me)).toBe('Deleted User'); + }); + it('input label points at Deleted User', () => { + expect(formatDmInputLabel(dm, me)).toBe('@Deleted User'); + }); +}); + describe('formatDmSidebarPreview — icon_changed system message', () => { it('happy path → " updated the group icon"', () => { const dm = makeGroupDm({