import { beforeEach, describe, expect, it, vi } from 'vitest' import { renderToStaticMarkup } from 'react-dom/server' import { TaskSidebar } from './TaskSidebar' const mocked = vi.hoisted(() => ({ state: {} as Record })) vi.mock('../store', () => ({ useStore: (select: (value: Record) => unknown) => select(mocked.state), store: { openInbox: vi.fn(), openFiles: vi.fn(), focusPending: vi.fn(), setUI: vi.fn(), toggleLeft: vi.fn() }, })) const member = { owner: 'bob', name: 'Bob', auth: true, systemActions: [], linkedCapabilities: { projectCreate: false, linkedActions: [], authorityEpoch: 1 } } const creator = { ...member, linkedCapabilities: { projectCreate: true, source: 'role', linkedActions: [], authorityEpoch: 1 } } function render(patch: Record) { mocked.state = { projects: [], projectsLoaded: true, projectSync: { status: 'ok', failures: 0 }, tasks: [], me: member, adminSections: [], artifacts: [], cards: [], projectCards: [], serverWorkspaces: [], rdmAuditAvailable: false, rdmCockpitAvailable: false, currentConvId: null, currentProjectId: null, ui: { theme: 'light', showArchived: false }, ...patch, } return renderToStaticMarkup() } beforeEach(() => { mocked.state = {} }) describe('EmptyListNoCreate sidebar', () => { it('shows a waiting-for-invite state without inviting a same-name project for a member without creation', () => { const html = render({}) expect(html).toContain('尚无项目:等待项目负责人邀请你加入,加入后会自动出现在这里。') expect(html).not.toContain('新建项目') expect(html).toMatch(/