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.
@@ -5,16 +5,21 @@ import '@testing-library/jest-dom';
5
5
  import Dependencies from '../Dependencies';
6
6
 
7
7
  describe('Dependencies', () => {
8
- it('renders info alert and None for both tables when there are no tasks', () => {
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 dependencies/i })
15
+ screen.getByRole('heading', { name: /task blocks/i })
12
16
  ).toBeInTheDocument();
13
- const noneLabels = screen.getAllByText(/^none$/i);
14
- expect(noneLabels.length).toBeGreaterThanOrEqual(2);
17
+
18
+ expect(screen.getAllByText(/^none$/i)).toHaveLength(2);
19
+ expect(screen.queryByRole('grid')).not.toBeInTheDocument();
15
20
  });
16
21
 
17
- it('renders depends_on tasks in the first table', () => {
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
- const table = screen.getByRole('grid', { name: /depends on/i });
36
- expect(within(table).getByText('Foo Bar Action')).toBeInTheDocument();
37
- expect(within(table).getByText('Baz Qux Action')).toBeInTheDocument();
38
- expect(within(table).getByText('stopped')).toBeInTheDocument();
39
- expect(within(table).getByText('success')).toBeInTheDocument();
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 table', () => {
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
- const table = screen.getByRole('grid', { name: /^blocks$/i });
54
- expect(within(table).getByText('Test Action')).toBeInTheDocument();
55
- expect(within(table).getByText('paused')).toBeInTheDocument();
56
- expect(within(table).getByText('warning')).toBeInTheDocument();
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 tables when dependsOn and blocks are present', () => {
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
- expect(screen.getByRole('grid', { name: /depends on/i })).toBeInTheDocument();
87
- expect(screen.getByText('Foo Action')).toBeInTheDocument();
88
- expect(screen.getByRole('grid', { name: /^blocks$/i })).toBeInTheDocument();
89
- expect(screen.getByText('Bar Action')).toBeInTheDocument();
90
- expect(screen.getByText('Baz Action')).toBeInTheDocument();
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 { testComponentSnapshotsWithFixtures } from '@theforeman/test';
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
- describe('rendering', () =>
27
- testComponentSnapshotsWithFixtures(Locks, fixtures));
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}
@@ -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.1
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
- `;