foreman-tasks 1.1.3 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/README.md +2 -0
  4. data/app/controllers/foreman_tasks/api/tasks_controller.rb +33 -1
  5. data/app/controllers/foreman_tasks/tasks_controller.rb +9 -14
  6. data/app/lib/actions/proxy_action.rb +1 -1
  7. data/app/models/foreman_tasks/recurring_logic.rb +3 -3
  8. data/app/models/foreman_tasks/task.rb +4 -0
  9. data/app/models/foreman_tasks/task/dynflow_task.rb +3 -1
  10. data/app/models/setting/foreman_tasks.rb +1 -1
  11. data/app/services/ui_notifications/tasks/task_bulk_stop.rb +36 -0
  12. data/app/views/foreman_tasks/api/tasks/details.json.rabl +0 -1
  13. data/app/views/foreman_tasks/api/tasks/show.json.rabl +2 -0
  14. data/config/routes.rb +1 -0
  15. data/db/migrate/20200517215015_rename_bookmarks_controller.rb +35 -0
  16. data/db/migrate/20200519093217_drop_dynflow_allow_dangerous_actions_setting.foreman_tasks.rb +5 -0
  17. data/db/migrate/20200611090846_add_task_lock_index_on_resource_type_and_task_id.rb +1 -1
  18. data/db/seeds.d/30-notification_blueprints.rb +7 -0
  19. data/lib/foreman_tasks/engine.rb +2 -7
  20. data/lib/foreman_tasks/version.rb +1 -1
  21. data/locale/action_names.rb +1 -1
  22. data/locale/en/LC_MESSAGES/foreman_tasks.mo +0 -0
  23. data/locale/en/foreman_tasks.po +270 -54
  24. data/locale/foreman_tasks.pot +630 -292
  25. data/locale/fr/LC_MESSAGES/foreman_tasks.mo +0 -0
  26. data/locale/fr/foreman_tasks.po +817 -0
  27. data/locale/ja/LC_MESSAGES/foreman_tasks.mo +0 -0
  28. data/locale/ja/foreman_tasks.po +817 -0
  29. data/locale/zh_CN/LC_MESSAGES/foreman_tasks.mo +0 -0
  30. data/locale/zh_CN/foreman_tasks.po +816 -0
  31. data/package.json +1 -0
  32. data/script/npm_link_foreman_js.sh +26 -0
  33. data/test/unit/recurring_logic_test.rb +6 -0
  34. data/webpack/ForemanTasks/Components/TaskActions/TaskAction.test.js +60 -0
  35. data/webpack/ForemanTasks/Components/{TasksTable/TasksTableActionHelpers.js → TaskActions/TaskActionHelpers.js} +21 -6
  36. data/webpack/ForemanTasks/Components/{TasksTable/__tests__/TasksTableActionHelpers.test.js → TaskActions/TaskActionHelpers.test.js} +2 -2
  37. data/webpack/ForemanTasks/Components/TaskActions/TaskActionsConstants.js +16 -0
  38. data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.js +60 -0
  39. data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.test.js +14 -0
  40. data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/TaskAction.test.js.snap +233 -0
  41. data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/UnlockModals.test.js.snap +25 -0
  42. data/webpack/ForemanTasks/Components/TaskActions/index.js +115 -0
  43. data/webpack/ForemanTasks/Components/TaskDetails/Components/RunningSteps.js +17 -3
  44. data/webpack/ForemanTasks/Components/TaskDetails/Components/Task.js +149 -167
  45. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/RunningSteps.test.js +8 -1
  46. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/Task.test.js +68 -3
  47. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskInfo.test.js +0 -1
  48. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/RunningSteps.test.js.snap +1 -1
  49. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/Task.test.js.snap +124 -76
  50. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.js +35 -5
  51. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.scss +3 -14
  52. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsActions.js +40 -16
  53. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsConstants.js +3 -4
  54. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsReducer.js +0 -6
  55. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsSelectors.js +4 -10
  56. data/webpack/ForemanTasks/Components/TaskDetails/TasksDetailsHelper.js +6 -1
  57. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.fixtures.js +8 -0
  58. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.test.js +7 -1
  59. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetailsActions.test.js +18 -2
  60. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetails.test.js.snap +30 -13
  61. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetailsActions.test.js.snap +91 -0
  62. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/integration.test.js +13 -4
  63. data/webpack/ForemanTasks/Components/TaskDetails/index.js +6 -8
  64. data/webpack/ForemanTasks/Components/TasksDashboard/TasksDashboardActions.js +1 -1
  65. data/webpack/ForemanTasks/Components/TasksDashboard/__tests__/TasksDashboardActions.test.js +2 -2
  66. data/webpack/ForemanTasks/Components/TasksTable/Components/ActionSelectButton.js +14 -1
  67. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModal.js +83 -0
  68. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalActions.js +106 -0
  69. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalReducer.js +38 -0
  70. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalSelectors.js +46 -0
  71. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModal.test.js +36 -0
  72. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalActions.test.js +205 -0
  73. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalReducer.test.js +27 -0
  74. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalSelectors.test.js +55 -0
  75. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModal.test.js.snap +41 -0
  76. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalReducer.test.js.snap +19 -0
  77. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalSelectors.test.js.snap +32 -0
  78. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/index.js +29 -0
  79. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ActionSelectButton.test.js +1 -0
  80. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ActionSelectButton.test.js.snap +11 -0
  81. data/webpack/ForemanTasks/Components/TasksTable/TasksBulkActions.js +135 -35
  82. data/webpack/ForemanTasks/Components/TasksTable/TasksTable.js +13 -9
  83. data/webpack/ForemanTasks/Components/TasksTable/TasksTableActions.js +26 -66
  84. data/webpack/ForemanTasks/Components/TasksTable/TasksTableConstants.js +10 -12
  85. data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +30 -96
  86. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSchema.js +2 -2
  87. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSelectors.js +8 -4
  88. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksBulkActions.test.js +50 -2
  89. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTable.fixtures.js +3 -12
  90. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableActions.test.js +22 -26
  91. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTablePage.test.js +2 -1
  92. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/SubTasksPage.test.js.snap +3 -14
  93. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksBulkActions.test.js.snap +155 -0
  94. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksIndexPage.test.js.snap +3 -14
  95. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTableActions.test.js.snap +17 -124
  96. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +63 -133
  97. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/actionCellFormatter.test.js.snap +1 -0
  98. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/selectionCellFormatter.test.js.snap +2 -0
  99. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/actionCellFormatter.test.js +1 -1
  100. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/selectionCellFormatter.test.js +1 -1
  101. data/webpack/ForemanTasks/Components/TasksTable/formatters/actionCellFormatter.js +10 -7
  102. data/webpack/ForemanTasks/Components/TasksTable/formatters/selectionCellFormatter.js +7 -0
  103. data/webpack/ForemanTasks/Components/TasksTable/index.js +2 -2
  104. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.js +55 -19
  105. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.test.js +75 -19
  106. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ActionButton.test.js.snap +88 -21
  107. data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.scss +9 -0
  108. data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.test.js +44 -0
  109. data/webpack/ForemanTasks/Components/common/ClickConfirmation/__snapshots__/ClickConfirmation.test.js.snap +52 -0
  110. data/webpack/ForemanTasks/Components/common/ClickConfirmation/index.js +59 -66
  111. data/webpack/ForemanTasks/Components/common/{ToastTypesConstants.js → ToastsHelpers/ToastTypesConstants.js} +0 -0
  112. data/webpack/ForemanTasks/Components/common/ToastsHelpers/index.js +15 -0
  113. data/webpack/ForemanTasks/ForemanTasksReducers.js +2 -0
  114. data/webpack/ForemanTasks/Routes/ForemanTasksRoutes.test.js +2 -1
  115. data/webpack/__mocks__/foremanReact/components/ForemanModal/ForemanModalHooks.js +2 -2
  116. data/webpack/__mocks__/foremanReact/components/ForemanModal/index.js +17 -3
  117. data/webpack/__mocks__/foremanReact/components/common/ActionButtons/ActionButtons.js +3 -0
  118. data/webpack/__mocks__/foremanReact/{API.js → redux/API.js} +1 -1
  119. metadata +45 -25
  120. data/webpack/ForemanTasks/Components/TasksTable/Components/CancelConfirm.js +0 -53
  121. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmationModals.js +0 -56
  122. data/webpack/ForemanTasks/Components/TasksTable/Components/ResumeConfirm.js +0 -52
  123. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/CancelConfirm.test.js +0 -26
  124. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ConfirmationModals.test.js +0 -24
  125. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ResumeConfirm.test.js +0 -26
  126. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/CancelConfirm.test.js.snap +0 -65
  127. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ConfirmationModals.test.js.snap +0 -30
  128. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ResumeConfirm.test.js.snap +0 -63
  129. data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.js +0 -23
  130. data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.test.js +0 -26
  131. data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.js +0 -23
  132. data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.test.js +0 -27
  133. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/CancelButton.test.js.snap +0 -15
  134. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ResumeButton.test.js.snap +0 -15
@@ -10,20 +10,6 @@
10
10
  .container {
11
11
  margin: 0;
12
12
  }
13
- /*
14
- * This is a manifest file that'll be compiled into application.css, which will include all the files
15
- * listed below.
16
- *
17
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
18
- * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
19
- *
20
- * You're free to add application-wide styles to this file and they'll appear at the top of the
21
- * compiled file, but it's generally better to create a new file per style scope.
22
- *
23
- *= require_self
24
- *= require_tree .
25
- */
26
-
27
13
  .spin {
28
14
  -webkit-animation: spin 1s infinite linear;
29
15
  -moz-animation: spin 1s infinite linear;
@@ -60,4 +46,7 @@
60
46
  transform: rotate(360deg);
61
47
  }
62
48
  }
49
+ .dynflow-button > span {
50
+ pointer-events: auto;
51
+ }
63
52
  }
@@ -1,21 +1,25 @@
1
- import API from 'foremanReact/API';
1
+ import { API } from 'foremanReact/redux/API';
2
2
  import {
3
3
  showLoading,
4
4
  hideLoading,
5
5
  } from 'foremanReact/components/Layout/LayoutActions';
6
+ import { addToast } from 'foremanReact/redux/actions/toasts';
7
+ import { translate as __ } from 'foremanReact/common/I18n';
6
8
  import {
7
9
  FOREMAN_TASK_DETAILS_FETCH_TASK_REQUEST,
8
10
  FOREMAN_TASK_DETAILS_FETCH_TASK_SUCCESS,
9
11
  FOREMAN_TASK_DETAILS_FETCH_TASK_FAILURE,
10
12
  FOREMAN_TASK_DETAILS_STOP_POLLING,
11
13
  FOREMAN_TASK_DETAILS_START_POLLING,
12
- FOREMAN_TASK_DETAILS_TOGGLE_UNLOCK_MODAL,
13
- FOREMAN_TASK_DETAILS_TOGGLE_FORCE_UNLOCK_MODAL,
14
+ TASK_STEP_CANCEL_REQUEST,
15
+ TASK_STEP_CANCEL_FAILURE,
16
+ TASK_STEP_CANCEL_SUCCESS,
14
17
  } from './TaskDetailsConstants';
15
18
  import {
16
- cancelTaskRequest,
17
- resumeTaskRequest,
18
- } from '../TasksTable/TasksTableActions';
19
+ errorToastData,
20
+ infoToastData,
21
+ successToastData,
22
+ } from '../common/ToastsHelpers';
19
23
 
20
24
  export const taskReloadStop = timeoutId => {
21
25
  if (timeoutId) {
@@ -52,7 +56,9 @@ export const refetchTaskDetails = (id, loading) => dispatch => {
52
56
 
53
57
  const reloadTasksDetails = async (id, dispatch) => {
54
58
  try {
55
- const { data } = await API.get(`/foreman_tasks/api/tasks/${id}/details`);
59
+ const { data } = await API.get(
60
+ `/foreman_tasks/api/tasks/${id}/details?include_permissions`
61
+ );
56
62
  dispatch(requestSuccess(data));
57
63
  } catch (error) {
58
64
  dispatch(requestFailure(error));
@@ -79,7 +85,9 @@ const getTasksDetails = async (
79
85
  refetchTaskDetailsAction
80
86
  ) => {
81
87
  try {
82
- const { data } = await API.get(`/foreman_tasks/api/tasks/${id}/details`);
88
+ const { data } = await API.get(
89
+ `/foreman_tasks/api/tasks/${id}/details?include_permissions`
90
+ );
83
91
  dispatch(requestSuccess(data));
84
92
  if (data.state !== 'stopped') {
85
93
  dispatch(taskReloadStart(timeoutId, refetchTaskDetailsAction, id));
@@ -105,11 +113,27 @@ const requestFailure = error => ({
105
113
  payload: error,
106
114
  });
107
115
 
108
- export const toggleUnlockModal = () => ({
109
- type: FOREMAN_TASK_DETAILS_TOGGLE_UNLOCK_MODAL,
110
- });
111
- export const toggleForceUnlockModal = () => ({
112
- type: FOREMAN_TASK_DETAILS_TOGGLE_FORCE_UNLOCK_MODAL,
113
- });
114
-
115
- export { cancelTaskRequest, resumeTaskRequest };
116
+ export const cancelStep = (taskId, stepId) => async dispatch => {
117
+ dispatch({ type: TASK_STEP_CANCEL_REQUEST });
118
+ dispatch(addToast(infoToastData(`${__('Trying to cancel step')} ${stepId}`)));
119
+ try {
120
+ await API.post(
121
+ `/foreman_tasks/tasks/${taskId}/cancel_step?step_id=${stepId}`
122
+ );
123
+ dispatch({ type: TASK_STEP_CANCEL_SUCCESS });
124
+ dispatch(addToast(successToastData(`${stepId} {__('Step Canceled')}`)));
125
+ } catch (error) {
126
+ dispatch({ type: TASK_STEP_CANCEL_FAILURE, payload: error });
127
+ dispatch(
128
+ addToast(
129
+ errorToastData(
130
+ `${__('Could not cancel step.')} ${__(
131
+ 'Error:'
132
+ )} ${stepId} ${error.response &&
133
+ error.response.data &&
134
+ error.response.data.error}`
135
+ )
136
+ )
137
+ );
138
+ }
139
+ };
@@ -12,7 +12,6 @@ export const FOREMAN_TASK_DETAILS_STOP_POLLING =
12
12
  export const FOREMAN_TASK_DETAILS_START_POLLING =
13
13
  'FOREMAN_TASK_DETAILS_START_POLLING';
14
14
 
15
- export const FOREMAN_TASK_DETAILS_TOGGLE_UNLOCK_MODAL =
16
- 'FOREMAN_TASK_DETAILS_TOGGLE_UNLOCK_MODAL';
17
- export const FOREMAN_TASK_DETAILS_TOGGLE_FORCE_UNLOCK_MODAL =
18
- 'FOREMAN_TASK_DETAILS_TOGGLE_FORCE_UNLOCK_MODAL';
15
+ export const TASK_STEP_CANCEL_REQUEST = 'TASK_STEP_CANCEL_REQUEST';
16
+ export const TASK_STEP_CANCEL_FAILURE = 'TASK_STEP_CANCEL_FAILURE';
17
+ export const TASK_STEP_CANCEL_SUCCESS = 'TASK_STEP_CANCEL_SUCCESS';
@@ -4,8 +4,6 @@ import {
4
4
  FOREMAN_TASK_DETAILS_FETCH_TASK_SUCCESS,
5
5
  FOREMAN_TASK_DETAILS_STOP_POLLING,
6
6
  FOREMAN_TASK_DETAILS_START_POLLING,
7
- FOREMAN_TASK_DETAILS_TOGGLE_UNLOCK_MODAL,
8
- FOREMAN_TASK_DETAILS_TOGGLE_FORCE_UNLOCK_MODAL,
9
7
  } from './TaskDetailsConstants';
10
8
 
11
9
  const initialState = Immutable({});
@@ -34,10 +32,6 @@ export default (state = initialState, action) => {
34
32
  case FOREMAN_TASK_DETAILS_START_POLLING:
35
33
  clearTimeout(state.timeoutId);
36
34
  return state.merge({ taskReload: true, timeoutId: payload.timeoutId });
37
- case FOREMAN_TASK_DETAILS_TOGGLE_UNLOCK_MODAL:
38
- return state.set('showUnlockModal', !state.showUnlockModal);
39
- case FOREMAN_TASK_DETAILS_TOGGLE_FORCE_UNLOCK_MODAL:
40
- return state.set('showForceUnlockModal', !state.showForceUnlockModal);
41
35
  default:
42
36
  return state;
43
37
  }
@@ -30,7 +30,7 @@ export const selectErrors = state => {
30
30
 
31
31
  export const selectProgress = state =>
32
32
  selectTaskDetails(state).progress
33
- ? parseFloat((selectTaskDetails(state).progress * 100).toFixed(2))
33
+ ? Math.trunc(selectTaskDetails(state).progress * 100)
34
34
  : 0;
35
35
 
36
36
  export const selectUsername = state =>
@@ -52,9 +52,6 @@ export const selectHelp = state => selectTaskDetails(state).help || null;
52
52
  export const selectHasSubTasks = state =>
53
53
  selectTaskDetails(state).has_sub_tasks || false;
54
54
 
55
- export const selectAllowDangerousActions = state =>
56
- selectTaskDetails(state).allowDangerousActions || false;
57
-
58
55
  export const selectLocks = state => selectTaskDetails(state).locks || [];
59
56
 
60
57
  export const selectUsernamePath = state =>
@@ -75,14 +72,11 @@ export const selectTaskReload = state =>
75
72
  export const selectParentTask = state =>
76
73
  selectTaskDetails(state).parent_task_id || '';
77
74
 
78
- export const selectShowUnlockModal = state =>
79
- selectTaskDetails(state).showUnlockModal || false;
80
-
81
- export const selectShowForceUnlockModal = state =>
82
- selectTaskDetails(state).showForceUnlockModal || false;
83
-
84
75
  export const selectExternalId = state =>
85
76
  selectTaskDetails(state).external_id || null;
86
77
 
87
78
  export const selectDynflowEnableConsole = state =>
88
79
  selectTaskDetails(state).dynflow_enable_console || false;
80
+
81
+ export const selectCanEdit = state =>
82
+ selectTaskDetails(state).can_edit || false;
@@ -1 +1,6 @@
1
- export const getTaskID = () => window.location.pathname.split('/').slice(-1)[0];
1
+ // Get Task ID from URL. Split url by '/', filter non-empty values and get Task ID.
2
+ export const getTaskID = () =>
3
+ window.location.pathname
4
+ .split('/')
5
+ .filter(i => i)
6
+ .slice(-1)[0];
@@ -0,0 +1,8 @@
1
+ export const minProps = {
2
+ cancelStep: jest.fn(),
3
+ taskReloadStop: jest.fn(),
4
+ taskReloadStart: jest.fn(),
5
+ refetchTaskDetails: jest.fn(),
6
+ fetchTaskDetails: jest.fn(),
7
+ taskProgressToggle: jest.fn(),
8
+ };
@@ -1,11 +1,17 @@
1
1
  import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
2
2
 
3
3
  import TaskDetails from '../TaskDetails';
4
+ import { minProps } from './TaskDetails.fixtures';
4
5
 
5
6
  const fixtures = {
6
- 'render without Props': {},
7
+ 'render with min Props': minProps,
7
8
  };
8
9
 
10
+ delete window.location;
11
+ window.location = new URL(
12
+ 'https://foreman.com/foreman_tasks/tasks/a15dd820-32f1-4ced-9ab7-c0fab8234c47/'
13
+ );
14
+
9
15
  describe('TaskDetails', () => {
10
16
  describe('rendering', () =>
11
17
  testComponentSnapshotsWithFixtures(TaskDetails, fixtures));
@@ -1,19 +1,35 @@
1
1
  import { testActionSnapshotWithFixtures } from '@theforeman/test';
2
- import API from 'foremanReact/API';
2
+ import { API } from 'foremanReact/redux/API';
3
3
  import {
4
4
  taskReloadStop,
5
5
  taskReloadStart,
6
6
  fetchTaskDetails,
7
+ cancelStep,
7
8
  } from '../TaskDetailsActions';
8
9
 
9
- jest.mock('foremanReact/API');
10
+ jest.mock('foremanReact/redux/API');
10
11
 
11
12
  API.get.mockImplementation(async () => ({ data: 'some-data' }));
13
+ API.post.mockImplementation(async () => ({ data: 'some-data' }));
12
14
 
13
15
  const fixtures = {
14
16
  'should start reload': () => taskReloadStart(1),
15
17
  'should stop reload': () => taskReloadStop(2),
16
18
  'should fetch-task-details and success': () => fetchTaskDetails(),
19
+ 'should cancelStep and success': () => cancelStep('task-id', 'step-id'),
20
+
21
+ 'should fetch-task-details and fail': () => {
22
+ API.get.mockImplementationOnce(() =>
23
+ Promise.reject(new Error('Network Error'))
24
+ );
25
+ return fetchTaskDetails();
26
+ },
27
+ 'should cancelStep and fail': () => {
28
+ API.post.mockImplementationOnce(() =>
29
+ Promise.reject(new Error('Network Error'))
30
+ );
31
+ return cancelStep('task-id', 'step-id');
32
+ },
17
33
  };
18
34
 
19
35
  describe('TaskDetails - Actions', () =>
@@ -1,6 +1,6 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`TaskDetails rendering render without Props 1`] = `
3
+ exports[`TaskDetails rendering render with min Props 1`] = `
4
4
  <div
5
5
  className="task-details-react well"
6
6
  >
@@ -15,7 +15,8 @@ exports[`TaskDetails rendering render without Props 1`] = `
15
15
  >
16
16
  <Task
17
17
  action=""
18
- allowDangerousActions={false}
18
+ canEdit={false}
19
+ cancelStep={[MockFunction]}
19
20
  cancelTaskRequest={[Function]}
20
21
  cancellable={false}
21
22
  dynflowEnableConsole={false}
@@ -24,33 +25,46 @@ exports[`TaskDetails rendering render without Props 1`] = `
24
25
  executionPlan={Object {}}
25
26
  externalId=""
26
27
  failedSteps={Array []}
27
- fetchTaskDetails={[Function]}
28
+ fetchTaskDetails={
29
+ [MockFunction] {
30
+ "calls": Array [
31
+ Array [
32
+ "a15dd820-32f1-4ced-9ab7-c0fab8234c47",
33
+ null,
34
+ [MockFunction],
35
+ ],
36
+ ],
37
+ "results": Array [
38
+ Object {
39
+ "type": "return",
40
+ "value": undefined,
41
+ },
42
+ ],
43
+ }
44
+ }
28
45
  hasSubTasks={false}
29
46
  help=""
30
- id=""
47
+ id="a15dd820-32f1-4ced-9ab7-c0fab8234c47"
31
48
  input={Array []}
32
49
  label=""
33
50
  locks={Array []}
34
51
  output={Object {}}
35
52
  parentTask=""
36
53
  progress={0}
37
- refetchTaskDetails={[Function]}
54
+ refetchTaskDetails={[MockFunction]}
38
55
  result="error"
39
56
  resumable={false}
40
57
  resumeTaskRequest={[Function]}
41
58
  runningSteps={Array []}
42
- showForceUnlockModal={false}
43
- showUnlockModal={false}
44
59
  startAt=""
45
60
  startBefore=""
46
61
  startedAt=""
47
62
  state=""
63
+ taskProgressToggle={[Function]}
48
64
  taskReload={false}
49
- taskReloadStart={[Function]}
50
- taskReloadStop={[Function]}
65
+ taskReloadStart={[MockFunction]}
66
+ taskReloadStop={[MockFunction]}
51
67
  timeoutId={null}
52
- toggleForceUnlockModal={[Function]}
53
- toggleUnlockModal={[Function]}
54
68
  username=""
55
69
  usernamePath=""
56
70
  />
@@ -60,8 +74,11 @@ exports[`TaskDetails rendering render without Props 1`] = `
60
74
  title="Running Steps"
61
75
  >
62
76
  <RunningSteps
63
- executionPlan={Object {}}
77
+ cancelStep={[MockFunction]}
78
+ id="a15dd820-32f1-4ced-9ab7-c0fab8234c47"
64
79
  runningSteps={Array []}
80
+ taskProgressToggle={[Function]}
81
+ taskReload={false}
65
82
  />
66
83
  </Tab>
67
84
  <Tab
@@ -88,7 +105,7 @@ exports[`TaskDetails rendering render without Props 1`] = `
88
105
  <Raw
89
106
  endedAt=""
90
107
  externalId=""
91
- id=""
108
+ id="a15dd820-32f1-4ced-9ab7-c0fab8234c47"
92
109
  input={Array []}
93
110
  label=""
94
111
  output={Object {}}
@@ -1,5 +1,96 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
+ exports[`TaskDetails - Actions should cancelStep and fail 1`] = `
4
+ Array [
5
+ Array [
6
+ Object {
7
+ "type": "TASK_STEP_CANCEL_REQUEST",
8
+ },
9
+ ],
10
+ Array [
11
+ Object {
12
+ "payload": Object {
13
+ "message": Object {
14
+ "message": "Trying to cancel step step-id",
15
+ "type": "info",
16
+ },
17
+ },
18
+ "type": "TOASTS_ADD",
19
+ },
20
+ ],
21
+ Array [
22
+ Object {
23
+ "payload": [Error: Network Error],
24
+ "type": "TASK_STEP_CANCEL_FAILURE",
25
+ },
26
+ ],
27
+ Array [
28
+ Object {
29
+ "payload": Object {
30
+ "message": Object {
31
+ "message": "Could not cancel step. Error: step-id undefined",
32
+ "type": "error",
33
+ },
34
+ },
35
+ "type": "TOASTS_ADD",
36
+ },
37
+ ],
38
+ ]
39
+ `;
40
+
41
+ exports[`TaskDetails - Actions should cancelStep and success 1`] = `
42
+ Array [
43
+ Array [
44
+ Object {
45
+ "type": "TASK_STEP_CANCEL_REQUEST",
46
+ },
47
+ ],
48
+ Array [
49
+ Object {
50
+ "payload": Object {
51
+ "message": Object {
52
+ "message": "Trying to cancel step step-id",
53
+ "type": "info",
54
+ },
55
+ },
56
+ "type": "TOASTS_ADD",
57
+ },
58
+ ],
59
+ Array [
60
+ Object {
61
+ "type": "TASK_STEP_CANCEL_SUCCESS",
62
+ },
63
+ ],
64
+ Array [
65
+ Object {
66
+ "payload": Object {
67
+ "message": Object {
68
+ "message": "step-id {__('Step Canceled')}",
69
+ "type": "success",
70
+ },
71
+ },
72
+ "type": "TOASTS_ADD",
73
+ },
74
+ ],
75
+ ]
76
+ `;
77
+
78
+ exports[`TaskDetails - Actions should fetch-task-details and fail 1`] = `
79
+ Array [
80
+ Array [
81
+ Object {
82
+ "type": "FOREMAN_TASK_DETAILS_FETCH_TASK_REQUEST",
83
+ },
84
+ ],
85
+ Array [
86
+ Object {
87
+ "payload": [Error: Network Error],
88
+ "type": "FOREMAN_TASK_DETAILS_FETCH_TASK_FAILURE",
89
+ },
90
+ ],
91
+ ]
92
+ `;
93
+
3
94
  exports[`TaskDetails - Actions should fetch-task-details and success 1`] = `
4
95
  Array [
5
96
  Array [