createAlertButton.spec.jsx 3.5 KB

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