foreman-tasks 12.2.1 → 12.2.3
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.
- checksums.yaml +4 -4
- data/config/routes.rb +0 -1
- data/lib/foreman_tasks/version.rb +1 -1
- data/webpack/ForemanTasks/Components/TaskDetails/Components/Dependencies.js +69 -58
- data/webpack/ForemanTasks/Components/TaskDetails/Components/Locks.js +170 -43
- data/webpack/ForemanTasks/Components/TaskDetails/Components/RunningSteps.js +152 -44
- data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/Dependencies.test.js +82 -21
- data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/Locks.test.js +256 -23
- data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/RunningSteps.test.js +39 -0
- data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.js +3 -1
- data/webpack/Routes/routes.js +0 -5
- data/webpack/Routes/routes.test.js +0 -18
- metadata +1 -7
- data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/Locks.test.js.snap +0 -116
- data/webpack/ForemanTasks/Routes/ShowTask/ShowTask.js +0 -10
- data/webpack/ForemanTasks/Routes/ShowTask/__tests__/ShowTask.test.js +0 -14
- data/webpack/ForemanTasks/Routes/ShowTask/__tests__/__snapshots__/ShowTask.test.js.snap +0 -12
- data/webpack/ForemanTasks/Routes/ShowTask/index.js +0 -1
- data/webpack/ForemanTasks/Routes/ShowTask/showTask.scss +0 -0
|
@@ -5,16 +5,21 @@ import '@testing-library/jest-dom';
|
|
|
5
5
|
import Dependencies from '../Dependencies';
|
|
6
6
|
|
|
7
7
|
describe('Dependencies', () => {
|
|
8
|
-
it('renders
|
|
8
|
+
it('renders both sections with empty placeholders when there are no tasks', () => {
|
|
9
9
|
render(<Dependencies dependsOn={[]} blocks={[]} />);
|
|
10
|
+
|
|
11
|
+
expect(
|
|
12
|
+
screen.getByRole('heading', { name: /task depends on/i })
|
|
13
|
+
).toBeInTheDocument();
|
|
10
14
|
expect(
|
|
11
|
-
screen.getByRole('heading', { name: /task
|
|
15
|
+
screen.getByRole('heading', { name: /task blocks/i })
|
|
12
16
|
).toBeInTheDocument();
|
|
13
|
-
|
|
14
|
-
expect(
|
|
17
|
+
|
|
18
|
+
expect(screen.getAllByText(/^none$/i)).toHaveLength(2);
|
|
19
|
+
expect(screen.queryByRole('grid')).not.toBeInTheDocument();
|
|
15
20
|
});
|
|
16
21
|
|
|
17
|
-
it('renders
|
|
22
|
+
it('renders depends-on tasks in the first grid', () => {
|
|
18
23
|
const dependsOn = [
|
|
19
24
|
{
|
|
20
25
|
id: '123',
|
|
@@ -31,15 +36,39 @@ describe('Dependencies', () => {
|
|
|
31
36
|
result: 'pending',
|
|
32
37
|
},
|
|
33
38
|
];
|
|
39
|
+
|
|
34
40
|
render(<Dependencies dependsOn={dependsOn} blocks={[]} />);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
expect(
|
|
41
|
+
|
|
42
|
+
const dependsGrid = screen.getByRole('grid', {
|
|
43
|
+
name: /task depends on/i,
|
|
44
|
+
});
|
|
45
|
+
expect(screen.queryAllByRole('grid')).toHaveLength(1);
|
|
46
|
+
|
|
47
|
+
expect(
|
|
48
|
+
within(dependsGrid).getByRole('columnheader', { name: /^name$/i })
|
|
49
|
+
).toBeInTheDocument();
|
|
50
|
+
|
|
51
|
+
const bodyRows = within(dependsGrid)
|
|
52
|
+
.getAllByRole('row')
|
|
53
|
+
.slice(1);
|
|
54
|
+
expect(bodyRows).toHaveLength(2);
|
|
55
|
+
|
|
56
|
+
expect(
|
|
57
|
+
screen.getByRole('link', { name: 'Foo Bar Action' })
|
|
58
|
+
).toHaveAttribute('href', '/foreman_tasks/tasks/123');
|
|
59
|
+
expect(
|
|
60
|
+
screen.getByRole('link', { name: 'Baz Qux Action' })
|
|
61
|
+
).toHaveAttribute('href', '/foreman_tasks/tasks/456');
|
|
62
|
+
|
|
63
|
+
expect(within(dependsGrid).getByText('Stopped')).toBeInTheDocument();
|
|
64
|
+
expect(within(dependsGrid).getByText('Success')).toBeInTheDocument();
|
|
65
|
+
expect(within(dependsGrid).getByText('Running')).toBeInTheDocument();
|
|
66
|
+
expect(within(dependsGrid).getByText('Pending')).toBeInTheDocument();
|
|
67
|
+
|
|
68
|
+
expect(screen.getAllByText(/^none$/i)).toHaveLength(1);
|
|
40
69
|
});
|
|
41
70
|
|
|
42
|
-
it('renders blocks in the second
|
|
71
|
+
it('renders blocks in the second grid', () => {
|
|
43
72
|
const blocks = [
|
|
44
73
|
{
|
|
45
74
|
id: '789',
|
|
@@ -49,14 +78,28 @@ describe('Dependencies', () => {
|
|
|
49
78
|
result: 'warning',
|
|
50
79
|
},
|
|
51
80
|
];
|
|
81
|
+
|
|
52
82
|
render(<Dependencies dependsOn={[]} blocks={blocks} />);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
expect(
|
|
56
|
-
|
|
83
|
+
|
|
84
|
+
const blocksGrid = screen.getByRole('grid', { name: /task blocks/i });
|
|
85
|
+
expect(screen.queryAllByRole('grid')).toHaveLength(1);
|
|
86
|
+
|
|
87
|
+
const bodyRows = within(blocksGrid)
|
|
88
|
+
.getAllByRole('row')
|
|
89
|
+
.slice(1);
|
|
90
|
+
expect(bodyRows).toHaveLength(1);
|
|
91
|
+
|
|
92
|
+
expect(screen.getByRole('link', { name: 'Test Action' })).toHaveAttribute(
|
|
93
|
+
'href',
|
|
94
|
+
'/foreman_tasks/tasks/789'
|
|
95
|
+
);
|
|
96
|
+
expect(within(blocksGrid).getByText('Paused')).toBeInTheDocument();
|
|
97
|
+
expect(within(blocksGrid).getByText('Warning')).toBeInTheDocument();
|
|
98
|
+
|
|
99
|
+
expect(screen.getAllByText(/^none$/i)).toHaveLength(1);
|
|
57
100
|
});
|
|
58
101
|
|
|
59
|
-
it('renders both
|
|
102
|
+
it('renders both grids when dependsOn and blocks are present', () => {
|
|
60
103
|
const dependsOn = [
|
|
61
104
|
{
|
|
62
105
|
id: '123',
|
|
@@ -82,11 +125,29 @@ describe('Dependencies', () => {
|
|
|
82
125
|
result: 'error',
|
|
83
126
|
},
|
|
84
127
|
];
|
|
128
|
+
|
|
85
129
|
render(<Dependencies dependsOn={dependsOn} blocks={blocks} />);
|
|
86
|
-
|
|
87
|
-
expect(
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
expect(
|
|
130
|
+
|
|
131
|
+
expect(
|
|
132
|
+
screen.getByRole('grid', { name: /task depends on/i })
|
|
133
|
+
).toBeInTheDocument();
|
|
134
|
+
expect(
|
|
135
|
+
screen.getByRole('grid', { name: /task blocks/i })
|
|
136
|
+
).toBeInTheDocument();
|
|
137
|
+
|
|
138
|
+
expect(screen.getByRole('link', { name: 'Foo Action' })).toHaveAttribute(
|
|
139
|
+
'href',
|
|
140
|
+
'/foreman_tasks/tasks/123'
|
|
141
|
+
);
|
|
142
|
+
expect(screen.getByRole('link', { name: 'Bar Action' })).toHaveAttribute(
|
|
143
|
+
'href',
|
|
144
|
+
'/foreman_tasks/tasks/456'
|
|
145
|
+
);
|
|
146
|
+
expect(screen.getByRole('link', { name: 'Baz Action' })).toHaveAttribute(
|
|
147
|
+
'href',
|
|
148
|
+
'/foreman_tasks/tasks/789'
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
expect(screen.queryByText(/^none$/i)).not.toBeInTheDocument();
|
|
91
152
|
});
|
|
92
153
|
});
|
|
@@ -1,28 +1,261 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import '@testing-library/jest-dom';
|
|
2
4
|
|
|
3
5
|
import Locks from '../Locks';
|
|
4
6
|
|
|
5
|
-
const fixtures = {
|
|
6
|
-
'render without Props': {},
|
|
7
|
-
'render with Props': {
|
|
8
|
-
locks: [
|
|
9
|
-
{
|
|
10
|
-
name: 'task_owner',
|
|
11
|
-
exclusive: false,
|
|
12
|
-
resource_type: 'User',
|
|
13
|
-
resource_id: 4,
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
name: 'task_owner2',
|
|
17
|
-
exclusive: false,
|
|
18
|
-
resource_type: 'User',
|
|
19
|
-
resource_id: 2,
|
|
20
|
-
},
|
|
21
|
-
],
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
|
|
25
7
|
describe('Locks', () => {
|
|
26
|
-
|
|
27
|
-
|
|
8
|
+
it('renders empty state when there are no locks', () => {
|
|
9
|
+
const { container } = render(<Locks locks={[]} />);
|
|
10
|
+
expect(
|
|
11
|
+
screen.getByRole('heading', { name: /no resources/i })
|
|
12
|
+
).toBeInTheDocument();
|
|
13
|
+
expect(
|
|
14
|
+
screen.getByText(
|
|
15
|
+
/no resources currently associated with this task/i
|
|
16
|
+
)
|
|
17
|
+
).toBeInTheDocument();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('renders non-exclusive section with rows when there are only non-exclusive locks', () => {
|
|
21
|
+
render(
|
|
22
|
+
<Locks
|
|
23
|
+
locks={[
|
|
24
|
+
{
|
|
25
|
+
name: 'task_owner',
|
|
26
|
+
exclusive: false,
|
|
27
|
+
resource_type: 'User',
|
|
28
|
+
resource_id: 4,
|
|
29
|
+
link: null,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'task_owner2',
|
|
33
|
+
exclusive: false,
|
|
34
|
+
resource_type: 'User',
|
|
35
|
+
resource_id: 2,
|
|
36
|
+
link: null,
|
|
37
|
+
},
|
|
38
|
+
]}
|
|
39
|
+
/>
|
|
40
|
+
);
|
|
41
|
+
expect(
|
|
42
|
+
screen.getByRole('heading', { name: 'Non-exclusive resources' })
|
|
43
|
+
).toBeInTheDocument();
|
|
44
|
+
expect(
|
|
45
|
+
screen.getByText(
|
|
46
|
+
/other tasks can access the resource simultaneously/i
|
|
47
|
+
)
|
|
48
|
+
).toBeInTheDocument();
|
|
49
|
+
expect(screen.getAllByText('User')).toHaveLength(2);
|
|
50
|
+
expect(screen.getByText('id: 4')).toBeInTheDocument();
|
|
51
|
+
expect(screen.getByText('id: 2')).toBeInTheDocument();
|
|
52
|
+
expect(
|
|
53
|
+
screen.queryByRole('heading', { name: 'Exclusive resources' })
|
|
54
|
+
).not.toBeInTheDocument();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('renders exclusive section when there are only exclusive locks', () => {
|
|
58
|
+
render(
|
|
59
|
+
<Locks
|
|
60
|
+
locks={[
|
|
61
|
+
{
|
|
62
|
+
name: 'host_lock',
|
|
63
|
+
exclusive: true,
|
|
64
|
+
resource_type: 'Host',
|
|
65
|
+
resource_id: 1,
|
|
66
|
+
link: '/hosts/1',
|
|
67
|
+
},
|
|
68
|
+
]}
|
|
69
|
+
/>
|
|
70
|
+
);
|
|
71
|
+
expect(
|
|
72
|
+
screen.getByRole('heading', { name: 'Exclusive resources' })
|
|
73
|
+
).toBeInTheDocument();
|
|
74
|
+
expect(
|
|
75
|
+
screen.getByText(
|
|
76
|
+
/only this task can access the resource/i
|
|
77
|
+
)
|
|
78
|
+
).toBeInTheDocument();
|
|
79
|
+
expect(screen.getByRole('link', { name: 'Host' })).toHaveAttribute(
|
|
80
|
+
'href',
|
|
81
|
+
'/hosts/1'
|
|
82
|
+
);
|
|
83
|
+
expect(screen.getByText('id: 1')).toBeInTheDocument();
|
|
84
|
+
expect(
|
|
85
|
+
screen.queryByRole('heading', { name: 'Non-exclusive resources' })
|
|
86
|
+
).not.toBeInTheDocument();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('renders both sections when locks are mixed', () => {
|
|
90
|
+
render(
|
|
91
|
+
<Locks
|
|
92
|
+
locks={[
|
|
93
|
+
{
|
|
94
|
+
name: 'a',
|
|
95
|
+
exclusive: false,
|
|
96
|
+
resource_type: 'Smart proxy',
|
|
97
|
+
resource_id: 7,
|
|
98
|
+
link: null,
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: 'b',
|
|
102
|
+
exclusive: true,
|
|
103
|
+
resource_type: 'Host managed',
|
|
104
|
+
resource_id: 1,
|
|
105
|
+
link: null,
|
|
106
|
+
},
|
|
107
|
+
]}
|
|
108
|
+
/>
|
|
109
|
+
);
|
|
110
|
+
expect(
|
|
111
|
+
screen.getByRole('heading', { name: 'Non-exclusive resources' })
|
|
112
|
+
).toBeInTheDocument();
|
|
113
|
+
expect(
|
|
114
|
+
screen.getByRole('heading', { name: 'Exclusive resources' })
|
|
115
|
+
).toBeInTheDocument();
|
|
116
|
+
expect(
|
|
117
|
+
screen.getByText(
|
|
118
|
+
/other tasks can access the resource simultaneously/i
|
|
119
|
+
)
|
|
120
|
+
).toBeInTheDocument();
|
|
121
|
+
expect(
|
|
122
|
+
screen.getByText(/only this task can access the resource/i)
|
|
123
|
+
).toBeInTheDocument();
|
|
124
|
+
expect(screen.getByText('Smart proxy')).toBeInTheDocument();
|
|
125
|
+
expect(screen.getByText('Host managed')).toBeInTheDocument();
|
|
126
|
+
expect(screen.getByText('id: 7')).toBeInTheDocument();
|
|
127
|
+
expect(screen.getByText('id: 1')).toBeInTheDocument();
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('renders a link for non-exclusive locks when lock.link is set', () => {
|
|
131
|
+
render(
|
|
132
|
+
<Locks
|
|
133
|
+
locks={[
|
|
134
|
+
{
|
|
135
|
+
name: 'proxy',
|
|
136
|
+
exclusive: false,
|
|
137
|
+
resource_type: 'Smart proxy',
|
|
138
|
+
resource_id: 7,
|
|
139
|
+
link: '/smart_proxies/7',
|
|
140
|
+
},
|
|
141
|
+
]}
|
|
142
|
+
/>
|
|
143
|
+
);
|
|
144
|
+
const link = screen.getByRole('link', { name: 'Smart proxy' });
|
|
145
|
+
expect(link).toHaveAttribute('href', '/smart_proxies/7');
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('formats string resource_id values in the row label', () => {
|
|
149
|
+
render(
|
|
150
|
+
<Locks
|
|
151
|
+
locks={[
|
|
152
|
+
{
|
|
153
|
+
name: 'x',
|
|
154
|
+
exclusive: false,
|
|
155
|
+
resource_type: 'Custom',
|
|
156
|
+
resource_id: 'uuid-abc',
|
|
157
|
+
link: null,
|
|
158
|
+
},
|
|
159
|
+
]}
|
|
160
|
+
/>
|
|
161
|
+
);
|
|
162
|
+
expect(screen.getByText('id: uuid-abc')).toBeInTheDocument();
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('sets ouia ids on populated container, tables, rows, and resource links', () => {
|
|
166
|
+
const { container } = render(
|
|
167
|
+
<Locks
|
|
168
|
+
locks={[
|
|
169
|
+
{
|
|
170
|
+
name: 'ne',
|
|
171
|
+
exclusive: false,
|
|
172
|
+
resource_type: 'A',
|
|
173
|
+
resource_id: 1,
|
|
174
|
+
link: '/non-exclusive/1',
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
name: 'ex',
|
|
178
|
+
exclusive: true,
|
|
179
|
+
resource_type: 'B',
|
|
180
|
+
resource_id: 2,
|
|
181
|
+
link: '/exclusive/2',
|
|
182
|
+
},
|
|
183
|
+
]}
|
|
184
|
+
/>
|
|
185
|
+
);
|
|
186
|
+
expect(
|
|
187
|
+
container.querySelector('[data-ouia-component-id="task-locks-populated"]')
|
|
188
|
+
).toBeInTheDocument();
|
|
189
|
+
expect(
|
|
190
|
+
container.querySelector(
|
|
191
|
+
'[data-ouia-component-id="task-locks-non-exclusive-table"]'
|
|
192
|
+
)
|
|
193
|
+
).toBeInTheDocument();
|
|
194
|
+
expect(
|
|
195
|
+
container.querySelector(
|
|
196
|
+
'[data-ouia-component-id="task-locks-exclusive-table"]'
|
|
197
|
+
)
|
|
198
|
+
).toBeInTheDocument();
|
|
199
|
+
expect(
|
|
200
|
+
container.querySelector(
|
|
201
|
+
'[data-ouia-component-id="task-locks-non-exclusive-row-0"]'
|
|
202
|
+
)
|
|
203
|
+
).toBeInTheDocument();
|
|
204
|
+
expect(
|
|
205
|
+
container.querySelector(
|
|
206
|
+
'[data-ouia-component-id="task-locks-exclusive-row-0"]'
|
|
207
|
+
)
|
|
208
|
+
).toBeInTheDocument();
|
|
209
|
+
expect(
|
|
210
|
+
container.querySelector(
|
|
211
|
+
'[data-ouia-component-id="task-locks-non-exclusive-resource-type-link-0"]'
|
|
212
|
+
)
|
|
213
|
+
).toBeInTheDocument();
|
|
214
|
+
expect(
|
|
215
|
+
container.querySelector(
|
|
216
|
+
'[data-ouia-component-id="task-locks-exclusive-resource-type-link-0"]'
|
|
217
|
+
)
|
|
218
|
+
).toBeInTheDocument();
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it('does not render resource_type as a link when lock.link is absent', () => {
|
|
222
|
+
render(
|
|
223
|
+
<Locks
|
|
224
|
+
locks={[
|
|
225
|
+
{
|
|
226
|
+
name: 'ex',
|
|
227
|
+
exclusive: true,
|
|
228
|
+
resource_type: 'Host managed',
|
|
229
|
+
resource_id: 1,
|
|
230
|
+
link: null,
|
|
231
|
+
},
|
|
232
|
+
]}
|
|
233
|
+
/>
|
|
234
|
+
);
|
|
235
|
+
expect(
|
|
236
|
+
screen.queryByRole('link', { name: 'Host managed' })
|
|
237
|
+
).not.toBeInTheDocument();
|
|
238
|
+
expect(screen.getByText('Host managed')).toBeInTheDocument();
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it('does not set resource-type link ouia id when lock.link is absent', () => {
|
|
242
|
+
const { container } = render(
|
|
243
|
+
<Locks
|
|
244
|
+
locks={[
|
|
245
|
+
{
|
|
246
|
+
name: 'ne',
|
|
247
|
+
exclusive: false,
|
|
248
|
+
resource_type: 'Thing',
|
|
249
|
+
resource_id: 1,
|
|
250
|
+
link: null,
|
|
251
|
+
},
|
|
252
|
+
]}
|
|
253
|
+
/>
|
|
254
|
+
);
|
|
255
|
+
expect(
|
|
256
|
+
container.querySelector(
|
|
257
|
+
'[data-ouia-component-id="task-locks-non-exclusive-resource-type-link-0"]'
|
|
258
|
+
)
|
|
259
|
+
).not.toBeInTheDocument();
|
|
260
|
+
});
|
|
28
261
|
});
|
|
@@ -27,6 +27,45 @@ describe('RunningSteps', () => {
|
|
|
27
27
|
expect(screen.getByText(/no running steps/i)).toBeInTheDocument();
|
|
28
28
|
});
|
|
29
29
|
|
|
30
|
+
it('shows suspended warning when plan is running, result pending, no steps', () => {
|
|
31
|
+
render(
|
|
32
|
+
<RunningSteps
|
|
33
|
+
{...baseProps}
|
|
34
|
+
runningSteps={[]}
|
|
35
|
+
executionPlan={{ state: 'running', cancellable: false }}
|
|
36
|
+
result="pending"
|
|
37
|
+
/>
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
expect(
|
|
41
|
+
screen.getByRole('heading', {
|
|
42
|
+
level: 4,
|
|
43
|
+
name: /temporarily suspended step/i,
|
|
44
|
+
})
|
|
45
|
+
).toBeInTheDocument();
|
|
46
|
+
expect(
|
|
47
|
+
screen.getByText(/the task is still being processed/i)
|
|
48
|
+
).toBeInTheDocument();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('shows planned empty state when plan is planned, result pending, no steps', () => {
|
|
52
|
+
render(
|
|
53
|
+
<RunningSteps
|
|
54
|
+
{...baseProps}
|
|
55
|
+
runningSteps={[]}
|
|
56
|
+
executionPlan={{ state: 'planned', cancellable: false }}
|
|
57
|
+
result="pending"
|
|
58
|
+
/>
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
expect(
|
|
62
|
+
screen.getByRole('heading', { level: 2, name: /planned task/i })
|
|
63
|
+
).toBeInTheDocument();
|
|
64
|
+
expect(
|
|
65
|
+
screen.getByText(/the task has not started yet/i)
|
|
66
|
+
).toBeInTheDocument();
|
|
67
|
+
});
|
|
68
|
+
|
|
30
69
|
it('renders running step fields and Cancel when step is cancellable', () => {
|
|
31
70
|
const cancelStep = jest.fn();
|
|
32
71
|
render(
|
|
@@ -30,7 +30,7 @@ const TaskDetails = ({
|
|
|
30
30
|
...props
|
|
31
31
|
}) => {
|
|
32
32
|
const id = getTaskID();
|
|
33
|
-
const { taskReload, status, isLoading } = props;
|
|
33
|
+
const { taskReload, status, isLoading, result } = props;
|
|
34
34
|
const [activeTabKey, setActiveTabKey] = useState(1);
|
|
35
35
|
|
|
36
36
|
useEffect(() => {
|
|
@@ -96,6 +96,8 @@ const TaskDetails = ({
|
|
|
96
96
|
ouiaId="task-details-tab-running-steps"
|
|
97
97
|
>
|
|
98
98
|
<RunningSteps
|
|
99
|
+
executionPlan={executionPlan}
|
|
100
|
+
result={result}
|
|
99
101
|
runningSteps={runningSteps}
|
|
100
102
|
id={id}
|
|
101
103
|
cancelStep={cancelStep}
|
data/webpack/Routes/routes.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import TasksTableIndexPage from '../ForemanTasks/Components/TasksTable/TasksIndexPage';
|
|
3
|
-
import ShowTask from '../ForemanTasks/Routes/ShowTask/ShowTask';
|
|
4
3
|
|
|
5
4
|
const ForemanTasksRoutes = [
|
|
6
5
|
{
|
|
@@ -13,10 +12,6 @@ const ForemanTasksRoutes = [
|
|
|
13
12
|
exact: true,
|
|
14
13
|
render: props => <TasksTableIndexPage {...props} />,
|
|
15
14
|
},
|
|
16
|
-
{
|
|
17
|
-
path: '/foreman_tasks/ex_tasks/:id',
|
|
18
|
-
render: props => <ShowTask {...props} />,
|
|
19
|
-
},
|
|
20
15
|
];
|
|
21
16
|
|
|
22
17
|
export default ForemanTasksRoutes;
|
|
@@ -12,14 +12,6 @@ jest.mock(
|
|
|
12
12
|
}
|
|
13
13
|
);
|
|
14
14
|
|
|
15
|
-
jest.mock(
|
|
16
|
-
'../ForemanTasks/Routes/ShowTask/ShowTask',
|
|
17
|
-
() =>
|
|
18
|
-
function ShowTaskStub() {
|
|
19
|
-
return <div data-testid="show-task-stub" />;
|
|
20
|
-
}
|
|
21
|
-
);
|
|
22
|
-
|
|
23
15
|
const routerProps = {
|
|
24
16
|
history: { push: jest.fn(), replace: jest.fn(), go: jest.fn() },
|
|
25
17
|
location: {
|
|
@@ -43,7 +35,6 @@ describe('ForemanTasks routes', () => {
|
|
|
43
35
|
).toEqual([
|
|
44
36
|
{ path: '/foreman_tasks/tasks', exact: true },
|
|
45
37
|
{ path: '/foreman_tasks/tasks/:id/sub_tasks', exact: true },
|
|
46
|
-
{ path: '/foreman_tasks/ex_tasks/:id', exact: undefined },
|
|
47
38
|
]);
|
|
48
39
|
});
|
|
49
40
|
|
|
@@ -67,15 +58,6 @@ describe('ForemanTasks routes', () => {
|
|
|
67
58
|
url: '/foreman_tasks/tasks/7/sub_tasks',
|
|
68
59
|
},
|
|
69
60
|
},
|
|
70
|
-
{
|
|
71
|
-
...routerProps,
|
|
72
|
-
match: {
|
|
73
|
-
...routerProps.match,
|
|
74
|
-
params: { id: '42' },
|
|
75
|
-
path: '/foreman_tasks/ex_tasks/:id',
|
|
76
|
-
url: '/foreman_tasks/ex_tasks/42',
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
61
|
];
|
|
80
62
|
|
|
81
63
|
ForemanTasksRoutes.forEach((route, index) => {
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: foreman-tasks
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 12.2.
|
|
4
|
+
version: 12.2.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ivan Nečas
|
|
@@ -389,7 +389,6 @@ files:
|
|
|
389
389
|
- webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskButtons.test.js
|
|
390
390
|
- webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskHelper.test.js
|
|
391
391
|
- webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskInfo.test.js
|
|
392
|
-
- webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/Locks.test.js.snap
|
|
393
392
|
- webpack/ForemanTasks/Components/TaskDetails/TaskDetails.js
|
|
394
393
|
- webpack/ForemanTasks/Components/TaskDetails/TaskDetails.scss
|
|
395
394
|
- webpack/ForemanTasks/Components/TaskDetails/TaskDetailsActions.js
|
|
@@ -479,11 +478,6 @@ files:
|
|
|
479
478
|
- webpack/ForemanTasks/Components/common/urlHelpers.js
|
|
480
479
|
- webpack/ForemanTasks/ForemanTasksReducers.js
|
|
481
480
|
- webpack/ForemanTasks/ForemanTasksSelectors.js
|
|
482
|
-
- webpack/ForemanTasks/Routes/ShowTask/ShowTask.js
|
|
483
|
-
- webpack/ForemanTasks/Routes/ShowTask/__tests__/ShowTask.test.js
|
|
484
|
-
- webpack/ForemanTasks/Routes/ShowTask/__tests__/__snapshots__/ShowTask.test.js.snap
|
|
485
|
-
- webpack/ForemanTasks/Routes/ShowTask/index.js
|
|
486
|
-
- webpack/ForemanTasks/Routes/ShowTask/showTask.scss
|
|
487
481
|
- webpack/Routes/routes.js
|
|
488
482
|
- webpack/Routes/routes.test.js
|
|
489
483
|
- webpack/global_index.js
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
-
|
|
3
|
-
exports[`Locks rendering render with Props 1`] = `
|
|
4
|
-
<div>
|
|
5
|
-
<Alert
|
|
6
|
-
className=""
|
|
7
|
-
onDismiss={null}
|
|
8
|
-
type="info"
|
|
9
|
-
>
|
|
10
|
-
You can find resource locks on this page. Exclusive lock marked with locked icon means that no other task can use locked resource while this task is running. Non-exclusive lock marked with unlocked icon means other tasks can access the resource freely, it is only used to indicate the relation of this task with the resource
|
|
11
|
-
</Alert>
|
|
12
|
-
<CardGrid
|
|
13
|
-
className=""
|
|
14
|
-
matchHeight={false}
|
|
15
|
-
>
|
|
16
|
-
<Row
|
|
17
|
-
bsClass="row"
|
|
18
|
-
componentClass="div"
|
|
19
|
-
>
|
|
20
|
-
<Col
|
|
21
|
-
bsClass="col"
|
|
22
|
-
componentClass="div"
|
|
23
|
-
key="0"
|
|
24
|
-
md={4}
|
|
25
|
-
sm={4}
|
|
26
|
-
xs={6}
|
|
27
|
-
>
|
|
28
|
-
<ConditionalLink
|
|
29
|
-
link={null}
|
|
30
|
-
>
|
|
31
|
-
<Card
|
|
32
|
-
accented={true}
|
|
33
|
-
aggregated={false}
|
|
34
|
-
aggregatedMini={false}
|
|
35
|
-
cardRef={null}
|
|
36
|
-
className="card-pf-aggregate-status"
|
|
37
|
-
matchHeight={false}
|
|
38
|
-
>
|
|
39
|
-
<CardTitle
|
|
40
|
-
className=""
|
|
41
|
-
>
|
|
42
|
-
<span
|
|
43
|
-
className="fa fa-unlock-alt"
|
|
44
|
-
/>
|
|
45
|
-
User
|
|
46
|
-
</CardTitle>
|
|
47
|
-
<CardBody
|
|
48
|
-
className=""
|
|
49
|
-
>
|
|
50
|
-
id:4
|
|
51
|
-
<br />
|
|
52
|
-
</CardBody>
|
|
53
|
-
</Card>
|
|
54
|
-
</ConditionalLink>
|
|
55
|
-
</Col>
|
|
56
|
-
<Col
|
|
57
|
-
bsClass="col"
|
|
58
|
-
componentClass="div"
|
|
59
|
-
key="1"
|
|
60
|
-
md={4}
|
|
61
|
-
sm={4}
|
|
62
|
-
xs={6}
|
|
63
|
-
>
|
|
64
|
-
<ConditionalLink
|
|
65
|
-
link={null}
|
|
66
|
-
>
|
|
67
|
-
<Card
|
|
68
|
-
accented={true}
|
|
69
|
-
aggregated={false}
|
|
70
|
-
aggregatedMini={false}
|
|
71
|
-
cardRef={null}
|
|
72
|
-
className="card-pf-aggregate-status"
|
|
73
|
-
matchHeight={false}
|
|
74
|
-
>
|
|
75
|
-
<CardTitle
|
|
76
|
-
className=""
|
|
77
|
-
>
|
|
78
|
-
<span
|
|
79
|
-
className="fa fa-unlock-alt"
|
|
80
|
-
/>
|
|
81
|
-
User
|
|
82
|
-
</CardTitle>
|
|
83
|
-
<CardBody
|
|
84
|
-
className=""
|
|
85
|
-
>
|
|
86
|
-
id:2
|
|
87
|
-
<br />
|
|
88
|
-
</CardBody>
|
|
89
|
-
</Card>
|
|
90
|
-
</ConditionalLink>
|
|
91
|
-
</Col>
|
|
92
|
-
</Row>
|
|
93
|
-
</CardGrid>
|
|
94
|
-
</div>
|
|
95
|
-
`;
|
|
96
|
-
|
|
97
|
-
exports[`Locks rendering render without Props 1`] = `
|
|
98
|
-
<div>
|
|
99
|
-
<Alert
|
|
100
|
-
className=""
|
|
101
|
-
onDismiss={null}
|
|
102
|
-
type="info"
|
|
103
|
-
>
|
|
104
|
-
You can find resource locks on this page. Exclusive lock marked with locked icon means that no other task can use locked resource while this task is running. Non-exclusive lock marked with unlocked icon means other tasks can access the resource freely, it is only used to indicate the relation of this task with the resource
|
|
105
|
-
</Alert>
|
|
106
|
-
<CardGrid
|
|
107
|
-
className=""
|
|
108
|
-
matchHeight={false}
|
|
109
|
-
>
|
|
110
|
-
<Row
|
|
111
|
-
bsClass="row"
|
|
112
|
-
componentClass="div"
|
|
113
|
-
/>
|
|
114
|
-
</CardGrid>
|
|
115
|
-
</div>
|
|
116
|
-
`;
|