breadcrumbs.spec.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  2. import Breadcrumbs from 'sentry/components/breadcrumbs';
  3. describe('Breadcrumbs', () => {
  4. const routerContext = TestStubs.routerContext();
  5. afterEach(() => {
  6. jest.resetAllMocks();
  7. });
  8. function createWrapper() {
  9. return render(
  10. <Breadcrumbs
  11. crumbs={[
  12. {
  13. label: 'Test 1',
  14. to: '/test1',
  15. },
  16. {
  17. label: 'Test 2',
  18. to: '/test2',
  19. },
  20. {
  21. label: 'Test 3',
  22. to: null,
  23. },
  24. ]}
  25. />,
  26. {context: routerContext}
  27. );
  28. }
  29. it('returns null when 0 crumbs', () => {
  30. const empty = render(<Breadcrumbs crumbs={[]} />);
  31. expect(empty.container).toBeEmptyDOMElement();
  32. });
  33. it('renders crumbs with icon', () => {
  34. createWrapper();
  35. });
  36. it('generates correct links', async () => {
  37. createWrapper();
  38. await userEvent.click(screen.getByText('Test 1'));
  39. expect(routerContext.context.router.push).toHaveBeenCalledWith('/test1');
  40. await userEvent.click(screen.getByText('Test 2'));
  41. expect(routerContext.context.router.push).toHaveBeenCalledWith('/test2');
  42. });
  43. it('does not make links where no `to` is provided', async () => {
  44. createWrapper();
  45. await userEvent.click(screen.getByText('Test 3'));
  46. expect(routerContext.context.router.push).not.toHaveBeenCalled();
  47. });
  48. it('renders a crumb dropdown', async () => {
  49. const onSelect = jest.fn();
  50. render(
  51. <Breadcrumbs
  52. crumbs={[
  53. {
  54. label: 'dropdown crumb',
  55. onSelect,
  56. items: [
  57. {index: 0, value: 'item1', label: 'item1'},
  58. {index: 1, value: 'item2', label: 'item2'},
  59. {index: 2, value: 'item3', label: 'item3'},
  60. ],
  61. },
  62. {
  63. label: 'Test 2',
  64. to: '/test2',
  65. },
  66. {
  67. label: 'Test 3',
  68. to: null,
  69. },
  70. ]}
  71. />,
  72. {context: routerContext}
  73. );
  74. await userEvent.hover(screen.getByText('dropdown crumb'));
  75. const item3 = await screen.findByText('item3');
  76. expect(item3).toBeInTheDocument();
  77. await userEvent.click(item3);
  78. expect(onSelect).toHaveBeenCalledWith(expect.objectContaining({label: 'item3'}));
  79. });
  80. });