import { fireEvent, render, screen } from '@testing-library/react';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { resetStore } from '../test/storeTestUtils';
import { useStore } from '../store/useStore';
import { Sidebar } from './Sidebar';
vi.mock('./ModelStatusBadge', () => ({
ModelStatusBadge: () =>
模型状态
,
}));
describe('Sidebar', () => {
beforeEach(() => {
resetStore();
});
it('shows admin user management only for admin users', () => {
const setActiveModule = vi.fn();
useStore.setState({ currentUser: { id: 1, username: 'admin', role: 'admin' } });
render();
const adminButton = screen.getByTitle('用户管理');
expect(adminButton.querySelector('.lucide-circle-user')).toBeInTheDocument();
fireEvent.click(adminButton);
expect(setActiveModule).toHaveBeenCalledWith('admin');
});
it('hides admin user management for non-admin users', () => {
useStore.setState({ currentUser: { id: 2, username: 'doctor', role: 'annotator' } });
render();
expect(screen.queryByTitle('用户管理')).not.toBeInTheDocument();
});
it('uses an explicit AI-styled icon for AI segmentation', () => {
useStore.setState({ currentUser: { id: 2, username: 'doctor', role: 'annotator' } });
render();
expect(screen.getByTitle('AI智能分割').querySelector('[data-testid="ai-segmentation-icon"]')).toBeInTheDocument();
});
it('uses the public logo asset for the sidebar logo', () => {
render();
expect(screen.getByAltText('Logo')).toHaveAttribute('src', expect.stringContaining('logo.png'));
});
it('uses a logout icon and prevents the logout tooltip from catching workspace hover', () => {
useStore.setState({ currentUser: { id: 1, username: 'admin', role: 'admin' } });
render();
const logoutButton = screen.getByTitle('当前用户:admin,点击退出');
expect(logoutButton.querySelector('.lucide-log-out')).toBeInTheDocument();
expect(screen.getByText('admin / 退出')).toHaveClass('pointer-events-none');
expect(screen.getByText('admin / 退出')).toHaveClass('invisible');
});
});