dashboard.spec.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import {mountWithTheme} from 'sentry-test/enzyme';
  2. import {initializeOrg} from 'sentry-test/initializeOrg';
  3. import Dashboard from 'sentry/views/dashboardsV2/dashboard';
  4. import {DisplayType, WidgetType} from 'sentry/views/dashboardsV2/types';
  5. describe('Dashboards > Dashboard', () => {
  6. const organization = TestStubs.Organization({
  7. features: ['dashboards-basic', 'dashboards-edit'],
  8. });
  9. const mockDashboard = {
  10. dateCreated: '2021-08-10T21:20:46.798237Z',
  11. id: '1',
  12. title: 'Test Dashboard',
  13. widgets: [],
  14. };
  15. const newWidget = {
  16. title: 'Test Query',
  17. displayType: DisplayType.LINE,
  18. widgetType: WidgetType.DISCOVER,
  19. interval: '5m',
  20. queries: [
  21. {
  22. name: '',
  23. conditions: '',
  24. fields: ['count()'],
  25. aggregates: ['count()'],
  26. columns: [],
  27. orderby: '',
  28. },
  29. ],
  30. };
  31. let initialData;
  32. beforeEach(() => {
  33. initialData = initializeOrg({organization, router: {}, project: 1, projects: []});
  34. MockApiClient.addMockResponse({
  35. url: `/organizations/org-slug/dashboards/widgets/`,
  36. method: 'POST',
  37. body: [],
  38. });
  39. MockApiClient.addMockResponse({
  40. url: '/organizations/org-slug/users/',
  41. method: 'GET',
  42. body: [],
  43. });
  44. });
  45. it('dashboard adds new widget if component is mounted with newWidget prop', async () => {
  46. const mockHandleAddCustomWidget = jest.fn();
  47. const mockCallbackToUnsetNewWidget = jest.fn();
  48. const wrapper = mountWithTheme(
  49. <Dashboard
  50. paramDashboardId="1"
  51. dashboard={mockDashboard}
  52. organization={initialData.organization}
  53. isEditing={false}
  54. onUpdate={() => undefined}
  55. handleUpdateWidgetList={() => undefined}
  56. handleAddCustomWidget={mockHandleAddCustomWidget}
  57. router={initialData.router}
  58. location={initialData.location}
  59. newWidget={newWidget}
  60. widgetLimitReached={false}
  61. onSetNewWidget={mockCallbackToUnsetNewWidget}
  62. />,
  63. initialData.routerContext
  64. );
  65. await tick();
  66. wrapper.update();
  67. expect(mockHandleAddCustomWidget).toHaveBeenCalled();
  68. expect(mockCallbackToUnsetNewWidget).toHaveBeenCalled();
  69. });
  70. it('dashboard adds new widget if component updated with newWidget prop', async () => {
  71. const mockHandleAddCustomWidget = jest.fn();
  72. const mockCallbackToUnsetNewWidget = jest.fn();
  73. const wrapper = mountWithTheme(
  74. <Dashboard
  75. paramDashboardId="1"
  76. dashboard={mockDashboard}
  77. organization={initialData.organization}
  78. isEditing={false}
  79. onUpdate={() => undefined}
  80. handleUpdateWidgetList={() => undefined}
  81. handleAddCustomWidget={mockHandleAddCustomWidget}
  82. router={initialData.router}
  83. location={initialData.location}
  84. widgetLimitReached={false}
  85. onSetNewWidget={mockCallbackToUnsetNewWidget}
  86. />,
  87. initialData.routerContext
  88. );
  89. expect(mockHandleAddCustomWidget).not.toHaveBeenCalled();
  90. expect(mockCallbackToUnsetNewWidget).not.toHaveBeenCalled();
  91. wrapper.setProps({newWidget});
  92. await tick();
  93. wrapper.update();
  94. expect(mockHandleAddCustomWidget).toHaveBeenCalled();
  95. expect(mockCallbackToUnsetNewWidget).toHaveBeenCalled();
  96. });
  97. it('dashboard does not try to add new widget if no newWidget', async () => {
  98. const mockHandleAddCustomWidget = jest.fn();
  99. const mockCallbackToUnsetNewWidget = jest.fn();
  100. const wrapper = mountWithTheme(
  101. <Dashboard
  102. paramDashboardId="1"
  103. dashboard={mockDashboard}
  104. organization={initialData.organization}
  105. isEditing={false}
  106. onUpdate={() => undefined}
  107. handleUpdateWidgetList={() => undefined}
  108. handleAddCustomWidget={mockHandleAddCustomWidget}
  109. router={initialData.router}
  110. location={initialData.location}
  111. widgetLimitReached={false}
  112. onSetNewWidget={mockCallbackToUnsetNewWidget}
  113. />,
  114. initialData.routerContext
  115. );
  116. await tick();
  117. wrapper.update();
  118. expect(mockHandleAddCustomWidget).not.toHaveBeenCalled();
  119. expect(mockCallbackToUnsetNewWidget).not.toHaveBeenCalled();
  120. });
  121. it('displays widgets with drag handle when in edit mode', () => {
  122. const dashboardWithOneWidget = {...mockDashboard, widgets: [newWidget]};
  123. const wrapper = mountWithTheme(
  124. <Dashboard
  125. paramDashboardId="1"
  126. dashboard={dashboardWithOneWidget}
  127. organization={initialData.organization}
  128. onUpdate={() => undefined}
  129. handleUpdateWidgetList={() => undefined}
  130. handleAddCustomWidget={() => undefined}
  131. router={initialData.router}
  132. location={initialData.location}
  133. widgetLimitReached={false}
  134. isEditing
  135. />,
  136. initialData.routerContext
  137. );
  138. expect(wrapper.find('GrabbableButton')).toHaveLength(1);
  139. });
  140. });