projectMapperField.spec.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import {ComponentProps} from 'react';
  2. import selectEvent from 'react-select-event';
  3. import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  4. import FormModel from 'sentry/components/forms/model';
  5. import {RenderField} from './projectMapperField';
  6. describe('ProjectMapperField', () => {
  7. const defaultProps: ComponentProps<typeof RenderField> = {
  8. mappedDropdown: {
  9. placeholder: 'mapped-dropdown-placeholder',
  10. items: [
  11. {value: 1, label: 'label 1', url: ''},
  12. {value: 2, label: 'label 2', url: ''},
  13. {value: 3, label: 'label 3', url: ''},
  14. ],
  15. },
  16. nextButton: {
  17. text: 'next',
  18. allowedDomain: '',
  19. },
  20. sentryProjects: [
  21. {id: 23, slug: 'cool', platform: 'javascript', name: 'Cool'},
  22. {id: 24, slug: 'beans', platform: 'python', name: 'Beans'},
  23. ],
  24. model: new FormModel(),
  25. name: '',
  26. iconType: '',
  27. type: 'project_mapper',
  28. value: [[23, 2]],
  29. onChange: jest.fn(),
  30. onBlur: jest.fn(),
  31. };
  32. beforeEach(() => {
  33. jest.resetAllMocks();
  34. });
  35. it('clicking add updates values with current dropdown values', async () => {
  36. render(<RenderField {...defaultProps} />);
  37. await selectEvent.select(screen.getByText(/Sentry project/), 'beans');
  38. await selectEvent.select(screen.getByText('mapped-dropdown-placeholder'), 'label 1');
  39. userEvent.click(screen.getByLabelText('Add project'));
  40. expect(defaultProps.onBlur).toHaveBeenCalledWith(
  41. [
  42. [23, 2],
  43. [24, 1],
  44. ],
  45. []
  46. );
  47. expect(defaultProps.onChange).toHaveBeenCalledWith(
  48. [
  49. [23, 2],
  50. [24, 1],
  51. ],
  52. []
  53. );
  54. });
  55. it('can delete item', () => {
  56. render(
  57. <RenderField
  58. {...defaultProps}
  59. value={[
  60. [23, 2],
  61. [24, 1],
  62. ]}
  63. />
  64. );
  65. userEvent.click(screen.getAllByLabelText('Delete')[0]);
  66. expect(defaultProps.onBlur).toHaveBeenCalledWith([[24, 1]], []);
  67. expect(defaultProps.onChange).toHaveBeenCalledWith([[24, 1]], []);
  68. });
  69. it('allows a single Sentry project to map to multiple items but not the value', () => {
  70. render(<RenderField {...defaultProps} value={[[24, 1]]} />);
  71. // can find the same project again
  72. selectEvent.openMenu(screen.getByText(/Sentry project/));
  73. expect(screen.getAllByText('beans')).toHaveLength(2);
  74. // but not the value
  75. selectEvent.openMenu(screen.getByText('mapped-dropdown-placeholder'));
  76. expect(screen.getByText('label 1')).toBeInTheDocument();
  77. // validate we can still find 2
  78. expect(screen.getByText('label 2')).toBeInTheDocument();
  79. });
  80. });