createAlertButton.spec.jsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import {Organization} from 'fixtures/js-stubs/organization';
  2. import {Project} from 'fixtures/js-stubs/project';
  3. import {routerContext} from 'fixtures/js-stubs/routerContext';
  4. import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  5. import {navigateTo} from 'sentry/actionCreators/navigation';
  6. import CreateAlertButton, {
  7. CreateAlertFromViewButton,
  8. } from 'sentry/components/createAlertButton';
  9. import GuideStore from 'sentry/stores/guideStore';
  10. import EventView from 'sentry/utils/discover/eventView';
  11. import {DEFAULT_EVENT_VIEW} from 'sentry/views/eventsV2/data';
  12. const onClickMock = jest.fn();
  13. const context = routerContext();
  14. jest.mock('sentry/actionCreators/navigation');
  15. function renderComponent(organization, eventView) {
  16. return render(
  17. <CreateAlertFromViewButton
  18. location={location}
  19. organization={organization}
  20. eventView={eventView}
  21. projects={[Project()]}
  22. onClick={onClickMock}
  23. />,
  24. {context}
  25. );
  26. }
  27. function renderSimpleComponent(organization, extraProps) {
  28. return render(<CreateAlertButton organization={organization} {...extraProps} />);
  29. }
  30. describe('CreateAlertFromViewButton', () => {
  31. const organization = Organization();
  32. afterEach(() => {
  33. jest.resetAllMocks();
  34. });
  35. it('should trigger onClick callback', () => {
  36. const eventView = EventView.fromSavedQuery({
  37. ...DEFAULT_EVENT_VIEW,
  38. query: 'event.type:error',
  39. projects: [2],
  40. });
  41. renderComponent(organization, eventView);
  42. userEvent.click(screen.getByRole('button', {name: 'Create Alert'}));
  43. expect(onClickMock).toHaveBeenCalledTimes(1);
  44. });
  45. it('disables the create alert button for members', () => {
  46. const eventView = EventView.fromSavedQuery({
  47. ...DEFAULT_EVENT_VIEW,
  48. });
  49. const noAccessOrg = {
  50. ...organization,
  51. access: [],
  52. };
  53. renderComponent(noAccessOrg, eventView);
  54. expect(screen.getByRole('button', {name: 'Create Alert'})).toBeDisabled();
  55. });
  56. it('shows a guide for members', () => {
  57. const noAccessOrg = {
  58. ...organization,
  59. access: [],
  60. };
  61. renderSimpleComponent(noAccessOrg, {
  62. showPermissionGuide: true,
  63. });
  64. expect(GuideStore.state.anchors).toEqual(new Set(['alerts_write_member']));
  65. });
  66. it('shows a guide for owners/admins', () => {
  67. const adminAccessOrg = {
  68. ...organization,
  69. access: ['org:write'],
  70. };
  71. renderSimpleComponent(adminAccessOrg, {
  72. showPermissionGuide: true,
  73. });
  74. expect(GuideStore.state.anchors).toEqual(new Set(['alerts_write_owner']));
  75. });
  76. it('redirects to alert wizard with no project', () => {
  77. renderSimpleComponent(organization);
  78. userEvent.click(screen.getByRole('button'));
  79. expect(navigateTo).toHaveBeenCalledWith(
  80. `/organizations/org-slug/alerts/wizard/?`,
  81. undefined
  82. );
  83. });
  84. it('redirects to alert wizard with a project', () => {
  85. renderSimpleComponent(organization, {
  86. projectSlug: 'proj-slug',
  87. });
  88. expect(screen.getByRole('button')).toHaveAttribute(
  89. 'href',
  90. '/organizations/org-slug/alerts/wizard/?project=proj-slug'
  91. );
  92. });
  93. it('removes a duplicate project filter', () => {
  94. const eventView = EventView.fromSavedQuery({
  95. ...DEFAULT_EVENT_VIEW,
  96. query: 'event.type:error project:project-slug',
  97. projects: [2],
  98. });
  99. renderComponent(organization, eventView);
  100. userEvent.click(screen.getByRole('button'));
  101. expect(context.context.router.push).toHaveBeenCalledWith({
  102. pathname: `/organizations/org-slug/alerts/new/metric/`,
  103. query: expect.objectContaining({
  104. query: 'event.type:error ',
  105. project: 'project-slug',
  106. }),
  107. });
  108. });
  109. });