breadcrumbs.spec.jsx 2.2 KB

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