projectAlertRuleDetails.spec.jsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import React from 'react';
  2. import {mount} from 'enzyme';
  3. import {browserHistory} from 'react-router';
  4. import ProjectAlertRuleDetails from 'app/views/settings/projectAlerts/projectAlertRuleDetails';
  5. import {selectByValue} from 'app-test/helpers/select';
  6. jest.mock('jquery');
  7. jest.unmock('app/utils/recreateRoute');
  8. describe('ProjectAlertRuleDetails', function() {
  9. const projectAlertRuleDetailsRoutes = [
  10. {
  11. path: '/',
  12. },
  13. {
  14. path: '/settings/',
  15. name: 'Settings',
  16. indexRoute: {},
  17. },
  18. {
  19. name: 'Organization',
  20. path: ':orgId/',
  21. },
  22. {
  23. name: 'Project',
  24. path: ':projectId/',
  25. },
  26. {},
  27. {
  28. indexRoute: {name: 'General'},
  29. },
  30. {
  31. name: 'Alerts',
  32. path: 'alerts/',
  33. indexRoute: {},
  34. },
  35. {
  36. path: 'rules/',
  37. name: 'Rules',
  38. component: null,
  39. indexRoute: {},
  40. childRoutes: [{path: 'new/', name: 'New'}, {path: ':ruleId/', name: 'Edit'}],
  41. },
  42. {path: ':ruleId/', name: 'Edit'},
  43. ];
  44. beforeEach(async function() {
  45. browserHistory.replace = jest.fn();
  46. MockApiClient.addMockResponse({
  47. url: '/projects/org-slug/project-slug/rules/configuration/',
  48. body: TestStubs.ProjectAlertRuleConfiguration(),
  49. });
  50. MockApiClient.addMockResponse({
  51. url: '/projects/org-slug/project-slug/rules/1/',
  52. body: TestStubs.ProjectAlertRule(),
  53. });
  54. MockApiClient.addMockResponse({
  55. url: '/projects/org-slug/project-slug/environments/',
  56. body: TestStubs.Environments(),
  57. });
  58. });
  59. afterEach(function() {
  60. MockApiClient.clearMockResponses();
  61. });
  62. describe('New alert rule', function() {
  63. let wrapper, mock;
  64. beforeEach(async function() {
  65. mock = MockApiClient.addMockResponse({
  66. url: '/projects/org-slug/project-slug/rules/',
  67. method: 'POST',
  68. body: TestStubs.ProjectAlertRule(),
  69. });
  70. wrapper = mount(
  71. <ProjectAlertRuleDetails
  72. routes={projectAlertRuleDetailsRoutes}
  73. params={{orgId: 'org-slug', projectId: 'project-slug'}}
  74. />,
  75. TestStubs.routerContext()
  76. );
  77. await tick();
  78. wrapper.update();
  79. });
  80. it('sets defaults', function() {
  81. const selects = wrapper.find('SelectControl');
  82. expect(selects.first().props().value).toBe('all');
  83. expect(selects.last().props().value).toBe(30);
  84. });
  85. describe('saves', function() {
  86. let name;
  87. beforeEach(function() {
  88. name = wrapper.find('input').first();
  89. name.simulate('change', {target: {value: 'My rule'}});
  90. wrapper.find('form').simulate('submit');
  91. });
  92. it('sends create request on save', function() {
  93. expect(mock).toHaveBeenCalled();
  94. expect(mock.mock.calls[0][1]).toMatchObject({
  95. data: {
  96. name: 'My rule',
  97. },
  98. });
  99. });
  100. it('updates URL', function() {
  101. const url = '/settings/org-slug/project-slug/alerts/rules/1/';
  102. expect(browserHistory.replace).toHaveBeenCalledWith(url);
  103. });
  104. });
  105. });
  106. describe('Edit alert rule', function() {
  107. let wrapper, mock;
  108. const endpoint = '/projects/org-slug/project-slug/rules/1/';
  109. beforeEach(async function() {
  110. mock = MockApiClient.addMockResponse({
  111. url: endpoint,
  112. method: 'PUT',
  113. body: TestStubs.ProjectAlertRule(),
  114. });
  115. wrapper = mount(
  116. <ProjectAlertRuleDetails
  117. routes={projectAlertRuleDetailsRoutes}
  118. params={{orgId: 'org-slug', projectId: 'project-slug', ruleId: '1'}}
  119. />,
  120. TestStubs.routerContext()
  121. );
  122. await tick();
  123. wrapper.update();
  124. });
  125. it('updates', function() {
  126. const name = wrapper.find('input').first();
  127. name.simulate('change', {target: {value: 'My rule'}});
  128. wrapper.find('form').simulate('submit');
  129. expect(mock).toHaveBeenCalled();
  130. });
  131. it('does not update URL', function() {
  132. expect(browserHistory.replace).not.toHaveBeenCalled();
  133. });
  134. it('sends correct environment value', function() {
  135. selectByValue(wrapper, 'production', {name: 'environment'});
  136. expect(
  137. wrapper.find('SelectField[name="environment"] Select').prop('value')
  138. ).toEqual(expect.objectContaining({value: 'production'}));
  139. wrapper.find('form').simulate('submit');
  140. expect(mock).toHaveBeenCalledWith(
  141. endpoint,
  142. expect.objectContaining({
  143. data: expect.objectContaining({environment: 'production'}),
  144. })
  145. );
  146. });
  147. it('strips environment value if "All environments" is selected', async function() {
  148. selectByValue(wrapper, '__all_environments__', {name: 'environment'});
  149. wrapper.find('form').simulate('submit');
  150. expect(mock).not.toHaveBeenCalledWith(
  151. endpoint,
  152. expect.objectContaining({
  153. data: expect.objectContaining({environment: '__all_environments__'}),
  154. })
  155. );
  156. });
  157. });
  158. });