foreman-tasks 1.1.2 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) 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/task.rb +4 -0
  8. data/app/models/foreman_tasks/task/dynflow_task.rb +3 -1
  9. data/app/models/setting/foreman_tasks.rb +1 -1
  10. data/app/services/ui_notifications/tasks/task_bulk_stop.rb +36 -0
  11. data/app/views/foreman_tasks/api/tasks/details.json.rabl +0 -1
  12. data/app/views/foreman_tasks/api/tasks/show.json.rabl +2 -0
  13. data/config/routes.rb +1 -0
  14. data/db/migrate/20200517215015_rename_bookmarks_controller.rb +35 -0
  15. data/db/migrate/20200519093217_drop_dynflow_allow_dangerous_actions_setting.foreman_tasks.rb +5 -0
  16. data/db/migrate/20200611090846_add_task_lock_index_on_resource_type_and_task_id.rb +3 -3
  17. data/db/seeds.d/30-notification_blueprints.rb +7 -0
  18. data/lib/foreman_tasks/engine.rb +2 -7
  19. data/lib/foreman_tasks/version.rb +1 -1
  20. data/locale/action_names.rb +1 -1
  21. data/locale/en/LC_MESSAGES/foreman_tasks.mo +0 -0
  22. data/locale/en/foreman_tasks.po +270 -54
  23. data/locale/foreman_tasks.pot +630 -292
  24. data/locale/fr/LC_MESSAGES/foreman_tasks.mo +0 -0
  25. data/locale/fr/foreman_tasks.po +817 -0
  26. data/locale/ja/LC_MESSAGES/foreman_tasks.mo +0 -0
  27. data/locale/ja/foreman_tasks.po +817 -0
  28. data/locale/zh_CN/LC_MESSAGES/foreman_tasks.mo +0 -0
  29. data/locale/zh_CN/foreman_tasks.po +816 -0
  30. data/package.json +1 -0
  31. data/script/npm_link_foreman_js.sh +26 -0
  32. data/webpack/ForemanTasks/Components/TaskActions/TaskAction.test.js +60 -0
  33. data/webpack/ForemanTasks/Components/{TasksTable/TasksTableActionHelpers.js → TaskActions/TaskActionHelpers.js} +21 -6
  34. data/webpack/ForemanTasks/Components/{TasksTable/__tests__/TasksTableActionHelpers.test.js → TaskActions/TaskActionHelpers.test.js} +2 -2
  35. data/webpack/ForemanTasks/Components/TaskActions/TaskActionsConstants.js +16 -0
  36. data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.js +60 -0
  37. data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.test.js +14 -0
  38. data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/TaskAction.test.js.snap +233 -0
  39. data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/UnlockModals.test.js.snap +25 -0
  40. data/webpack/ForemanTasks/Components/TaskActions/index.js +115 -0
  41. data/webpack/ForemanTasks/Components/TaskDetails/Components/RunningSteps.js +17 -3
  42. data/webpack/ForemanTasks/Components/TaskDetails/Components/Task.js +149 -167
  43. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/RunningSteps.test.js +8 -1
  44. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/Task.test.js +68 -3
  45. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskInfo.test.js +0 -1
  46. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/RunningSteps.test.js.snap +1 -1
  47. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/Task.test.js.snap +124 -76
  48. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.js +35 -5
  49. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.scss +3 -14
  50. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsActions.js +40 -16
  51. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsConstants.js +3 -4
  52. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsReducer.js +0 -6
  53. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsSelectors.js +4 -10
  54. data/webpack/ForemanTasks/Components/TaskDetails/TasksDetailsHelper.js +6 -1
  55. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.fixtures.js +8 -0
  56. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.test.js +7 -1
  57. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetailsActions.test.js +18 -2
  58. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetails.test.js.snap +30 -13
  59. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetailsActions.test.js.snap +91 -0
  60. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/integration.test.js +13 -4
  61. data/webpack/ForemanTasks/Components/TaskDetails/index.js +6 -8
  62. data/webpack/ForemanTasks/Components/TasksDashboard/TasksDashboardActions.js +1 -1
  63. data/webpack/ForemanTasks/Components/TasksDashboard/__tests__/TasksDashboardActions.test.js +2 -2
  64. data/webpack/ForemanTasks/Components/TasksTable/Components/ActionSelectButton.js +14 -1
  65. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModal.js +83 -0
  66. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalActions.js +106 -0
  67. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalReducer.js +38 -0
  68. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalSelectors.js +46 -0
  69. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModal.test.js +36 -0
  70. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalActions.test.js +205 -0
  71. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalReducer.test.js +27 -0
  72. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalSelectors.test.js +55 -0
  73. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModal.test.js.snap +41 -0
  74. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalReducer.test.js.snap +19 -0
  75. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalSelectors.test.js.snap +32 -0
  76. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/index.js +29 -0
  77. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ActionSelectButton.test.js +1 -0
  78. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ActionSelectButton.test.js.snap +11 -0
  79. data/webpack/ForemanTasks/Components/TasksTable/TasksBulkActions.js +135 -35
  80. data/webpack/ForemanTasks/Components/TasksTable/TasksTable.js +13 -9
  81. data/webpack/ForemanTasks/Components/TasksTable/TasksTableActions.js +26 -66
  82. data/webpack/ForemanTasks/Components/TasksTable/TasksTableConstants.js +10 -12
  83. data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +30 -96
  84. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSchema.js +2 -2
  85. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSelectors.js +8 -4
  86. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksBulkActions.test.js +50 -2
  87. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTable.fixtures.js +3 -12
  88. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableActions.test.js +22 -26
  89. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTablePage.test.js +2 -1
  90. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/SubTasksPage.test.js.snap +3 -14
  91. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksBulkActions.test.js.snap +155 -0
  92. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksIndexPage.test.js.snap +3 -14
  93. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTableActions.test.js.snap +17 -124
  94. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +63 -133
  95. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/actionCellFormatter.test.js.snap +1 -0
  96. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/selectionCellFormatter.test.js.snap +2 -0
  97. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/actionCellFormatter.test.js +1 -1
  98. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/selectionCellFormatter.test.js +1 -1
  99. data/webpack/ForemanTasks/Components/TasksTable/formatters/actionCellFormatter.js +10 -7
  100. data/webpack/ForemanTasks/Components/TasksTable/formatters/selectionCellFormatter.js +7 -0
  101. data/webpack/ForemanTasks/Components/TasksTable/index.js +2 -2
  102. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.js +55 -19
  103. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.test.js +75 -19
  104. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ActionButton.test.js.snap +88 -21
  105. data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.scss +9 -0
  106. data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.test.js +44 -0
  107. data/webpack/ForemanTasks/Components/common/ClickConfirmation/__snapshots__/ClickConfirmation.test.js.snap +52 -0
  108. data/webpack/ForemanTasks/Components/common/ClickConfirmation/index.js +59 -66
  109. data/webpack/ForemanTasks/Components/common/{ToastTypesConstants.js → ToastsHelpers/ToastTypesConstants.js} +0 -0
  110. data/webpack/ForemanTasks/Components/common/ToastsHelpers/index.js +15 -0
  111. data/webpack/ForemanTasks/ForemanTasksReducers.js +2 -0
  112. data/webpack/ForemanTasks/Routes/ForemanTasksRoutes.test.js +2 -1
  113. data/webpack/__mocks__/foremanReact/components/ForemanModal/ForemanModalHooks.js +2 -2
  114. data/webpack/__mocks__/foremanReact/components/ForemanModal/index.js +17 -3
  115. data/webpack/__mocks__/foremanReact/components/common/ActionButtons/ActionButtons.js +3 -0
  116. data/webpack/__mocks__/foremanReact/{API.js → redux/API.js} +1 -1
  117. metadata +41 -21
  118. data/webpack/ForemanTasks/Components/TasksTable/Components/CancelConfirm.js +0 -53
  119. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmationModals.js +0 -56
  120. data/webpack/ForemanTasks/Components/TasksTable/Components/ResumeConfirm.js +0 -52
  121. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/CancelConfirm.test.js +0 -26
  122. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ConfirmationModals.test.js +0 -24
  123. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ResumeConfirm.test.js +0 -26
  124. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/CancelConfirm.test.js.snap +0 -65
  125. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ConfirmationModals.test.js.snap +0 -30
  126. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ResumeConfirm.test.js.snap +0 -63
  127. data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.js +0 -23
  128. data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.test.js +0 -26
  129. data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.js +0 -23
  130. data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.test.js +0 -27
  131. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/CancelButton.test.js.snap +0 -15
  132. 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 [