createAlertButton.spec.jsx 3.6 KB

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