app-sidebar.test.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { fireEvent, screen } from '@testing-library/react';
  2. import { MemoryRouter } from 'react-router';
  3. import { afterEach, expect, test, vi } from 'vitest';
  4. import AppSidebar from '@/layouts/AppSidebar';
  5. import { renderWithProviders } from './test-utils';
  6. vi.mock('@/api/queries/useAllSettings', () => ({
  7. useAllSettings: () => ({ allSetting: {} }),
  8. }));
  9. afterEach(() => {
  10. localStorage.clear();
  11. });
  12. function renderSidebar() {
  13. return renderWithProviders(
  14. <MemoryRouter>
  15. <AppSidebar />
  16. </MemoryRouter>,
  17. );
  18. }
  19. test('keeps the sidebar expanded after pinning it from the header and restores the choice', () => {
  20. const first = renderSidebar();
  21. const sidebar = first.container.querySelector('.ant-layout-sider');
  22. const sidebarRoot = first.container.querySelector('.ant-sidebar');
  23. expect(sidebar?.classList.contains('ant-layout-sider-collapsed')).toBe(true);
  24. fireEvent.mouseEnter(sidebarRoot!);
  25. const pinButton = screen.getByRole('button', { name: 'Pin sidebar' });
  26. expect(pinButton.closest('.brand-actions')).not.toBeNull();
  27. fireEvent.click(pinButton);
  28. fireEvent.mouseLeave(sidebarRoot!);
  29. expect(sidebar?.classList.contains('ant-layout-sider-collapsed')).toBe(false);
  30. expect(sidebarRoot?.getAttribute('style')).toContain('--sider-rail: 220px');
  31. expect(localStorage.getItem('sidebar-pinned')).toBe('true');
  32. first.unmount();
  33. const second = renderSidebar();
  34. const restoredSidebar = second.container.querySelector('.ant-layout-sider');
  35. const restoredSidebarRoot = second.container.querySelector('.ant-sidebar');
  36. expect(restoredSidebar?.classList.contains('ant-layout-sider-collapsed')).toBe(false);
  37. expect(restoredSidebarRoot?.getAttribute('style')).toContain('--sider-rail: 220px');
  38. expect(screen.getByRole('button', { name: 'Pin sidebar' })).not.toBeNull();
  39. });
  40. test('returns to the compact rail after unpinning', () => {
  41. const view = renderSidebar();
  42. const sidebar = view.container.querySelector('.ant-layout-sider');
  43. const sidebarRoot = view.container.querySelector('.ant-sidebar');
  44. fireEvent.mouseEnter(sidebarRoot!);
  45. fireEvent.click(screen.getByRole('button', { name: 'Pin sidebar' }));
  46. fireEvent.click(screen.getByRole('button', { name: 'Pin sidebar' }));
  47. fireEvent.mouseLeave(sidebarRoot!);
  48. expect(sidebar?.classList.contains('ant-layout-sider-collapsed')).toBe(true);
  49. expect(sidebarRoot?.getAttribute('style')).toContain('--sider-rail: 72px');
  50. expect(localStorage.getItem('sidebar-pinned')).toBe('false');
  51. });